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, 子域名枚举, 开源项目, 无后门, 系统安全, 逆向工具