clutchitggs/hunter-max-oss

GitHub: clutchitggs/hunter-max-oss

一款面向单页应用的 AI 驱动侦察工具,通过深度解析 Webpack 模块联邦 bundle 全面提取隐藏 API 端点,并借助大模型排序攻击面、过滤误报,生成可操作的侦察报告。

Stars: 0 | Forks: 0

# hunter-max-oss [![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE) [![Python](https://img.shields.io/badge/python-3.10%2B-3776AB?logo=python&logoColor=white)](#) [![Anthropic CVP](https://img.shields.io/badge/Anthropic-Cyber%20Verification%20Program-D4A27F)](https://www.anthropic.com/) [![用途](https://img.shields.io/badge/use-authorized%20research%20only-red)](#disclaimer) 一款针对单页应用 (SPA) 的漏洞赏金 (Bug-bounty) 侦察工具。它会提取 SPA 在运行时加载的 JavaScript bundles,解析出隐藏在其中的每一个 API endpoint,通过询问 LLM 筛选出看起来可被攻击的目标,并生成可供人工验证的 markdown 报告。 ## 它是如何工作的 (Deep Read) `src/deep_read/` 是本仓库中执行核心工作的部分。其流程如下: ``` target URL → fetch all JS bundles (incl. Module Federation chunks) → extract API endpoints from minified code → probe for OpenAPI / Swagger / GraphQL specs → one LLM call ranks endpoints by attack potential → kill-list drops known false-positive shapes → markdown report → human verifies → human submits ``` 有趣的部分在于 bundle 的展开。大多数 SPA 侦察工具只会获取浏览器首次加载页面时的两三个入口 bundle。现代应用通常使用 webpack 的 Module Federation:入口 bundle 包含一个指向数十或数百个额外 bundle 的 chunk-name 映射,这些 bundle 会随着用户的点击操作被懒加载。Deep Read 会解析该映射并探测联合微前端 (federated micro-frontend) 宿主,从而将可见的攻击面从约 3 个 bundle 扩展到 100 个以上。 扩展后的攻击面将被解析以提取 endpoint(包括 `fetch`、`axios`、`XMLHttpRequest`、辅助包装器模式、OpenAPI / Swagger 规范、GraphQL 操作),去重后发送给一次 Opus 调用。模型会对它们进行排序并撰写攻击假设。一个包含“看似漏洞,实则不然”模式(401→403 差异、S3 403 存在探测、CloudFront 接管等)的排除列表 (kill-list) 会过滤掉那些历史上曾浪费审核人员时间的无效特征。 最终输出是一个包含分级假设、支持性证据以及用于验证的 curl 单行命令的 markdown 文件。这个文件就是供人工采取行动的产出物。 ## 快速开始 需要 Python 3.10+ 以及 Anthropic 或 OpenAI 的 API key。 ``` git clone https://github.com/clutchitggs/hunter-max-oss.git cd hunter-max-oss python -m venv .venv && source .venv/bin/activate # Windows: .venv\Scripts\activate pip install -r requirements.txt export ANTHROPIC_API_KEY=sk-ant-... # 1. 在 Chrome 中登录目标 (手动处理 WAF / 2FA / SSO) # 2. DevTools → Network → 从任意 XHR 中复制 Cookie header # 3. 运行: python -m src.deep_read app.example.com \ --cookie "session=...; csrf=..." \ --header "Authorization: Bearer eyJ..." ``` 输出结果将存放在 `reports/deep_read/_.md` 中。 ## 生产环境部署 完整的管道 (pipeline) 被设计为长期运行的守护进程 (daemon)。已在运行 Ubuntu 24.04 的 2 GB DigitalOcean VPS 上通过测试;在 Hetzner、Linode 或任何小型云实例上也能同样运行。 推荐配置: - 在 `systemd` 下以 `Restart=always` 运行入口脚本,以便管道能从瞬态错误中自动恢复。使用 `systemctl stop` 进行干净地停止。 - 将 SQLite 数据库持久化挂载到数据卷上;日志输出至 `logs/hunter.log` —— 通过 `logrotate` 进行轮转。 - 在 `config.json` 中设置 `discord_webhook`,以便在发现结果时发送通知。 - 仅在进行一次性的 Deep Read 运行时使用 `tmux` / `screen`;完整的管道应归属于服务管理器管理。 每个目标的内存占用很小(LLM 调用主导了成本,而不是 RAM);按照文档中配置的信号量上限,一个 2 GB 的实例可以轻松处理并发的侦察与分析任务。 ## 实战测试 该工具已通过 Bugcrowd 对多个授权目标进行了测试。诚实的总结如下: - **Aiven** (`regatta.aiven.io` / `admin-api.aiven.io` / 托管 PostgreSQL)。针对配置泄露、admin-API 认证边界、未公开的 endpoint、OpenAPI 暴露、Okta 流程、PostgreSQL 提权、SECURITY DEFINER 源码审计、autovacuum 陷阱以及从数据库容器内部发起的 SSRF,共调查了 11 个攻击向量。**结果:** 每一个声称的绕过在仔细验证下都不攻自破 —— 401→403 的差异被证明是共享 IdP 架构按设计正常工作的结果,未经身份验证的 endpoint 虽对生产数据库进行了验证但并未泄露任何记录,`aiven_extras` 扩展代码很干净,并且 PG17 强制执行了旧 PoC 所依赖的 IMMUTABLE 契约。暴露的 OpenAPI 规范是一个纯粹的 P4/P5 信息泄露发现,但不足以单独提交报告。**未提交,已关闭。** - **Cloudinary**。已提交给 Bugcrowd。候选发现在单一账户场景下可以复现,但未能通过跨账户测试的考验 —— 平台的租户隔离发挥了作用。**作为理论性发现关闭。** **净结果:零确认漏洞,诸多教训。** 成熟的 DBaaS / SaaS 平台将其最优秀的工程技术投入到了租户隔离和共享 IdP 边界上 —— 这是堡垒中最坚固的城墙。高 ROI 的攻击面存在于内部管理工具、通过 JS bundle 分析发现的未公开 endpoint(这正是 Deep Read 的构建初衷),以及防御措施尚未完全成熟的新上线 SaaS 中。排除列表 (kill-list) 现在会过滤掉这些测试中所发现的“看似漏洞,实则不然”的模式。 这份诚实的失败记录正是我现在信任该工具输出的原因:当 Deep Read 标记出某些内容时,排除列表早已过滤掉了历史上出现过类似特征的误报。 ## 早期架构(保留在仓库中,不再是活跃开发路径) 本项目最初是一个更庞大的系统:一个包含子域名侦察、nuclei 扫描、JS-secret 检测、用于主动测试的 Scout-Sniper ReAct agent、五层 LLM 审查(T1 廉价初步分诊 → T2/T3 Sonnet 调查/质疑 → T4/T5 Opus 裁决/挑战)、一个在 LLM 查看发现之前生成自动裁决的仅限 HTTP 的富化层,以及 Discord 通知的异步多阶段管道。 整个系统确实能运行。它只是产生了大量的线索,但极少有能通过人工验证的。在经过公平审查后,我将其精简为 Deep Read + 人工验证。相比之前的大而全,这个精简的循环更真实地反映了时间和 API 开销的转化率。 早期的模块仍然保留在 `src/` 中 —— 目前作为先前设计的参考保留,因为 Deep Read 的排除列表正是从那些误报特征的经验中总结出来的。它们不是推荐的入口点。有关哪些文件属于哪个时代的说明,请参阅下方的“仓库结构”。 ## 仓库结构 ``` src/ ├── deep_read/ ◄── the active tool │ ├── cli.py entry: python -m src.deep_read │ ├── fetcher.py SPA-aware, S3-safe HTTP fetcher │ ├── webpack_chunks.py Module Federation chunk-map expansion │ ├── js_parser.py endpoint extraction from minified JS │ ├── spec_finder.py OpenAPI / Swagger / GraphQL probing │ ├── analyzer.py single Opus reasoning pass + kill-list │ └── report.py markdown report writer │ │ ── earlier-architecture modules (legacy, kept for reference) ── ├── pipeline.py async multi-target orchestrator ├── infinite_hunter.py signal-driven scheduler ├── orchestrator.py per-target phase driver ├── api_mapper.py Katana deep-crawl + spec discovery ├── react_agent.py Scout + Sniper ReAct orchestration ├── scout_agent.py fast lead identification (Sonnet, ReAct) ├── sniper_object.py BOLA + Mass-Assignment specialist ├── sniper_resource.py SSRF + OAST specialist ├── oast_client.py OAST callback client ├── ai_analyzer.py T1–T5 LLM tier review ├── evidence_enricher.py HTTP-only auto-verdict layer ├── nuclei_runner.py nuclei integration ├── js_analyzer.py JS-bundle secret / endpoint scan ├── vuln_scanner.py misc. checks ├── dns_checker.py DNS / HTTP liveness probes ├── wayback.py Wayback Machine URL harvest ├── s3_enum.py S3 bucket enumeration ├── program_scanner.py bug-bounty platform polling ├── scope_checker.py scope-diff detection ├── scope_importer.py scope import ├── cve_monitor.py CVE → affected-target lookup ├── ma_recon.py M&A news → newly-acquired-asset recon ├── target_scorer.py target prioritisation ├── llm_client.py unified Anthropic / OpenAI client + budget ├── report_drafter.py markdown report drafting ├── notifier.py generic notifier ├── notifier_discord.py Discord webhook ├── dashboard.py local Flask status dashboard └── db.py SQLite (targets, findings, react_leads, …) data/ └── wordlist.txt small built-in wordlist templates/ Flask dashboard templates (legacy) static/ Flask dashboard CSS (legacy) requirements.txt config.example.json ``` ## 配置 将 `config.example.json` 复制为 `config.json`。大多数用户会接触的字段: | 字段 | 控制内容 | |--------------------------------------|--------------------------------------------------| | `llm.provider` | `"anthropic"` 或 `"openai"` | | `llm.api_key_env` | 存储 API key 的环境变量 | | `llm.anthropic_balance_usd` | 您当前的余额 | | `llm.stop_at_remaining_usd` | AI 调用停止的余额下限 | 每日预算 (Daily-budget) 和信号间隔 (signal-interval) 字段由旧版管道使用,可直接保留默认值。 ## 免责声明 本软件**仅**用于授权的安全研究: - 明确授权允许自动化扫描的漏洞赏金计划。 - 具有书面授权的渗透测试项目。 - 您自己拥有的目标。 - CTF / 实验室环境。 在未获得书面测试许可的情况下对系统运行此工具,在大多数计算机滥用法下都是违法的(以色列:Computer Law 1995 §2/§4;美国:CFAA 18 USC §1030;英国:Computer Misuse Act 1990;欧盟:NIS2 / 各国同等法律)。 在将工具指向任何目标之前,请先配置范围检查。**作者对滥用行为不承担任何责任。** 作者是 Anthropic Cyber Verification Program 的获批参与者,负责审查 LLM 增强的进攻性安全研究。 ## 许可证 MIT — 详见 [LICENSE](LICENSE)。
标签:API安全, Bug Bounty, DLL 劫持, GraphQL, JavaScript解析, JSON输出, LLM, Module Federation, OpenAPI, Petitpotam, SPA, Swagger, Unmanaged PE, Webpack, Web安全, 侦察工具, 单页应用, 可自定义解析器, 大语言模型, 安全测试, 实时处理, 攻击性安全, 攻击面挖掘, 白帽黑客, 自动化安全审计, 蓝队分析, 逆向工具