MaxKappa/takeover-hunt
GitHub: MaxKappa/takeover-hunt
一款专为漏洞赏金设计的子域名接管检测流水线工具,集成了多源侦察编排和精确的DNS感知指纹匹配能力,能自动化发现并验证子域名接管漏洞。
Stars: 2 | Forks: 0
# takeover-hunt
[](https://github.com/MaxKappa/takeover-hunt/actions/workflows/test.yml)
[](https://www.python.org/)
[](./LICENSE)
适用于漏洞赏金工作流的感知 DNS 的子域名接管 hunting 工具。
## 快速开始
```
# 1. clone + 安装 Python 包
git clone https://github.com/MaxKappa/takeover-hunt && cd takeover-hunt
pip install -e .
# 2. (可选,但推荐)引导 recon stack
# 安装 subfinder / dnsx / httpx / gotator / shuffledns / massdns / wordlists
scripts/install-recon-tools.sh
# 3. 在 scope 文件上运行(每行一个域名;支持 *.foo.com 和 -exclusions)
takeover-hunt -i scope.txt -o out/ --rate-limit 30 \
-H "X-Bug-Bounty: you@example.com"
# 4. 为获得最大覆盖范围,首先链接 recon orchestrator
scripts/recon.sh scope.txt recon_out/
takeover-hunt -i recon_out/live.txt -o recon_out/findings --rate-limit 30
```
输出:`out/findings.json` + 位于 `out/report.md` 的分组 Markdown 报告。
要求 Python 3.10+。跨平台(macOS / Linux)。在 CI 中通过 pytest 测试。
给定一个范围文件,它会:枚举子域名(可选),解析 CNAME 链,
探测 HTTP/S,并将响应与上游
[can-i-take-over-xyz](https://github.com/EdOverflow/can-i-take-over-xyz)
指纹进行匹配 —— 包含大多数检查器没有的一些额外功能:
- 预过滤为 **只探测具有 CNAME 或 NXDOMAIN 的主机**(更快,噪音更少)
- 处理未知服务的 **悬空 CNAME → NXDOMAIN** 情况
- 区分 **由 NXDOMAIN 驱动的接管**(Azure, trafficmanager 等)与
基于主体指纹的接管,包括防误报机制:当在 `nxdomain: true` 服务上匹配到主体内容时,意味着该资源实际上已被 **注册**
- 基于正则表达式的主体匹配(正确匹配上游模式)
- 输出按 `vulnerable` (易受攻击) / `investigate` (需调查) / `not-vulnerable` (不易受攻击) 分组的 Markdown + JSON 报告
## 安装
```
git clone https://github.com/MaxKappa/takeover-hunt.git
cd takeover-hunt
pip install -e .
```
需要 Python 3.10+。无必需的 Python 依赖。如果 `PATH` 中有以下外部工具,脚本将透明地调用它们:
| 工具 | 用途 | 可选? |
|------------------------------------------------------------|----------------------|-----------|
| [`subfinder`](https://github.com/projectdiscovery/subfinder) | 子域名枚举 | 是(需配合 `--enumerate`) |
| [`dnsx`](https://github.com/projectdiscovery/dnsx) | DNS CNAME / NXDOMAIN | 推荐(有标准库回退) |
| [`httpx`](https://github.com/projectdiscovery/httpx) | HTTP 探测 | 推荐(有 urllib 回退) |
| [`nuclei`](https://github.com/projectdiscovery/nuclei) | 模板交叉检查 | 是(需配合 `--nuclei`) |
## 用法
```
takeover-hunt -i scope.txt -o out/
# 先枚举 apex domains,然后进行 hunt
takeover-hunt -i scope.txt -o out/ --enumerate
# bug-bounty 礼仪:表明身份 + 限制速率
takeover-hunt -i scope.txt -o out/ \
--rate-limit 30 \
-H "X-Bug-Bounty: you@example.com" \
-H "User-Agent: you-recon/1.0"
# 同时使用 nuclei templates 进行交叉检查
takeover-hunt -i scope.txt -o out/ --nuclei
# 强制刷新上游 fingerprints(缓存在 ~/.cache/takeover-hunt/)
takeover-hunt -i scope.txt -o out/ --update-fingerprints
# air-gapped — 仅使用 bundled snapshot
takeover-hunt -i scope.txt -o out/ --offline
```
### 参数
| 参数 | 默认值 | 用途 |
|---|---|---|
| `-i, --input` | (必填) | 范围文件,每行一个条目。支持 `#` 注释,URL 和 `host:port` 会被标准化。 |
| `-o, --output` | `takeover_out` | 输出目录。 |
| `--enumerate` | 关闭 | 对 **每个** 范围条目运行 `subfinder`。 |
| `--threads` | 50 | DNS/HTTP 的并发数。 |
| `-H, --header` | (可重复) | 每次发起 HTTP 请求时的自定义 Header。 |
| `--rate-limit` | 0 | 发往目标的最大 HTTP 请求/秒 (req/s)(0 = 无限制)。应用于 `httpx`、`nuclei` 以及 urllib 回退(令牌桶算法)。**不会**限制 DNS —— 请参阅 `--dns-rate-limit`。 |
| `--dns-rate-limit` | 0 | 单独限制 `dnsx` 的速率。通常没有必要(DNS 会直接请求您的本地解析器)。 |
| `--nuclei` | 关闭 | 同时运行 `nuclei -t http/takeovers/` 并合并结果。 |
| `--update-fingerprints` | 关闭 | 强制刷新上游 JSON 缓存。 |
| `--offline` | 关闭 | 不连接网络;使用内置指纹。 |
退出码:`0` = 正常,`1` = 至少有一个候选结果需要分类,`2`/`3` = 设置错误。
### 范围文件中的通配符
`*.example.com` **不会**被视作裸顶级域 —— 它是一个信号,表明您想要
`example.com` 的所有子域名。CLI 将范围拆分为两个集合:
- `hosts` —— 裸条目(`example.com`、`api.example.com`)直接进行探测。
- `wildcard_apexes` —— 写为 `*.foo.com` 形式的条目。这些会自动
触发从该顶级域开始的 `subfinder` 枚举,**即使未使用** `--enumerate` 也是如此。
因此,像这样的范围:
```
*.example.com
api.test.com
```
其结果是:从 `example.com` 进行枚举(subfinder)+ 直接探测 `api.test.com`
+ 探测 `example.com` 顶级域本身。`--enumerate` 会将此范围扩大至
“从每个条目进行枚举,无论是否为通配符”。
通配符的顶级域 **包含** 在探测列表中(大多数漏洞赏金
项目将 `*.foo.com` 视为包含 `foo.com`)。如果您想将其
排除,请手动从已发现的集合中剔除该裸顶级域。
## 输出
```
out/
├── subdomains.txt # only when --enumerate was passed
├── dnsx_input.txt
├── httpx_input.txt
├── nuclei.jsonl # only when --nuclei was passed
├── findings.json
└── report.md
```
一个 `Finding` JSON 对象的结构如下:
```
{
"host": "abandoned.example.com",
"service": "GitHub Pages",
"verdict": "vulnerable",
"confidence": "high",
"cname_target": "abandoned.example.com.github.io",
"cname_chain": ["abandoned.example.com.github.io"],
"http_status": 404,
"url": "https://abandoned.example.com",
"body_match": "There isn't a GitHub Pages site here.",
"body_pattern": "There isn't a GitHub Pages site here\\.",
"nxdomain": false,
"upstream_vulnerable": true,
"status": "Vulnerable",
"discussion": "https://github.com/EdOverflow/can-i-take-over-xyz/issues/...",
"documentation": "https://help.github.com/..."
}
```
## 最大覆盖率的侦察
`takeover-hunt --enumerate` 仅运行 `subfinder` —— 适合快速检查,但
会遗漏从未出现在 CT 日志或被动
来源中的内部子域名(典型情况如:`prod-X` / `X-src` / `X-int` 变体)。对于真正的
漏洞赏金工作流,请使用内置的侦察编排器:
```
# 一次性设置:安装 tools + wordlists + resolvers (~/.cache/takeover-hunt/)
scripts/install-recon-tools.sh
# 可选但值得 — 带有 API keys 的 passive sources 覆盖更广
export CHAOS_KEY="..." # https://chaos.projectdiscovery.io/
export GITHUB_TOKEN="..." # https://github.com/settings/tokens (repo scope)
# 运行 recon pipeline
scripts/recon.sh scope.txt out/
# 将 live host 列表提供给 takeover-hunt
takeover-hunt -i out/live.txt -o out/findings --rate-limit 30 \
-H "X-Bug-Bounty: you@example.com"
```
`recon.sh` 的实际工作内容(每个阶段都是自适应的 —— 缺少工具只会
触发警告并被跳过):
1. **被动** — `subfinder`(10+ 来源)+ `amass enum -passive` +
`assetfinder` + `chaos`(如果有 API key)+ `github-subdomains`(如果有 PAT)。
2. **证书透明度** — `tlsx` 用于抓取 CN/SAN + 直接的
`crt.sh` 查询作为回退(无需安装任何工具即可工作)。
3. **排列** — `alterx` 和 `gotator -adv` 从阶段 1+2 的结果中
生成 `prod-X` / `X-internal`
/ `dev-X` / `X-v2` 变体。这一步可以
捕获任何被动来源都未曾索引的非标准内部名称。
4. **DNS 暴力破解** — 使用 `shuffledns`(或 `puredns`)基于 `n0kovo_subdomains`
对精心策划的解析器列表进行探测。速度很快,因为它在底层使用了 `massdns`
以及来自 `trickest/resolvers` 的受信解析器。
5. **存活过滤** — `dnsx` 仅保留可解析且在范围内的主机。
可调参数(环境变量):
| 变量 | 默认值 | 用途 |
|---|---|---|
| `THREADS` | 200 | shuffledns/dnsx 的并发数 |
| `DNS_WORDLIST` | `~/.cache/takeover-hunt/wordlists/subdomains.txt` | DNS 暴力破解字典 |
| `PERMUTATIONS` | `~/.cache/takeover-hunt/wordlists/permutations.txt` | gotator 排列字典 |
| `RESOLVERS` | `~/.cache/takeover-hunt/resolvers.txt` | 受信递归解析器 |
| `CHAOS_KEY` | (无) | ProjectDiscovery Chaos API 密钥 |
| `GITHUB_TOKEN` | (无) | 用于 github-subdomains 的 GitHub PAT |
在单个中型顶级域(约 250 个已知子域名)上的预期运行时间:
- 被动 + CT:20-60秒
- 排列 + 暴力破解:2-10 分钟(取决于字典大小和解析器)
- takeover-hunt 本身:在生成的 hosts 列表上需 30秒-2分钟
## 匹配器如何做出判定
对于每个至少具有一个 CNAME 或 NXDOMAIN 的主机,匹配器会遍历
指纹列表并执行以下操作:
1. 跳过其 `cname` 后缀未出现在该主机的 CNAME 链中的指纹。
2. 根据指纹的 `nxdomain` 标志进行分支判断:
- **`nxdomain: true`** — 接管信号为 DNS 失败(CNAME 指向
未被声明的资源)。如果主机返回 NXDOMAIN,则为 **vulnerable** (易受攻击);
如果主体与指纹匹配,则为 **not vulnerable** (不易受攻击)(资源
已被注册,该信息是平台自身发出的)。否则:需进一步调查。
- **`nxdomain: false`** — 接管信号为主体指纹。正则
匹配响应主体。当上游设置
`vulnerable: true` 时,置信度为 `high` (高);对于已记录的边缘情况则为 `medium` (中)。
3. 如果没有任何匹配,但主机具有 CNAME 链 *且* DNS 返回
NXDOMAIN,则会发出“Unknown dangling CNAME”(未知悬空 CNAME)的发现结果以供人工审查。
## 开发
```
pip install -e ".[dev]"
pytest
```
## 许可证
MIT。
标签:Bug Bounty, C2日志可视化, CNAME解析, DNS安全, DNS接管, GitHub, JSON报告, Markdown报告, NXDOMAIN, Python, 可自定义解析器, 域名安全, 域名接管检测, 多平台, 多源侦察, 子域名接管, 子域名枚举, 实时处理, 开源安全工具, 悬挂CNAME, 指纹识别, 数据展示, 无后门, 正则匹配, 系统安全, 红队, 网络安全, 脆弱性检测, 自动化侦察, 自动化报告, 赏金猎人, 逆向工具, 逆向工程平台, 隐私保护