发现、映射并分析您组织的互联网暴露攻击面
## 目录
- [概述](#overview)
- [核心功能](#key-features)
- [架构](#architecture)
- [14 步流水线](#14-step-pipeline)
- [项目结构](#project-structure)
- [快速入门](#getting-started)
- [前置条件](#prerequisites)
- [安装说明](#installation)
- [快速开始](#quick-start)
- [用法](#usage)
- [基础扫描](#basic-scanning)
- [高级选项](#advanced-options)
- [REST API 与仪表盘](#rest-api--dashboard)
- [计划扫描](#scheduled-scanning)
- [告警](#alerting)
- [SIEM 集成](#siem-integration)
- [Jira 集成](#jira-integration)
- [流水线深度解析](#pipeline-deep-dive)
- [阶段 1 — 发现](#phase-1--discovery)
- [阶段 2 — 丰富](#phase-2--enrichment)
- [阶段 3 — 漏洞评估](#phase-3--vulnerability-assessment)
- [阶段 4 — 报告与集成](#phase-4--reporting--integration)
- [安全规则参考](#security-rules-reference)
- [风险评分](#risk-scoring)
- [计算公式](#formula)
- [自动升级规则](#auto-escalation-rules)
- [REST API 参考](#rest-api-reference)
- [仪表盘](#dashboard)
- [安全限制](#safety-caps)
- [依赖项](#dependencies)
- [贡献](#contributing)
- [许可证](#license)
## 概述
**EASM Scanner** 是一个使用 Python 构建的综合型外部攻击面管理平台。受 CyCognito、Censys 和 Mandiant ASM 等商业解决方案的启发,它提供了一个全自动的 14 步流水线,能够发现、丰富、评估并报告您组织面向互联网的资产。
该扫描器封装了来自 [ProjectDiscovery](https://projectdiscovery.io/) 的高性能 Go 工具(subfinder、httpx、dnsx、naabu、nuclei 等),同时为所有功能提供了**纯 Python 回退机制** —— 这意味着它无需安装任何 Go 工具即可开箱即用。
### 与众不同之处
| 功能 | EASM Scanner |
|-----------|-------------|
| **零外部依赖** | 仅需 `requests` + `dnspython` 即可工作;Go 工具仅作为可选的加速器 |
| **14 步自动化流水线** | 只需一条命令,即可从种子导入一直到生成带有风险评分的发现 |
| **50+ 安全规则** | 涵盖暴露的服务、配置错误、CVE、DNS、TLS、云存储和凭证 |
| **多因素风险评分** | 包含自动升级(CISA KEV、默认凭证、接管)的 4 部分计算公式 |
| **内置集成** | REST API、仪表盘、Slack/Teams/Email 告警、Splunk/Elasticsearch SIEM、Jira 工单管理 |
| **基于差异的计划任务** | 可跨扫描检测新增、已解决和未更改的发现 |
| **单文件部署** | 每个模块都是独立的,并拥有自己的 dataclass |
## 核心功能
### 攻击面情报(未知资产发现)
通过从您的种子中进行跨域关联,结合五种互补的方法,发现组织拥有的*未知*资产(兄弟公司、子公司、影子 IT):
- **证书 SAN 关联** — 共享种子 TLS 证书的根域名(证书透明度)
- **反向 WHOIS** — 具有相同 WHOIS 注册人的域名(独立来源;ViewDNS,需密钥验证)
- **被动 DNS** — 解析到种子 IP 的域名
- **Favicon 哈希** — 提供相同站点 favicon 的主机(Shodan,需密钥验证)
- **ASN→组织扩展** — 种子所属 ASN 的网络前缀(BGPView)
- **基于方法的置信度评分** — 最强的方法设定基础分;多方法相互印证加上 WHOIS 注册组织 / 邮箱 / 品牌特征匹配,最终生成 0.0–1.0 的评分(HIGH/MEDIUM/LOW)以及人类可读的理由
- **共享基础设施过滤** — 排除 CDN/云/SaaS 根域(Cloudflare、AWS、Heroku 等)以及 WHOIS 隐私保护邮箱,以抑制误报
- **被动且无害** — 仅读取公开的 CT / WHOIS / 被动 DNS / Shodan 数据;绝不扫描候选主机
### 威胁情报丰富
将**发现的攻击面**与免费 / 社区威胁情报源进行交叉比对 — 回答*“我的资产中是否有已被标记为恶意的?”*:
- **abuse.ch Feodo Tracker** — 属于已知僵尸网络 C2 服务器的自有 IP
- **abuse.ch ThreatFox** — 属于活跃恶意软件 IOC 的自有 IP/域名(包含家族信息)
- **abuse.ch URLhaus** — 提供已知恶意软件 URL 的自有主机
- **FireHOL level1** — 处于聚合恶意 IP 范围内的自有 IP
- **Spamhaus DROP** — 处于被劫持/犯罪网段内的自有 IP
- **Tor 出口节点** — 作为 Tor 出口节点的自有 IP
- **无需 API 密钥**;在本地进行匹配,属于被动行为(绝不联系被标记的主机);匹配结果将转化为 `EASM-TI-*` 发现并计入风险评分
### 检测配对(蓝队工件)
为每一次暴露生成**防御对应措施** — 这是任何 EASM(或 Recorded Future)产品都不具备的差异化优势:
- **MITRE ATT&CK 映射** — 每个发现都会标记上攻击者可能使用的技术(T1190、T1133、T1021.x、T1078/T1110、T1530、T1590.002、T1584.001、T1071/T1090 等)
- **生成 Sigma 规则** — 为可利用的发现提供随时可部署的检测规则(暴露的服务、敏感路径访问、默认凭证登录、公共存储桶读取、DNS AXFR、子域接管,以及与威胁情报 IOC 的通信)
- **通俗易懂的日志特征** + 针对仅提供指导的发现(CVE/Nuclei/TLS/Headers)提供日志源指导
- **确定性 Sigma ID**,通过 `--sigma-out` 为每个发现写入一个 `.yml` 文件;发现结果会附加 `mitre` + `detection` 元数据(汇入 JSON/报告中);内置 YAML 发射器(无 PyYAML 依赖)
### 发现与侦察
- 子域名枚举(crt.sh、subfinder、DNS 暴力破解)
- 证书透明度日志监控
- ASN 到 CIDR 前缀扩展(BGPView、RIPE、asnmap)
- 支持多种记录类型的批量 DNS 解析
- 包含服务检测和 Banner 抓取的 TCP 端口扫描
- 包含技术指纹识别的 HTTP 探测
### 丰富与归属
- 包含注册人提取的 WHOIS/RDAP 查询
- TLS 证书链分析(过期时间、密码套件、密钥强度)
- 包含 ISP/ASN 数据的 GeoIP 丰富
- 技术指纹识别(针对 Web 框架、CMS、CDN、WAF 的 150+ 签名)
- 带有置信度评分的多信号组织归属
- 带有 BFS 遍历的内存中资产关系图
### 漏洞评估
- **CVE 检测** — 针对 10 个产品的 25+ CVE 条目进行版本指纹识别,并结合 EPSS 评分和 CISA KEV 交叉引用进行丰富
- **Nuclei 扫描** — 封装 Go 二进制文件,并提供 15 个内置 Python 模板作为后备
- **子域接管** — 跨 25 个云提供商的悬空 DNS/CNAME 检测(AWS、Azure、GitHub Pages、Heroku、Netlify、Vercel、Shopify、Fastly 等)
- **Web 配置错误** — 39 项敏感路径检查(.env、.git、备份文件、调试端点、管理后台、Swagger)、CORS 配置错误、开放重定向、目录遍历
- **默认凭证** — 针对 8 种服务类型(SSH、FTP、HTTP、SNMP、MySQL、PostgreSQL、Redis、MongoDB)测试 36 组凭证对
- **DNS 安全** — SPF/DKIM/DMARC 验证、区域传送(AXFR)测试、CAA 记录检查、悬空 MX 检测
- **云存储** — 枚举 S3、Azure Blob 和 GCS 存储桶,并测试公共访问权限
- **风险评分** — 带有 5 条自动升级规则的多因素评分引擎
### 报告与集成
- **REST API** — 15 个 FastAPI 端点,支持程序化访问
- **交互式仪表盘** — 深色主题单页应用(SPA),包含严重程度图表、资产清单、风险评分、扫描启动器
- **多渠道告警** — 电子邮件(SMTP/TLS)、Slack(Block Kit)、Microsoft Teams(MessageCard)、通用 Webhook、控制台
- **SIEM 导出** — Splunk HEC(批量)、Elasticsearch(bulk API)、Syslog CEF(UDP/TCP)、CSV、JSON Lines
- **STIX 2.1 导出** — 将资产/发现/IOC/CVE/ATT&CK 作为包含关系的 STIX bundle 导出(`--stix`),用于 TIP/SIEM/SOAR(MISP、OpenCTI、Sentinel)
- **Jira 集成** — 支持 Cloud/Server REST API v2、严重程度到优先级的映射、JQL 去重、试运行模式
- **扫描计划** — 基于 SQLite 的历史记录,支持发现/资产差异检测和告警触发
- **风险趋势随时间变化** — 跨扫描跟踪攻击面指标,并报告足迹缩减情况(CRITICAL+HIGH 暴露百分比、各项指标的方向 + ASCII 微型图表)
## 架构
### 14 步流水线
```
EASM Scanner Pipeline
============================================================================
PHASE 1 — DISCOVERY PHASE 2 — ENRICHMENT
+-------------------+ +-------------------+
| 1. Seed Ingestion | | 7. WHOIS Lookup |
| 2. ASN Expansion | | 8. TLS Analysis |
| 3. Subdomain Enum | ==========> | 9. GeoIP + Tech |
| 4. DNS Resolution | |10. Attribution |
| 5. Port Scanning | +-------------------+
| 6. HTTP Probing | |
+-------------------+ v
PHASE 3 — VULN ASSESSMENT
+---------------------+
PHASE 4 — INTEGRATION |11. CVE + Nuclei |
+-------------------+ |12. Misconfig+Takeover|
| REST API | <==== |13. Creds + DNS Sec |
| Dashboard | |14. Risk Scoring |
| Alerts + SIEM | +---------------------+
| Jira + Scheduler |
+-------------------+
```
### 项目结构
```
easm_scanner.py Main orchestrator, CLI, 14-step pipeline, reporting
models/
asset.py Asset dataclass (domain, ip, port, url, cert, asn, cidr)
finding.py Finding dataclass with severity ranking
modules/
# Phase 1 — Discovery
seed_manager.py Seed parsing (domains, IPs, CIDRs, ASNs, files)
asn_mapper.py ASN-to-CIDR via BGPView / RIPE / asnmap
subdomain_discovery.py crt.sh + subfinder + DNS brute-force
dns_resolver.py Bulk DNS resolution + dnsx wrapper
port_scanner.py TCP scanner + naabu + banner grab
http_prober.py HTTP probe + tech fingerprint + httpx wrapper
ct_monitor.py Certificate Transparency via crt.sh
asset_store.py SQLite-backed asset + finding storage
# Phase 2 — Enrichment
whois_enrichment.py RDAP + whois CLI, registrant extraction
tls_analyzer.py Cert chain, cipher suites, expiry, key strength + tlsx
geoip_enrichment.py ip-api.com batch + single lookups
tech_fingerprint.py 150+ signatures (headers, cookies, body, meta)
screenshot_capture.py gowitness wrapper for visual recon
attribution_engine.py Multi-signal org attribution (7 signal types)
asset_graph.py In-memory adjacency-list graph, BFS traversal
# Phase 3 — Vulnerability Assessment
vuln_detector.py CVE detection via version fingerprinting + NVD/EPSS
nuclei_scanner.py Nuclei Go wrapper + 15 built-in Python templates
subdomain_takeover.py Dangling DNS/CNAME detection (25 cloud providers)
misconfig_detector.py 39 sensitive paths, CORS, open redirect, directory listing
default_creds.py Default credential testing (8 service types, 36 pairs)
dns_security.py SPF/DKIM/DMARC, zone transfer (AXFR), CAA, MX checks
cloud_enum.py S3/Azure Blob/GCS bucket enumeration + access testing
risk_scorer.py Multi-factor risk scoring with auto-escalation
# Phase 4 — Reporting & Integration
alerting.py Multi-channel alerting (Email/Slack/Teams/Webhook/Console)
siem_export.py SIEM export (Splunk HEC/Elasticsearch/Syslog/CSV/JSONL)
jira_integration.py Jira Cloud/Server ticket creation with deduplication
scheduler.py SQLite-backed scan scheduling with diff detection
api/
server.py FastAPI REST API server (15 endpoints)
dashboard.py Dashboard data renderer
templates/
dashboard.html Interactive single-page dashboard (dark theme)
config/
settings.yaml Default configuration (threads, resolvers, ports)
wordlists/
subdomains-top1000.txt Common subdomain prefixes for brute-force
```
## 快速入门
### 前置条件
- **Python 3.10+**
- **pip**(Python 包管理器)
### 安装说明
```
# 克隆 repository
git clone https://github.com/Krishcalin/Attack-Surface-Management.git
cd Attack-Surface-Management
# 安装所需 dependencies
pip install -r requirements.txt
# (可选)安装 Go 工具以加快扫描速度
go install -v github.com/projectdiscovery/subfinder/v2/cmd/subfinder@latest
go install -v github.com/projectdiscovery/httpx/cmd/httpx@latest
go install -v github.com/projectdiscovery/dnsx/cmd/dnsx@latest
go install -v github.com/projectdiscovery/naabu/v2/cmd/naabu@latest
go install -v github.com/projectdiscovery/nuclei/v3/cmd/nuclei@latest
# (可选)安装凭据测试库
pip install paramiko mysql-connector-python psycopg2-binary pymongo
```
### 快速开始
```
# 针对单个 domain 的全面扫描
python easm_scanner.py -d example.com --org "ACME Corp" -v
# 扫描并输出 HTML 和 JSON
python easm_scanner.py -d example.com --html report.html --json scan.json
# 扫描并启动 web dashboard
python easm_scanner.py -d example.com --serve --port 8888
```
## 用法
### 基础扫描
```
# 单个 domain 扫描
python easm_scanner.py -d example.com
# 多个 domains
python easm_scanner.py -d example.com acme.org staging.example.io
# IP 地址
python easm_scanner.py -i 10.0.0.1 172.16.0.1
# ASN 扩展
python easm_scanner.py --asn AS15169 AS13335
# CIDR 范围
python easm_scanner.py --cidr 192.168.1.0/24
# Seed 文件(每行一个目标)
python easm_scanner.py --seed-file targets.txt
# 结合 org context 的组合 seeds
python easm_scanner.py -d example.com --asn AS15169 --cidr 10.0.0.0/24 --org "ACME Corp"
```
### 高级选项
```
# 跳过特定阶段
python easm_scanner.py -d example.com --skip-ports # No port scanning
python easm_scanner.py -d example.com --skip-enrichment # Skip Phase 2
python easm_scanner.py -d example.com --skip-vuln-assessment # Skip Phase 3
python easm_scanner.py -d example.com --skip-nuclei # Skip Nuclei
python easm_scanner.py -d example.com --skip-cred-test # Skip credential testing
# 自定义设置
python easm_scanner.py -d example.com --threads 100 # Adjust concurrency
python easm_scanner.py -d example.com --severity HIGH # Filter output
python easm_scanner.py -d example.com --db scan.db # Persistent SQLite storage
python easm_scanner.py -d example.com --nuclei-templates /path # Custom Nuclei templates
# 输出格式
python easm_scanner.py -d example.com --json scan.json # JSON report
python easm_scanner.py -d example.com --html report.html # HTML report
python easm_scanner.py -d example.com --detect --stix bundle.json # STIX 2.1 (TIP/SIEM/SOAR)
python easm_scanner.py -d example.com --siem-csv findings.csv # CSV export
python easm_scanner.py -d example.com --siem-jsonl findings.jsonl # JSONL export
```
### 威胁情报丰富
标记出已经出现在免费威胁情报源中的自有 IP/域名:
```
# 使用 threat-intel feeds 丰富发现的 attack surface(无需 API key)
python easm_scanner.py -d example.com --threat-intel
# 独立 IOC 检查
python modules/threat_intel.py --ip 203.0.113.10 --domain bad.example.net -v
```
匹配结果将被记录为 `EASM-TI-*` 发现(僵尸网络 C2、恶意软件 IOC、恶意软件 URL 主机、恶意/被劫持网段、Tor 出口节点),并计入风险评分。
### 检测配对(MITRE ATT&CK + Sigma)
将暴露转化为 SOC 可以部署的检测规则:
```
# 使用 MITRE ATT&CK 技术和检测指南为发现结果添加注释
python easm_scanner.py -d example.com --detect
# 同时为每个可利用的发现编写一个 Sigma 规则(意味着使用 --detect)
python easm_scanner.py -d example.com --sigma-out ./sigma
# 最强组合:已知恶意 assets -> ATT&CK -> Sigma
python easm_scanner.py -d example.com --threat-intel --sigma-out ./sigma
```
每个发现都会标记上 ATT&CK 技术;可利用的发现还会生成一条 Sigma 规则(视情况使用防火墙/Web/认证/DNS/云日志源)。扫描摘要将报告 ATT&CK 技术/战术覆盖率和 Sigma 规则数量。
### 未知资产发现(情报)
从已知的种子进行跨域关联,发现组织同时拥有的相关根域名(基于证书 SAN 的关联 + WHOIS 交叉验证)。
```
# 作为全面扫描的一部分:发现并盘点相关的 apex domains
python easm_scanner.py -d example.com --org "ACME Corp" --discover-related
# 同时将发现的 domains 拉入主动扫描(扩大范围)
python easm_scanner.py -d example.com --org "ACME Corp" --discover-related --intel-expand
# 仅报告高置信度候选目标
python easm_scanner.py -d example.com --discover-related --intel-min-confidence 0.7
# 启用额外的 pivots(实时的 pivots 会在适用时使用其 API key)
export VIEWDNS_API_KEY=... # reverse-whois
export SHODAN_API_KEY=... # favicon-hash
python easm_scanner.py -d example.com -i 203.0.113.10 --org "ACME Corp" \
--discover-related \
--intel-pivots cert-san-pivot,reverse-whois,passive-dns,favicon-hash,asn-org
# 独立运行(仅发现,不进行全面扫描)
python modules/intel_discovery.py example.com --org "ACME Corp" \
--pivots cert-san-pivot,passive-dns --ip 203.0.113.10 -v
```
发现的根域将被添加到资产清单(来源为 `intel:cert-san-pivot`)中,并记录为 `EASM-INTEL-001`(INFO)发现,其中包含置信度级别(HIGH/MEDIUM/LOW)、注册人组织以及它们与您的种子关联的原因。默认情况下,它们**仅被列入清单**;使用 `--intel-expand` 可将它们添加到主动扫描范围内。
### REST API 与仪表盘
```
# 扫描后启动 API 服务器
python easm_scanner.py -d example.com --serve
# 自定义端口
python easm_scanner.py -d example.com --serve --port 9090
```
启动后,可访问:
- **仪表盘**: `http://localhost:8888/`
- **API 文档**: `http://localhost:8888/docs` (Swagger UI)
- **健康检查**: `http://localhost:8888/api/health`
### 计划扫描
```
# 每 60 分钟扫描一次并进行 diff 检测
python easm_scanner.py -d example.com --schedule 60
# 定时扫描并在发现新结果时发出告警
python easm_scanner.py -d example.com --schedule 60 \
--alert-slack https://hooks.slack.com/services/T.../B.../xxx
```
调度程序使用 SQLite 跟踪扫描历史并计算运行之间的差异,从而识别新增、已解决和未更改的发现。
### 风险趋势随时间变化
```
# 将每次扫描记录到历史记录并打印 attack-surface 趋势
python easm_scanner.py -d example.com --trends
# 使用特定的 history DB
python easm_scanner.py -d example.com --trends --history-db acme-history.db
```
在记录了两次或更多次扫描后,报告将显示各项指标(发现、严重程度计数、平均/最大风险值)的变化情况,附带 ASCII 微型图表,以及整体的**攻击面暴露减少百分比**(ITICAL+HIGH)——即“我们的足迹是否在缩小?”视图。
### 告警
当发现 **CRITICAL** 或 **HIGH** 严重级别的发现时会发送告警。系统会对发现进行去重,以防止重复通知。
### SIEM 集成
```
# Splunk HEC
python easm_scanner.py -d example.com \
--siem-splunk-url https://splunk.company.com:8088 \
--siem-splunk-token your-hec-token
# Elasticsearch
python easm_scanner.py -d example.com \
--siem-elastic-url https://es.company.com:9200
# 导出 CSV / JSON Lines 文件
python easm_scanner.py -d example.com \
--siem-csv findings.csv --siem-jsonl findings.jsonl
```
### Jira 集成
```
# 为 CRITICAL 和 HIGH 发现创建 Jira 工单
python easm_scanner.py -d example.com \
--jira-url https://company.atlassian.net \
--jira-project SEC \
--jira-user admin@company.com \
--jira-token your-api-token
```
工单包含结构化的描述,涉及规则 ID、严重程度、资产、证据和修复指南。该集成通过 JQL 检查现有工单以防止重复。
## 流水线深度解析
### 阶段 1 — 发现
| 步骤 | 模块 | 描述 |
|------|--------|-------------|
| 1 | `seed_manager.py` | 从 CLI 参数或文件解析并验证种子(域名、IP、CIDR、ASN) |
| 2 | `asn_mapper.py` | 通过 BGPView 和 RIPE API 将 ASN 扩展为 CIDR 前缀 |
| 3 | `subdomain_discovery.py` | 通过 crt.sh、subfinder 和 DNS 暴力破解枚举子域名 |
| 4 | `dns_resolver.py` | 批量 DNS 解析(A、AAAA、CNAME、MX、TXT),支持 dnsx 加速 |
| 5 | `port_scanner.py` | 封装 naabu 的 TCP 连接扫描、服务检测、Banner 抓取 |
| 6 | `http_prober.py` | HTTP/HTTPS 探测、状态码、标题提取、技术指纹识别 |
### 阶段 2 — 丰富
| 步骤 | 模块 | 描述 |
|------|--------|-------------|
| 7 | `whois_enrichment.py` | RDAP/WHOIS 查询、注册人提取、域名过期监控 |
| 8 | `tls_analyzer.py` | 证书链分析、密码套件、密钥强度、过期检测 |
| 9 | `geoip_enrichment.py` + `tech_fingerprint.py` | IP 地理定位(ip-api.com)+ 150+ 技术签名 |
| 10 | `attribution_engine.py` + `asset_graph.py` | 多信号组织归属(7 种信号类型)+ 关系图 |
### 阶段 3 — 漏洞评估
| 步骤 | 模块 | 描述 |
|------|--------|-------------|
| 11 | `vuln_detector.py` + `nuclei_scanner.py` | CVE 指纹识别(25+ CVE,10 个产品)+ Nuclei 模板扫描 |
| 12 | `misconfig_detector.py` + `subdomain_takeover.py` + `cloud_enum.py` | Web 配置错误(39 个路径)+ 接管(25 个提供商)+ 云存储 |
| 13 | `default_creds.py` + `dns_security.py` | 默认凭证测试(8 个服务)+ SPF/DKIM/DMARC/AXFR 检查 |
| 14 | `risk_scorer.py` | 具有自动升级规则的多因素风险评分 |
### 阶段 4 — 报告与集成
| 模块 | 描述 |
|--------|-------------|
| `api/server.py` | 具有 15 个用于扫描管理、查询和导出的端点的 FastAPI REST API |
| `api/dashboard.py` | 带有扫描数据注入的仪表盘数据渲染器 |
| `templates/dashboard.html` | 交互式 SPA:概述、发现、资产、风险评分、扫描启动器 |
| `alerting.py` | 多渠道告警(Email、Slack、Teams、Webhook、控制台) |
| `siem_export.py` | SIEM 导出(Splunk HEC、Elasticsearch、Syslog CEF、CSV、JSONL) |
| `jira_integration.py` | 具有去重和优先级映射的 Jira 工单创建 |
| `scheduler.py` | 基于 SQLite 差异检测的扫描调度 |
## 安全规则参考
### 暴露的服务(`EASM-PORT-*`)
| 规则 ID | 名称 | 严重程度 |
|---------|------|----------|
| EASM-PORT-001 | 数据库端口暴露于互联网 | CRITICAL |
| EASM-PORT-002 | RDP 暴露于互联网 | HIGH |
| EASM-PORT-003 | Telnet 暴露于互联网 | HIGH |
| EASM-PORT-004 | FTP 暴露于互联网 | MEDIUM |
| EASM-PORT-005 | VNC 暴露于互联网 | HIGH |
| EASM-PORT-006 | SMB 暴露于互联网 | CRITICAL |
### 安全标头(`EASM-HTTP-*`)
| 规则 ID | 名称 | 严重程度 |
|---------|------|----------|
| EASM-HTTP-001 | 缺失 Strict-Transport-Security | MEDIUM |
| EASM-HTTP-002 | 缺失 Content-Security-Policy | LOW |
| EASM-HTTP-003 | 缺失 X-Content-Type-Options | LOW |
| EASM-HTTP-004 | 泄露服务器版本 | INFO |
| EASM-HTTP-005 | 缺失 X-Frame-Options | LOW |
### TLS / SSL(`EASM-TLS-*`)
| 规则 ID | 名称 | 严重程度 |
|---------|------|----------|
| EASM-TLS-001 | 未使用 TLS 的 HTTP 服务 | MEDIUM |
| EASM-TLS-002 | 自签名证书 | HIGH |
| EASM-TLS-003 | 过期的 TLS 证书 | CRITICAL |
| EASM-TLS-004 | TLS 证书即将过期 | MEDIUM |
| EASM-TLS-005 | 弱 RSA 密钥(< 2048 位) | HIGH |
### 域名(`EASM-WHOIS-*`)
| 规则 ID | 名称 | 严重程度 |
|---------|------|----------|
| EASM-WHOIS-001 | 域名即将过期 | MEDIUM |
| EASM-WHOIS-002 | 未启用 DNSSEC | LOW |
### 漏洞评估(`EASM-*`)
| 规则 ID | 名称 | 严重程度 |
|---------|------|----------|
| EASM-TAKEOVER-001 | 子域接管漏洞 | HIGH |
| EASM-CVE-001 | 检测到已知 CVE | HIGH |
| EASM-CRED-001 | 接受默认凭证 | CRITICAL |
| EASM-CLOUD-001 | 公共云存储桶 | CRITICAL |
| EASM-MISCONFIG-001..010 | Web 配置错误 | MEDIUM-HIGH |
| EASM-DNS-001..006 | DNS 安全问题 | MEDIUM-HIGH |
| EASM-NUCLEI-* | 动态 Nuclei 模板匹配 | 视情况而定 |
### 威胁情报(`EASM-TI-*`)
| 规则 ID | 名称 | 严重程度 |
|---------|------|----------|
| EASM-TI-001 | 资产 IP 在僵尸网络 C2 黑名单中(Feodo Tracker) | CRITICAL |
| EASM-TI-002 | 资产是活跃的恶意软件 IOC(ThreatFox) | CRITICAL |
| EASM-TI-003 | 资产托管已知的恶意软件 URL(URLhaus) | HIGH |
| EASM-TI-004 | 资产 IP 处于已知恶意网络中(FireHOL) | HIGH |
| EASM-TI-005 | 资产 IP 处于被劫持/犯罪网段中(Spamhaus DROP) | HIGH |
| EASM-TI-006 | 资产 IP 是 Tor 出口节点 | MEDIUM |
## 风险评分
### 计算公式
```
Risk Score = (Severity x 0.40) + (Asset Criticality x 0.35)
+ (Exploitability x 0.15) + (Temporal x 0.10)
```
| 组件 | 权重 | 范围 | 输入项 |
|-----------|--------|-------|--------|
| **严重程度** | 40% | 0-40 | CVSS 基础分或规则严重程度(CRITICAL=10,HIGH=8,MEDIUM=5,LOW=2) |
| **资产关键性** | 35% | 0-35 | 资产类型、服务乘数、类别加权 |
| **可利用性** | 15% | 0-15 | EPSS 评分、CISA KEV、公开漏洞利用可用性、是否存在 CVE |
| **时间因素** | 10% | 0-10 | 活跃利用状态、披露时效性 |
**分数到等级映射:**
| 分数 | 风险等级 |
|-------|-----------|
| >= 80 | CRITICAL |
| >= 60 | HIGH |
| >= 40 | MEDIUM |
| >= 20 | LOW |
| < 20 | INFO |
### 自动升级规则
| # | 条件 | 升级后分数 |
|---|-----------|----------------|
| 1 | CISA KEV + 分数 >= 50 | 90+(CRITICAL) |
| 2 | CRITICAL 服务上的默认凭证 | 95+(CRITICAL) |
| 3 | 确认的子域接管 | 85+(CRITICAL) |
| 4 | 包含数据的公共云存储桶 | 90+(CRITICAL) |
| 5 | CRITICAL CVE + 公开漏洞利用 + 分数 >= 60 | 88+(CRITICAL) |
## REST API 参考
| 方法 | 端点 | 描述 |
|--------|----------|-------------|
| `GET` | `/api/health` | 健康检查与扫描状态 |
| `POST` | `/api/scan` | 启动新扫描(包含域名、IP、ASN、跳过选项的 JSON 主体) |
| `GET` | `/api/scan/status` | 当前扫描进度(运行中、已完成、失败) |
| `GET` | `/api/scan/history` | 包含严重程度计数的扫描历史 |
| `GET` | `/api/summary` | 最新扫描摘要(资产、发现、丰富信息、漏洞统计) |
| `GET` | `/api/assets` | 资产清单,支持类型/搜索过滤和分页 |
| `GET` | `/api/findings` | 安全发现,支持严重程度/类别/搜索过滤 |
| `GET` | `/api/risk-scores` | 风险评分及汇总统计 |
| `GET` | `/api/intelligence` | 发现的未知相关资产(数量 + 详情) |
| `GET` | `/api/graph` | 资产关系图(邻接表) |
| `GET` | `/api/export/json` | 将发现导出为 JSON |
| `GET` | `/api/export/csv` | 将发现导出为 CSV |
| `GET` | `/api/export/jsonl` | 将发现导出为 JSON Lines |
| `POST` | `/api/alerts/test` | 通过所有已配置的渠道发送测试告警 |
| `GET` | `/` | 交互式 Web 仪表盘 |
通过以下方式启动 API:
```
python easm_scanner.py -d example.com --serve --port 8888
```
Swagger/OpenAPI 文档可在 `http://localhost:8888/docs` 获取。
## 仪表盘
交互式仪表盘是一个深色主题单页应用,可通过 API 服务器的根 URL(`/`)访问。
**页面:**
| 标签页 | 功能 |
|-----|----------|
| **概述** | 状态卡片(资产、严重程度计数)、严重程度/类别柱状图、丰富信息摘要、漏洞评估统计、首要发现表 |
| **发现** | 完整发现表,支持搜索、严重程度过滤、类别过滤、JSON/CSV 导出按钮 |
| **资产** | 资产清单,支持类型过滤和搜索、分页 |
| **风险评分** | 风险评分表,包含汇总状态卡片、最低分数滑块过滤、升级指标 |
| **情报** | 未知资产发现表(置信度、资产、类型、关联源、注册人、原因);在概述页上显示“相关 (Intel)”徽章 |
| **新扫描** | 扫描启动表单(域名、IP、ASN、组织、跳过复选框),扫描历史表 |
仪表盘会自动轮询扫描状态,并在扫描完成时自动更新。它还支持使用静态注入数据的**离线模式**,方便 HTML 报告分享。
## 安全限制
为了防止意外滥用或资源耗尽,扫描器强制执行以下限制:
| 操作 | 安全上限 |
|-----------|-----------|
| CIDR 展开 | 最大 /16(65,536 台主机) |
| 端口扫描目标 | 最大 1,024 个 IP |
| HTTP 探测目标 | 最大 2,048 个目标 |
| GeoIP 速率限制 | 调用间隔 1.4 秒(ip-api.com 免费层:45次/分钟) |
| Nuclei 目标 | 最大 100 个 URL |
| 配置错误扫描 | 最大 50 个 URL,每个 URL 50 条路径 |
| 云存储桶候选 | 最大 200 个 |
| 凭证测试目标 | 最大 50 个 |
## 依赖项
### 必需
| 包 | 版 | 用途 |
|---------|---------|---------|
| `requests` | >= 2.31.0 | 用于 API 调用的 HTTP 客户端 |
| `dnspython` | >= 2.4.0 | DNS 解析和区域传送 |
### 可选 — REST API
| 包 | 版本 | 用途 |
|---------|---------|---------|
| `fastapi` | >= 0.104.0 | REST API 框架(`--serve` 模式) |
| `uvicorn` | >= 0.24.0 | 用于 FastAPI 的 ASGI 服务器 |
### 可选 — Go 工具(用于更快的扫描)
| 工具 | 用途 |
|------|---------|
| `subfinder` | 子域名枚举 |
| `httpx` | HTTP 探测 |
| `dnsx` | DNS 解析 |
| `naabu` | 端口扫描 |
| `asnmap` | ASN 映射 |
| `tlsx` | TLS 分析 |
| `nuclei` | 基于模板的漏洞扫描 |
| `gowitness` | 截图捕获 |
### 可选 — 凭证测试
| 包 | 用途 |
|---------|---------|
| `paramiko` | SSH 凭证测试 |
| `mysql-connector-python` | MySQL 凭证测试 |
| `psycopg2-binary` | PostgreSQL 凭证测试 |
| `pymongo` | MongoDB 凭证测试 |
## 测试
`pytest` 测试套件涵盖了核心引擎 —— 数据模型、种子解析/验证、SQLite 资产存储和风险评分引擎 —— 外加一个加载每个流水线模块的导入冒烟测试。所有测试都是确定性的,**不需要网络或 SAP/Go 工具**。
```
pip install pytest
python -m pytest tests/ -q # 93 tests
```
GitHub Actions 会在每次推送/PR 时跨 Python 3.10–3.13 环境运行该套件(`.github/workflows/tests.yml`)。
## 贡献
欢迎踊跃贡献。请遵循以下准则:
1. 每个模块都应独立,并拥有自己的 dataclass 结果
2. 每个 Go 工具包装器都必须具有纯 Python 回退机制
3. 使用 `_vprint()` 进行详细输出,并由 `self.verbose` 控制开关
4. 所有网络调用必须具有超时和异常处理机制
5. 控制台输出仅使用 ASCII 字符(保证 Windows 兼容性)
6. 规则 ID 遵循 `EASM-{CATEGORY}-{NNN}` 格式
7. 严重程度等级:`CRITICAL > HIGH > MEDIUM > LOW > INFO`
## 许可证
该项目基于 MIT 许可证授权。详情请参阅 [LICENSE](LICENSE)。
使用 Python 构建 | 由 ProjectDiscovery 强力驱动 | 灵感来源于 CyCognito