Nazmin-Babubaker/subdomain-enumeration

GitHub: Nazmin-Babubaker/subdomain-enumeration

结合主动字典暴力破解与被动证书透明度查询的 Python 子域名枚举工具,支持通配符检测与存活验证。

Stars: 0 | Forks: 0

# 子域名枚举工具 一款 Python 工具,用于通过两种互补技术发现目标域名的子域名:针对字典的**主动暴力破解**,以及通过 Certificate Transparency 日志的**被动枚举**。包括通配符 DNS 检测、针对模糊通配符情况的 HTTP 指纹识别、多线程扫描,以及对所有被动结果的存活检测。 ## 功能 - **主动暴力破解** — 解析字典中每个条目的 `word.domain.com`,采用多线程提升速度 - **被动枚举** — 从 Cert Spotter 的 Certificate Transparency API 获取历史子域名,不向目标发送任何请求 - **通配符 DNS 检测** — 在扫描前探测随机的无效子域名,以检测 `*.domain.com` 全局解析记录并避免误报 - **HTTP 指纹识别后备方案** — 对于启用通配符的域名,通过比对 `(status_code, content_length)` 签名,来解决仅靠 IP 比对无法区分真实子域名与通配符干扰的问题 - **存活解析** — 被动结果在报告前会被重新解析,因为 Certificate Transparency 日志永不过期,且通常包含早已废弃的子域名 - **可配置的 CLI** — 可选择仅主动、仅被动或两者兼有;设置线程数和字典路径 ## 安装 ``` git clone https://github.com/Nazmin-Babubaker/subdomain-enumeration.git cd subdomain-enumeration python3 -m venv venv source venv/bin/activate # Windows: venv\Scripts\activate pip install -r requirements.txt ``` **requirements.txt** ``` dnspython requests ``` ## 用法 ``` python3 main.py [options] ``` | 标志 | 描述 | 默认值 | |---|---|---| | `domain` | 目标域名(位置参数,必填) | — | | `-w`, `--wordlist` | 字典文件路径,用于主动模式 | `wordlist.txt` | | `-t`, `--threads` | 并发线程数 | `30` | | `--passive-only` | 仅运行被动枚举 | 关闭 | | `--active-only` | 仅运行主动暴力破解 | 关闭 | | `-h`, `--help` | 显示帮助信息 | — | `--passive-only` 和 `--active-only` 是互斥的。如果两者都省略,则同时运行主动和被动枚举并合并结果。 ### 示例 同时运行主动和被动枚举: ``` python3 main.py example.com -w wordlist.txt -t 50 ``` 仅被动 — 完全不向目标发送任何请求: ``` python3 main.py example.com --passive-only ``` 使用更大的字典进行仅主动暴力破解: ``` python3 main.py example.com --active-only -w wordlists.txt -t 100 ``` ### 示例输出 ``` $ python3 main.py example.com -w wordlist.txt -t 50 [*] Checking example.com for wildcard DNS... [*] No wildcard DNS detected. Skipping HTTP checks. [*] Loaded 14 words. Starting brute-force (50 threads) against example.com... [+] www.example.com -> ['93.184.216.34'] [+] api.example.com -> ['93.184.216.40'] [*] Brute-force done: 2 live subdomains found. [*] Querying certspotter... [*] Passive sources returned 47 unique candidate subdomains. [*] Resolving 47 passive candidates to check liveness... [*] 19 / 47 passive candidates are still live. [*] === FINAL RESULTS === [*] Total unique live subdomains: 20 api.example.com -> ['93.184.216.40'] beta.example.com -> ['93.184.216.51'] ... [*] Total time: 6.84s ``` ## 工作原理 1. **通配符检查** — 在暴力破解之前,该工具会解析几个随机的、几乎肯定不存在的子域名。如果其中有能解析出来的,则说明该域名使用了通配符 DNS,并且每个暴力破解得到的 IP 结果都会与该通配符 IP 池进行比对,而不是直接信任。 2. **暴力破解** — 字典中的每个条目都会在线程池中并发解析。对于启用通配符的域名,如果候选子域名的 IP 完全落在通配符池内,将针对通配符自身的 HTTP 签名触发二次 HTTP 指纹检查;不匹配的候选者将被保留。 3. **被动枚举** — 查询 Cert Spotter 的 Certificate Transparency API,获取目标域名下曾签发过 HTTPS 证书的所有主机名。 4. **存活解析** — 每个被动候选者都会通过 DNS 重新解析,因为证书日志包含早已下线的子域名。 5. **合并** — 主动和被动结果会被去重,合并为一个已确认存活的子域名字典。 ## 局限性 - 仅使用标准的 A 记录 DNS 解析;不检查 AAAA (IPv6)、CNAME 链或其他记录类型。 - 通配符过滤依赖于比对 IP 集合和 HTTP 签名 — 如果一个真实子域名恰好与通配符全局记录共享这两者,它仍可能作为漏报被过滤掉。 - 被动覆盖范围完全取决于 Cert Spotter 的索引;从未签发过证书的子域名不会出现在其中。 - HTTP 指纹识别仅使用 `(status_code, content_length)`;它不检查响应正文内容,因此如果通配符的错误页面大小随每次请求而变化,可能会产生不一致的指纹。
标签:DNS解析, Python, 子域名枚举, 开源项目, 无后门, 系统安全, 逆向工具