krutarthshukla/bounty-recon
GitHub: krutarthshukla/bounty-recon
一款基于 Claude Code 的自动化漏洞赏金侦察与扫描工具,将攻击面枚举、机密检测和多类别漏洞扫描串联为一条 pipeline 并自动生成报告。
Stars: 0 | Forks: 0
# bounty-recon
将其指向一个目标,它会从“这是一个组织和一些域名”走向“这是一份值得关注的列表”——枚举攻击面、收集 URL、通过 GitHub 进行枢轴分析,以在官方组织和员工个人仓库中查找泄露的机密、运行一批自动化漏洞检查,并将其发现编写为 HackerOne 风格的报告(Markdown 和 PDF)。该方法遵循常见的 Jason Haddix / NahamSec 剧本,并在枚举阶段依赖于 `subdomain-recon`。
大多数傻瓜式扫描仪止步于 Nuclei 模板,而本项目将整个工作流串联在一次运行中,并涵盖了那些工具通常遗漏的类别——JWT 攻击、GraphQL 深度测试、SSTI、批量分配、host-header injection、shadow/legacy API、CRLF injection、403/401 访问控制绕过、source-map 泄露以及多云公共资产枚举。机密使用 TruffleHog v3 进行扫描,仅限 **已验证**(每个候选项都会针对其提供商的 API 进行实际触发测试),因此你不必在 HackerOne 将其关闭并标记为 N/A 的未经验证的正则表达式噪音中艰难筛选。JSLuice 通过 AST 解析从压缩的 JS 中提取 endpoint + 内联机密候选。Kiterunner 使用 Assetnote 超过 80 万条的 Swagger 抓取词表来暴力破解 REST 路由。然后,pipeline 会标记出可能的攻击*链*(例如 SSRF → 云元数据 → IAM 密钥)。
## 如何使用它
这是一个 Claude Code 技能,因此运行它最简单的方法就是直接用通俗的英语提问:
- `bounty recon Acme`
- `bug bounty scan acme.com`
- `find vulns in acme.com, acme.io`
给它一个**组织名称**,它会发现并验证所拥有的根域,然后再扫描所有内容;给它一个或多个**域名**,它将准确扫描这些域名。模式会根据你的输入进行检测——你无需手动选择。为了捕获 blind XSS 和 SSRF,请将一个 collaborator/interaction host 作为第二个参数添加进去。首次运行会自动安装工具链(仅限一次),结果将存放在 `~/Desktop/` 下的一个独立文件夹中。
更喜欢使用终端?同样的操作只需运行一条命令——请参阅下方的[快速开始](#quick-start)。
## 它的功能
- **枚举子域名**:将整个侦察阶段交给 `subdomain-recon` 的引擎处理——org(组织)→ 发现 + 验证所拥有的根域 + 全面枚举(被动、高级、暴力破解 / 排列组合 / TLS-SAN);domain(域名)→ 直接处理。与 `subdomain-recon` 独立运行的流程完全一致。
- **探测存活状态并截图。** 使用 `httpx` 进行技术检测,使用 `gowitness` 进行截图,让管理面板和登录页面一目了然。
- **收集 URL**:来自 Wayback Machine、GAU(Wayback + CommonCrawl + AlienVault + URLScan)以及主动的 `katana` 爬取。
- **通过 GitHub 进行枢轴分析。** 解析官方 GitHub 组织(CONFIRMED 级别),并通过两种方式发现员工的个人仓库:公开的组织成员身份,以及**代码搜索 `"@acme.com"`**——找出那些在提交的 config / `.env` 中硬编码公司邮箱的仓库(真正的泄露途径)。每个仓库都会被划分为 `CONFIRMED` / `LIKELY` / `POSSIBLE` 级别。
- **扫描经过验证的泄露机密**:在收集到的 JS bundle 和每个已发现的 GitHub 仓库中使用 **TruffleHog v3**。`--only-verified` 意味着每个匹配项在被标记之前都会针对其提供商的 API 进行实际触发测试——没有正则表达式误报。
- **运行 22 项自动化漏洞检查**——Nuclei CVE、XSS、SSRF、CORS、开放重定向、暴露的敏感文件、已验证的机密扫描、SQLi 筛查、端口扫描、JWT 攻击、host-header injection、GraphQL 深度测试、SSTI、批量分配、vhost 发现、shadow API、NoSQL injection、基于 AST 的 JSLuice JS 分析、Kiterunner API shadow-route 发现、CRLF injection、403/401 绕过、source-map 泄露以及 Azure/GCP 云资产枚举。
- **为你指明需要手动测试的部分。** 它会标记出可能的 IDOR、身份验证和业务逻辑候选项——这些是自动化工具可以发现但无法确认的漏洞。
- **生成报告**:包含严重程度统计的 Markdown 报告,以及你可以直接交付的 PDF。
## 要求
- Python 3.9 或更高版本
- 在此技能旁边安装了 `subdomain-recon`(用于枚举阶段)
- 安装程序设置的工具(完整列表见下文)
- 可选:如果需要检测 blind XSS 和 SSRF,可提供一个 collaborator/interaction host
`install_tools.sh` 是幂等的且跨平台(macOS + Linux),如果缺少任何内容,`run_all.sh` 会自动调用它——包括它所依赖的 `subdomain-recon` 工具链。系统会检测已安装的工具,并且绝不会重复安装。
### 它安装/使用的工具
此技能复用了 `subdomain-recon` 为枚举安装的所有工具,以及其自身的扫描工具集:
| 组别 | 工具 |
|-------|-------|
| 漏洞扫描 | `nuclei`(+ 模板)、`dalfox`、`naabu`、`sqlmap`(仅用于筛查) |
| Fuzzing / 内容发现 | `ffuf`、`feroxbuster`、`arjun`、`x8`、`kr` (kiterunner) |
| URL 收集 / 爬取 | `gau`、`waybackurls`、`katana`、`hakrawler` |
| 过滤 / 重写 | `gf`(+ patterns)、`qsreplace`、`kxss`、`unfurl`、`anew`、`httprobe` |
| 截图 | `gowitness` |
| 接管 / CORS | `subjack`、`baddns`、`corsy` |
| 机密(已验证) | `trufflehog` v3 |
| JS 分析 | `jsluice` (AST)、`sourcemapper` |
| 云 / 资产枚举 | `s3scanner`、`cloud_enum`、`cdncheck`、`tlsx` |
| 绕过 + 注入 | `crlfuzz`、`bypass-403` |
| GraphQL | `graphw00f`、`clairvoyance`、`graphql-cop` |
| 报告 | `reportlab` / `pdfkit` (Markdown → PDF) |
如果某个工具无法在特定主机上安装,则会跳过该检查,并继续执行其余的运行。
## 安装
你无需手动运行此操作——`run_all.sh` 会自动安装(两个工具集中的)任何缺失内容。但如果要手动设置(或刷新):
```
bash scripts/install_tools.sh
source ~/.recon-tools/activate.sh
```
## 快速开始
一条命令即可完成整个运行过程。给它一个组织名称或者一个/多个
域名(模式自动检测);可选的 collaborator host 可开启 blind XSS/SSRF 检测:
```
# Org name → 发现 + 验证 roots,枚举,然后扫描所有内容
bash scripts/run_all.sh "Acme Corp"
# Domains → recon + 准确扫描这些
bash scripts/run_all.sh "acme.com,product.io"
# 添加 collaborator host 以捕获 blind XSS 和 SSRF
bash scripts/run_all.sh "Acme Corp" your.collab.host
```
运行的所有内容都将存放在 `~/Desktop/_/` 下:
- `_bounty_report.md` / `.pdf` — HackerOne 风格的报告
- `run.log`、`recon/`(嵌套的 subdomain-recon 运行),以及如果中途中断会生成 `findings_partial.json`
## 参数标志
```
bash scripts/run_all.sh "" [collab_host]
```
| 参数 | 是否必需 | 作用 |
|----------|----------|--------------|
| target | 是 | 一个**组织名称**(→ 发现 + 验证 + 枚举每个拥有的根域,然后扫描)**或**一个/多个逗号分隔的**域名**(→ 侦察 + 准确扫描这些域名)。自动检测。 |
| `collab_host` | 否 | 一个 Burp Collaborator / interactsh 主机。提供此项将开启 blind XSS 和 SSRF 检测;如果省略,将跳过这两项检查。 |
这是唯一的可选配置项——其他所有操作均自动运行。
## 工作原理
你给它一个组织和一些域名;它会运行侦察,然后是扫描,最后是报告。每一个步骤都为下一步提供数据。
```
org name + seed domains [+ collaborator host]
│
┌──────────────▼───────────────┐
│ Phase 0 Install │ one-time toolchain setup
│ │
└──────────────┬───────────────┘
│
┌──────────────▼───────────────┐
│ Phase 1 Subdomain Recon │ delegates to subdomain-recon's full
│ │ engine (discover+validate+enumerate)
└──────────────┬───────────────┘
│ subdomains
┌──────────────▼───────────────┐
│ Phase 2 Live Probe + Shots │ HTTP tech-detect + screenshots
│ │ (spot panels/logins)
└──────────────┬───────────────┘
│ live hosts
┌──────────────▼───────────────┐
│ Phase 3 URL Collection │ Wayback + GAU + active crawl
│ │
└──────────────┬───────────────┘
│ collected URLs
┌──────────────▼───────────────┐
│ Phase 4 Vulnerability Scan │ 22 automated phases (A–W)
│ │ → JSON findings
└──────────────┬───────────────┘
│ findings
┌──────────────▼───────────────┐
│ Phase 5 Manual-Assist Hunt │ surfaces IDOR/auth/logic candidates
│ (operator-driven) │ for human validation
└──────────────┬───────────────┘
│
┌──────────────▼───────────────┐
│ Phase 6 Report │ Markdown + PDF report (~/Desktop)
│ │
└───────────────────────────────┘
```
| 阶段 | 覆盖内容 | 工具 | 输入 → 输出 |
|-------|----------------|---------|----------|
| **0** | 安装 | 内置安装程序 | — → 工具链位于 `~/.recon-tools` |
| **1** | 子域名侦察 | `subdomain-recon` 完整引擎(发现 + 验证 + 枚举) | 组织/域名 → 子域名 |
| **2** | 存活探测 + 截图 | `httpx`、`gowitness` | 子域名 → 存活主机 + 截图 |
| **3** | URL 收集 | Wayback、GAU、katana | 存活主机 → 收集到的 URL |
| **4** | 漏洞扫描 | Nuclei、dalfox、naabu、……(下文 22 项检查 A–W) | 存活主机 + URL → JSON 发现 |
| **5** | 手动辅助挖掘 | IDOR / 身份验证 / 参数发现 | URL → 待审查候选项列表 |
| **6** | 报告 | Markdown + PDF 生成器 | 发现结果 → `~/Desktop/_bounty_report.{md,pdf}` |
当你使用一键命令时,除了阶段 5 之外的所有操作都会自动运行。阶段 5 需要你自己完成——工具只是为你提供一份候选名单;确认和编写报告仍属于手动工作。
### 22 项漏洞检查(阶段 4)
| 检查项 | 方式 | 捕获目标 |
|-------|-----|-----------------|
| A | Nuclei 严重/高危模板 | CVE、暴露的面板、默认凭据、接管 |
| B | XSS (`gf` + `dalfox`) | 反射型、存储型、DOM 型 XSS |
| C | SSRF (`gf` + `qsreplace` + collaborator) | 服务器端请求伪造 |
| D | CORS (origin reflection test) | 带凭据的跨域访问 |
| E | 开放重定向 (`gf` + `qsreplace`) | 钓鱼帮凶 |
| F | 敏感文件 (ffuf 风格) | `.git`、`.env`、`/admin`、`/actuator`、swagger |
| G | 机密 (`trufflehog` v3 仅限已验证,JS + GitHub 仓库) | 实时 API 密钥 / token / 数据库凭据,且具有提供商确认的有效性 |
| H | SQLi 筛查 (`gf` + 错误检测) | SQL 注入候选项 |
| I | 端口扫描 (`naabu`) | 暴露的数据库、Redis、SSH、VNC |
| J | JWT 攻击 | `alg:none`、RS256↔HS256 混淆、kid 注入、弱密钥 |
| K | Host header injection | 密码重置中毒、缓存中毒 |
| L | GraphQL | 内省、mutation 绕过身份验证、批量请求 |
| M | SSTI | Polyglot → 针对各引擎的 RCE 确认 |
| N | 批量分配 | `is_admin:true` 在 API PUT/PATCH 中被接受 |
| O | VHost 发现 | Host-header fuzzing 可发现不在 DNS 中的应用 |
| P | 内容发现 (`feroxbuster`) | 使用 Assetnote 字典发现隐藏路径 |
| Q | Shadow API | 在 `/v2/` 发布后依然存活的旧 `/v1/` endpoint |
| R | JSLuice (AST JS 分析) | 压缩 bundle 内部的 endpoint + 机密候选项 |
| S | Kiterunner (API shadow-route 发现) | 通过 80 万+ Swagger 抓取路由发现未公开的 REST endpoint |
| T | CRLF injection (`crlfuzz`) | Header 注入 → 缓存中毒 / 响应拆分 |
| U | 403/401 绕过 | 在受限 endpoint 上的路径技巧 + header 绕过 |
| V | Source-map 泄露 | 泄露的 `.js.map` 文件 = 完整原始源代码暴露 |
| W | 云公共资产枚举 (`cloud_enum`) | 公开的 Azure 存储/blobs/vaults + GCP buckets/Firebase RTDB |
## 运行单个步骤
```
# 阶段 3 — 收集 URL
bash scripts/url_collect.sh /tmp/br_live.txt /tmp/br_urls.txt
# 阶段 4 — 漏洞扫描
python3 scripts/vuln_scan.py \
--live /tmp/br_live.txt \
--urls /tmp/br_urls.txt \
--domain acme.com \
--org "Acme Corp" \
--out /tmp/br_findings.json \
--collab your.collab.host
# 阶段 6 — 报告
python3 scripts/report.py \
--findings /tmp/br_findings.json \
--org "Acme Corp" \
--output ~/Desktop/Acme_bounty_report.md
python3 scripts/pdf_report.py \
--markdown ~/Desktop/Acme_bounty_report.md \
--output ~/Desktop/Acme_bounty_report.pdf
```
所有漏洞检查始终运行——没有跳过开关。添加 collaborator host 可开启 blind XSS / SSRF 检测:
```
python3 scripts/vuln_scan.py ... --collab your.collab.host
```
## 选项参考
| 标志 | 是否必需 | 描述 |
|------|----------|-------------|
| `--live` | 是 来自 `httpx` 的存活主机文件 |
| `--urls` | 是 | 收集到的 URL 文件 |
| `--domain` | 是 | 主要目标域名 |
| `--org` | 否 | 组织名称 |
| `--out` | 是 | 输出 JSON 发现文件 |
| `--collab` | 否 | 用于 SSRF / blind XSS 的 collaborator 主机 |
`report.py`: `--findings` `--org` (默认为 `Target`) `--output`
`pdf_report.py`: `--markdown` `--output`
`url_collect.py`: `--live` `--output`
## 手动部分
扫描器负责找出候选项;你来确认它们。这些通常赏金最高的类别,都需要人工介入:
- **IDOR / BOLA** — 交换用户 ID,看看是否能访问另一个账户的数据。
- **身份验证绕过** — JWT `alg=none`、密码重置流程、SSO 配置错误。
- **业务逻辑** — 速率限制绕过、负数值、跳过支付步骤。
- **批量分配** — 后端不应允许你写入的额外 JSON 字段。
- **GraphQL** — 先进行内省,然后是隐藏的 mutation,最后是权限提升。
## 值得记住的事项
- 收购通常是最丰富的目标——两个系统拼接在一起的缝隙处往往存在权限缺口。
- `nuclei -as` 会根据检测到的技术挑选模板,因此你不必拿所有模板去测试所有内容。
- 大多数真正能拿到赏金的漏洞(IDOR、BOLA、SSRF)只有在身份验证通过后才会出现,因此请在登录状态下进行测试。
- 将 `gf` 管道输入 `qsreplace` 可让你一次性对数千个 URL 中的参数进行 fuzz。
- 如果无法手动复现,就不要报告。
- 以影响开头。“攻击者可以读取所有用户的 PII” 每次都比 “发现了一个 XSS” 更有说服力。
## 关于范围的一点说明
- 严格遵守拥有活跃漏洞赏金范围或书面授权的项目。
- 仔细阅读范围说明,不要涉及任何被标记为范围之外的内容。
- 不进行破坏性测试——不使用真实的 `sqlmap --dump`,不使用 DoS payload。
- SQLi 检查仅筛查错误签名——它绝不会导出数据。
- 保持合理的扫描速率。
## 作者
Krutarth Shukla
vuln_scan.py
| 标志 | 是否必需 | 描述 |
|------|----------|-------------|
| `--live` | 是 来自 `httpx` 的存活主机文件 |
| `--urls` | 是 | 收集到的 URL 文件 |
| `--domain` | 是 | 主要目标域名 |
| `--org` | 否 | 组织名称 |
| `--out` | 是 | 输出 JSON 发现文件 |
| `--collab` | 否 | 用于 SSRF / blind XSS 的 collaborator 主机 |
report.py / pdf_report.py / url_collect.py
`report.py`: `--findings` `--org` (默认为 `Target`) `--output`
`pdf_report.py`: `--markdown` `--output`
`url_collect.py`: `--live` `--output`
标签:Bug Bounty, CISA项目, StruQ, 可自定义解析器, 实时处理, 密码管理, 应用安全, 运行时操纵, 逆向工具