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, 域名接管检测, 子域名枚举, 无后门, 系统安全, 请求拦截, 逆向工具