PiyushThePal/Subhunt
GitHub: PiyushThePal/Subhunt
一款集成多源子域名枚举与子域名接管检测的安全侦查 pipeline 工具。
Stars: 0 | Forks: 0
# Subhunt
子域名枚举 + 接管检测集成于一个 pipeline 中。结合了被动来源、暴力破解、排列组合、JS 抓取、AXFR、TLS 证书 SAN 扫描以及基于 ASN 的 IP 段扫描,随后通过 DNS 解析(带有 wildcard 过滤和 CNAME 链提取)来验证发现的结果。
可用作 CLI 工具或 Python 库。
## 功能
- 并行查询 **8 个被动来源**:crt.sh, amass (需配置 API key), subfinder, assetfinder, findomain, hackertarget, urlscan, wayback
- 通过 `dnsx` 使用包含 11 万词的 SecLists 字典进行**暴力破解**
- 对已发现的名称使用包含 100 个词的聚焦鉴别列表进行**排列组合**
- **JS 抓取** —— 从 HTML 和链接的 JavaScript 中提取 hostname 引用
- **AXFR** —— 对每个 NS 尝试 zone-transfer(开销小;成功罕见)
- **TLS SAN 扫描** —— 从已解析 IP 上的证书中读取 SubjectAltName 字段
- **ASN 枚举** —— 目标的 ASN → 扫描其拥有的 IP 前缀以获取证书 SAN
- **递归** —— 可选启用 `--depth N`,对每个发现的子域名重新运行 pipeline
- **对每个结果进行 DNS 验证** —— 所有发现(包括被动来源的结果)都会通过 dnsx 进行解析,并执行 wildcard 过滤和 CNAME 链提取,因此输出的全都是存活名称
- **接管审计** —— CNAME / NS / MX 检查 (`subtake`),可独立运行或链式运行
- 批量模式 (`-f targets.txt`)
## 快速开始
提供三种安装路径 —— 任选其一。
### A. 原生安装 (Mac / Linux)
```
git clone
cd Subhunt
./install.sh
```
会自动检测您的包管理器(`brew` / `apt` / `dnf` / `pacman`),安装相关二进制文件(`amass`, `subfinder`, `assetfinder`, `findomain`, `dnsx`),并安装 Python 包(优先使用 `pipx`,回退到 `pip3 --user`)。之后您的 PATH 中将包含以下两个命令:
```
subenum -d example.com --takeover -o # full pipeline + takeover audit
subtake -d sub.example.com # takeover-only check on a single host
```
如果使用了 `pip3 --user` 回退方案,请确保 `~/.local/bin` 已添加到您的 PATH 中。
### B. Docker
```
docker build -t subenum .
docker run --rm subenum -d example.com --no-tls-san --no-asn --no-axfr
# 带有 per-target 输出文件:
mkdir -p output
docker run --rm \
-v "$(pwd)/output:/app/output" \
-v "$(pwd)/amass_config.ini:/app/amass_config.ini:ro" \
subenum -d example.com -o
```
### C. 手动安装
```
brew install amass subfinder findomain dnsx # Mac
go install github.com/tomnomnom/assetfinder@latest # any platform
pipx install . # isolated (recommended)
# 或者:pip3 install --user . # 将 ~/.local/bin 添加到 PATH
# 或者:pip3 install --user -e . # dev checkout
```
## 使用方法
### CLI
```
subenum -d DOMAIN [options]
subenum -f FILE [options]
```
(等同于从源码检出中执行 `python -m Subdomain_finder ...`。)请使用 `subenum -h` 查看完整列表。主要选项:
| 标志 | 行为 |
|---|---|
| `-d DOMAIN` | 单个目标 |
| `-f FILE` | 批量 —— 每行一个域名(跳过 `#` 注释和空行) |
| `--no-brute` | 跳过 11 万词字典的暴力破解阶段 |
| `--no-permute` | 跳过排列组合阶段 |
| `--no-js` | 跳过 JS 抓取 |
| `--no-axfr` | 跳过 AXFR zone-transfer 尝试 |
| `--no-tls-san` | 跳过对已解析 IP 的 TLS SAN 扫描 |
| `--no-asn` | 跳过 ASN 枚举 + IP 段 TLS 扫描 |
| `--depth N` | 递归深度(默认为 1)。**数值越高,运行时间成倍增加。** |
| `--takeover` | 对已解析的集合运行接管检查(CNAME + NS + MX) |
| `-o` | 将结果写入 `output/.txt` 而不是输出到 stdout |
| `--config PATH` | 指定 `config.toml` 的路径(默认为 `config.toml`) |
### 示例
```
subenum -d example.com # to stdout
subenum -d example.com -o # to output/example.com.txt
subenum -d example.com --no-brute --no-permute --no-tls-san --no-asn # fast run
subenum -f targets.txt -o # batch
subenum -d example.com --takeover -o # enum + takeover audit
```
### 库
```
from Subdomain_finder import enumerate, enumerate_recursive
results = enumerate("example.com", brute=True, permute=True)
results = enumerate_recursive("example.com", max_depth=2) # use with care
```
## 配置
### `config.toml` — 已提交的默认配置,无敏感信息
```
[resolver]
nameservers = ["1.1.1.1", "1.0.0.1", "8.8.8.8", "8.8.4.4"]
concurrency = 500
timeout = 3.0
[brute]
wordlist = "Subdomain_finder/subdomains-top1m-110000.txt"
[pipeline]
recursion_depth = 2
enable_js_scrape = true
[passive]
# amass 可以运行的秒数(它是最慢的 source)。对于大型 keyed targets 调高,
# 对于快速扫描调低。默认 480(8 分钟)。
amass_timeout = 480
```
将 wordlist 路径替换为较小的字典可加快运行速度,或者调整 `amass_timeout` 以在速度与 amass 覆盖率之间进行权衡。
### `amass_config.ini` — 用于 amass 的 API key
在代码库中作为模板提供,**所有 key 字段均为空**。如果存在该文件,`amass` 会加载它;填入 key 后将解锁约 15 个需要 key 的数据源(Censys, SecurityTrails, VirusTotal, Shodan, GitHub, FacebookCT, AlienVault OTX, BinaryEdge, ONYPHE 等)。如果不填入 key,amass 将仅在其默认的免费数据源上运行 —— 这对大多数目标来说意味着明显的覆盖率损失。
为您拥有账户的服务(大部分提供免费额度)填入相应的 key:
- **Censys** — https://search.censys.io/account/api
- **SecurityTrails** — https://securitytrails.com/app/account/credentials
- **VirusTotal** — https://www.virustotal.com/gui/my-apikey
- **Shodan** — https://account.shodan.io/
- **GitHub** — https://github.com/settings/tokens (读取权限)
## 架构
针对单个目标的 pipeline(可通过 `--no-*` 单独跳过特定阶段):
1. **被动收集** (并行) —— crt.sh, amass, subfinder, assetfinder, findomain, hackertarget, urlscan, wayback,以及可选的 AXFR。
2. **暴力破解** —— 通过 dnsx 使用 11 万词的字典测试 `.target`(批量 A 记录扫描 + A/AAAA/CNAME 记录补充)。
3. **排列组合** —— 使用 100 个鉴别词对已解析的名称进行变体测试(针对每个标签进行插入/追加/前缀/替换,数字加减)。计算量随种子集大小成倍增加;默认开启。
4. **TLS SAN 扫描** —— 连接每个已解析 IP 的 443 端口,读取证书 SAN,并过滤出在范围内的结果。
5. **ASN 扫描** —— 解析目标 → 通过 RIPE Stat 获取 ASN → 扫描已宣告网段中多达约 5,000 个 IP 的证书 SAN。
6. **JS 抓取** —— 获取 HTML 及链接的 JS,通过正则表达式提取范围内的 hostname。
7. **递归** (深度 > 1) —— 对每个发现的名称重新运行 pipeline。**运行时间将根据每一层发现的名称数量成倍增加。**
共享的解析器层封装了 `dnsx` 用于批量 DNS 查询,执行针对特定目标的 wildcard 检测,并提取范围内的 CNAME 链跳转记录。
**最终验证。** 暴力破解、排列组合和 JS 抓取在运行过程中会解析各自的候选项,因此这些结果已经是存活的(会原封不动地传递下去)。被动收集、TLS-SAN 和 ASN 的结果将在最后统一进行一次 DNS 验证 —— 只有实际能解析的名称才会被返回。运行摘要会显示每个阶段的原始**贡献数量 (Contribution)** 以及有多少被**成功解析 (Resolved)** (存活),例如 `passive +20,752 / Resolved 2` —— 从而让来源的噪音情况一目了然。
## 接管检测
`Subdomain_takeover/` 会针对三类接管情况对子域名列表进行审计:
- **CNAME** —— 指向已停用的第三方服务(GitHub Pages, Heroku, S3, Shopify, Fastly, Tumblr 等)。内置 61 种特征签名。
- **NS** —— 拥有 NS 委派,但所有 NS 均无响应,且服务商历史记录允许重新注册(HE.net, MyDomain)。13 种特征签名。
- **MX** —— MX → Microsoft 365,但该域名在任何租户中都未通过验证(`NameSpaceType: Unknown`)。
```
python -m Subdomain_finder -d target.com -o # enum only
python -m Subdomain_takeover -f my_subs.txt -o # audit an existing list
python -m Subdomain_finder -d target.com --takeover -o # combined
```
组合模式会将结果写入 `output/target.com.txt` 和 `output/target.com-takeovers.txt`。`subtake` 支持的标志有:`--no-cname`, `--no-ns`, `--no-mx`, `--concurrency N`, `--timeout SEC`, `-o`。
**状态级别:** `VULNERABLE`(已确认指纹或声明端点) · `POTENTIAL`(匹配到特征模式,需人工验证) · `INFO`(识别到服务商但不允许重新注册,例如 Route 53)。
## 注意事项与限制
- **性能** —— 在典型的 Mac 上运行:被动收集受限于 `amass_timeout`,暴力破解 (11 万词) 约 12 分钟,排列组合约 20 分钟,TLS SAN 约 30 秒,ASN 约 3 分钟,JS 抓取约 5 分钟。使用 `--no-*` 可跳过耗时的阶段(通常是暴力破解和排列组合)。
- **amass 占用了被动收集的大部分时间** —— amass 是最慢的数据源;即使较快的数据源已经完成,被动阶段也会为了等待它而消耗至多 `amass_timeout` 的时间(默认 8 分钟)。在 `config.toml` 中调低此值以进行快速扫描,或在详尽的带 key 扫描中调高此值(在 tesla.com 上,未配置 key 的 amass 耗时约 3 分 46 秒获取约 2,350 个名称)。
- **由 CDN 前置的目标** —— ASN 扫描返回的是 CDN 的 IP 段,而不是目标的;CDN 节点上的证书 SAN 通常是 wildcard。虽然能正常运行,但几乎无法获取到净新增数据。
- **不稳定的上游服务** —— `crt.sh` 经常出现 502/504 错误;`wayback` 在处理大型目标时经常出现 503 错误;`urlscan` 免费版限制每次查询最多 100 条结果。其他数据源可以填补这些空缺。
- **DNS 速率限制** —— 默认设置(4 个解析器,并发 500,约 200 QPS)保持在 Cloudflare/Google 的阈值之下。如果在运行中遇到 DNS 错误,请在 `config.toml` 中调低 `concurrency`/`rate_limit`。
- **大规模递归不可行** —— 对约 2,000 个子域名进行深度=2 的递归大约需要数周时间。请仅在小型目标上使用,或直接跳过。
## 文件结构
```
Subhunt/
├── Subdomain_finder/ enumeration tool (subenum)
│ ├── pipeline.py stage orchestrator
│ ├── resolver.py dnsx-backed DNS layer
│ ├── recursive.py depth-N wrapper
│ ├── config.py TOML loader
│ └── sources/ passive, brute, permute, js_scrape, axfr, tls_san, asn
├── Subdomain_takeover/ takeover tool (subtake)
│ ├── cname.py / ns.py / mx.py detectors
│ ├── checker.py shared HTTP helper
│ └── signatures.json 61 CNAME + 13 NS + 5 MX signatures
├── config.toml committed defaults (no secrets)
├── amass_config.ini tracked template — fill keys locally, don't commit them
├── install.sh Mac/Linux native install
├── Dockerfile multi-stage build
└── pyproject.toml package metadata + deps
```
## 许可证
MIT — 详见 [LICENSE](LICENSE)。
请负责任地使用:仅对您拥有或明确授权进行漏洞赏金 / 安全测试的目标运行此工具。
标签:GitHub, Python, 域名接管检测, 子域名枚举, 无后门, 系统安全, 请求拦截, 逆向工具