daniyalnasir-root/ClaimCheck
GitHub: daniyalnasir-root/ClaimCheck
ClaimCheck 是一个Go语言编写的探针工具,用于验证悬空DNS子域名是否可被实际接管,解决了传统工具只做表面匹配的问题。
Stars: 0 | Forks: 0
# ClaimCheck:验证悬空DNS接管目标是否可实际认领
一个轻量的Go探针工具,它接收子域名列表,识别那些CNAME指向易被接管服务的域名,并判断另一端的资源是否可实际认领。每个发现都附有实际认领所需的精确命令。



## 概述
大多数子域名接管工具仅止步于特征匹配:它们在 `*.azurewebsites.net` 主机上看到 `Web App not found` 就称之为发现。特征匹配是必要的但并非充分条件。现代Azure在没有匹配的CNAME或asuid TXT验证记录的情况下会拒绝绑定自定义域名。AWS S3的桶名是全局唯一的,但你仍需检查该桶名是否在全局命名空间中未被分配,而不仅仅是看前端是否显示 `NoSuchBucket`。Vercel和Cloudflare Pages的项目slug是团队范围内的,因此公开的404页面仅仅是交互的开始。
`ClaimCheck` 执行下一步操作。对于每个候选主机,它解析CNAME,针对七种支持的服务进行分类,执行特定于提供商的可用性探查,并输出以下四种结论之一:`confirmed-claimable`、`requires-provider-auth`、`not-claimable` 或 `error`。对于 `confirmed-claimable` 和 `requires-provider-auth` 的情况,它还会打印出你下一步需要运行的确切 `aws` / `heroku` / `vercel` / `az` / `wrangler` / `netlify` 命令,因此输出是工作流的起点而非终点。
该工具是单二进制文件,接受 `--url` 参数或从 `--from` 文件读取,并输出用于人工审查的箱式面板或每行一个JSON对象以便通过管道传递给下一个工具。
## 功能特性
- 覆盖七种提供商:AWS S3、GitHub Pages、Heroku、Vercel、Netlify、Azure App Service、Cloudflare Pages
- 对每个主机输出四态结论(`confirmed-claimable`、`requires-provider-auth`、`not-claimable`、`error`),并附有理由说明,而非单一的布尔值
- 每个发现都包含下一步操作的命令,即复制即用,且针对主机所指向的具体提供商
- 提供箱式面板和JSON流输出模式,颜色可通过 `--no-color` 和 `NO_COLOR` 开关控制
- 支持直接主机回退:原始 `*.herokuapp.com` / `*.vercel.app` / `*.azurewebsites.net` 候选列表无需中间CNAME跳转即可接受
## 安装说明
```
git clone https://github.com/daniyalnasir-root/ClaimCheck.git
cd ClaimCheck
go build .
```
或者一步完成:
```
go install github.com/daniyalnasir-root/ClaimCheck@latest
```
Go 1.24 或更新版本。运行时无外部依赖,仅使用标准库。
## 使用说明
```
# 探测单个主机
./claimcheck --url admin.target.com
# 从文件批量探测 (每行一个子域名, '#' 用于注释)
./claimcheck --from candidates.txt
# 直接管道输入 subfinder 的输出
subfinder -d target.com -silent | ./claimcheck --from -
# 用于下游工具的 JSON 流
./claimcheck --from candidates.txt --emit json | jq 'select(.verdict=="confirmed-claimable")'
```
一个典型的带计时运行示例:
```
$ time ./claimcheck --from examples/fixtures/sample.txt --no-color
...
summary 1 confirmed-claimable 2 requires-provider-auth 1 not-claimable 0 errors 2 skipped
real 0m2.1s
```
## 命令行选项
### 必需参数(二选一)
| 标志 | 参数 | 描述 |
|---|---|---|
| `--url` | `主机名` | 需要探测的单个子域名 |
| `--from` | `文件` | 包含子域名的文件,每行一个(使用 `-` 从标准输入读取);以 `#` 开头的行和空行将被忽略 |
### 可选参数
| 标志 | 参数 | 描述 |
|---|---|---|
| `--threads` | `数量` | 并发探测工作线程数,默认为 `8` |
| `--timeout` | `秒数` | 每次请求的超时时间,默认为 `8` 秒 |
| `--emit` | `panel\|json` | 输出模式,默认为 `panel` |
| `--no-color` | | 无论是否为终端,均禁用ANSI颜色 |
| `--version` | | 打印版本信息并退出 |
## 输出示例
在 `panel` 模式下,每个主机渲染为一个框:包含结论、服务类型、探查所跟随的CNAME、从中提取的资源名称、理由说明以及下一步命令(如果有的话)。
```
╭─ claimcheck-demo-nonexistent-7f3a.herokuapp.com ───────────────────────────╮
│ verdict ● confirmed-claimable │
│ service Heroku │
│ cname va02.ingress.herokuapp.com │
│ resource claimcheck-demo-nonexistent-7f3a │
│ evidence Heroku returned 'No such app' - the app name is available in │
│ the Heroku global namespace │
│ next heroku apps:create claimcheck-demo-nonexistent-7f3a --region │
│ us │
╰────────────────────────────────────────────────────────────────────────────╯
```
在 `json` 模式下,相同的发现会成为单行JSON,你可以通过管道传递给 `jq`:
```
{"host":"claimcheck-demo-nonexistent-7f3a.herokuapp.com","cname":"va02.ingress.herokuapp.com","service":"Heroku","resource":"claimcheck-demo-nonexistent-7f3a","verdict":"confirmed-claimable","evidence":"Heroku returned 'No such app' - the app name is available in the Heroku global namespace","next_step":"heroku apps:create claimcheck-demo-nonexistent-7f3a --region us"}
```
两个完整的输出捕获文件位于 `examples/run-1.txt`(面板模式)和 `examples/run-2.txt`(JSON模式)。它们所测试的固件(`examples/fixtures/sample.txt`)是手动挑选的,因此输出涵盖了该工具可能产生的所有结论类型,无需实际悬空子域名即可进行测试。
## 法律免责声明
此工具仅用于授权的安全测试和教育用途。
仅针对您拥有或获得明确书面许可的系统运行。
作者对任何滥用行为不承担任何责任。未经授权的使用可能违反地方、州或联邦法律。
## 作者
Daniyal Nasir 是一名 **渗透测试员** 和 **攻击性安全专家**,为财富500强利益相关者和领先科技公司提供 **网络渗透测试**、**云渗透测试**、**云安全评估** 和 **源代码审查** 服务。项目交付范围覆盖亚洲、非洲、拉丁美洲和美洲。他撰写了 **渗透测试服务** 操作手册,并持有 **OSCP**、**CASP+**、**CISA** 和 **CISM** 认证。
https://www.linkedin.com/in/daniyalnasir · https://www.daniyalnasir.com
## 许可证
MIT,详见 LICENSE 文件。
标签:EVTX分析, 日志审计