复现作者的测试:Claude-BugHunter的CVE验证实验室与Playwright浏览器自动化实战指南
【免费下载链接】Claude-BugHunterA Claude Code skill bundle for bug hunting and external red-team work - 82 skills, 15 slash commands, 681 disclosed-report patterns curated across 24 core vulnerability classes, plus enterprise identity + infrastructure attack matrices.项目地址: https://gitcode.com/gh_mirrors/cl/Claude-BugHunter
Claude-BugHunter 是一个面向漏洞挖掘与外部红队工作的 Claude Code 技能包:82 个技能、15 条斜杠命令,覆盖 24 类核心漏洞的 681 条公开报告模式。但技能库的"能力"不能只靠文档吹出来——作者在 docs/verification/ 目录下搭建了一整套可复现的 CVE 验证实验室和Playwright 浏览器自动化测试,把"技能说能打的漏洞"一条条在真实目标上打穿,并如实记录通过或失败的结果。本文将带你完整复现作者的测试,理解这套"诚实验证"的打法。
为什么要有 CVE 验证实验室
新手常问:技能文件写得再详细,怎么知道它真能派上用场?作者的答案是:每条结论都要有真实目标、真实响应、真实判定。
所有验证文档都遵循统一的记录模板:
| 记录项 | 说明 |
|---|---|
| 初始提示 | 新手会输入什么样的问题 |
| 自动触发的技能 | 描述字段如何匹配到对应hunt-*技能 |
| 引用的技术 | 直接摘自技能文档的 payload 或手法 |
| 真实攻击结果 | 目标返回的实际 HTTP 响应,通过或失败 |
| 诚实判定 | 明确写出 PASS / 失败 / 需要修正 |
这套文档就在 docs/verification/,每个实验都附可复制的命令和最小化目标源码,任何人都能一键重跑。
快速开始:三个真实 CVE 实验室
CVE 复现全部基于 Docker 容器(vulhub 镜像),不碰任何真实生产系统,新手也能放心练手。
1. Apache 路径遍历:CVE-2021-41773
目标是一台 Apache 2.4.49 容器。利用 alias 路径的规范化缺陷,先用编码路径读取/etc/passwd(文件泄露),再借助/cgi-bin/的Options +ExecCGI把文件读取升级为远程命令执行。
git clone --depth 1 https://github.com/vulhub/vulhub.git /tmp/vulhub cd /tmp/vulhub/httpd/CVE-2021-41773 docker-compose up -d --build完整记录见 apache-cve-2021-41773.md。作者在验证中还发现技能库的短板:hunt-rce技能会给出编码绕过家族(../→..%2F→%2e%2e%2f),方向正确,但缺少"只针对 2.4.49 特定版本""必须走 alias 路径"这类版本级细节——这正是验证实验的价值:技能知道"怎么打",实验室补上"打哪里"。
2. Jenkins 2. Jenkins 未授权文件读取:CVE-2024-23897
CI/CD 服务器是红队的重灾区(源码仓库、云密钥、kubeconfig 都在上面)。Jenkins LTS 2.441 的 CLI 工具存在 args4j@前缀参数展开缺陷,未认证即可用@/etc/passwd这样的参数读取任意文件,该 CVE 当年迅速进入 CISA KEV 利用目录。
目标同样一行命令拉起:vulhub/jenkins:2.441容器,映射端口后下载官方jenkins-cli.jar即可复现。详见 jenkins-cve-2024-23897.md。
3. Spring Cloud Function SpEL 注入:CVE-2022-22963
Spring 系微服务的老熟人。攻击点不在 URL 参数里,而是藏在请求头spring.cloud.function.routing-expression中——服务器会把头里的 SpEL 表达式直接求值,一条 curl 就能在容器内以 root 执行命令。交付向量(哪个端点、哪个头)正是新手最容易卡住的 30 分钟,而实验文档把它完整写了出来。见 spring-cve-2022-22963.md。
💡 三个 CVE 实验的共同模式:先
grep技能库"它知道什么",再列出"它不知道什么",最后给出真实利用。这种先自曝缺口、再现场验证的写法,比纯炫技的写穿更有参考价值。
自研实验台:Phase 2E ~ 2J 与"诚实判定"
除了真实 CVE,作者还在 docs/verification/ 里用最小化 Flask 应用搭了一系列自研实验台,每个实验台只内置一两个故意埋的漏洞,用于验证对应技能能否打穿:
| 实验台 | 覆盖漏洞类 | 技能 | 验证文档 |
|---|---|---|---|
| phase2e-lab | JWTalg=none、GraphQL IDOR、优惠券竞态条件 | hunt-api-misconfig/hunt-graphql/hunt-race-condition | phase2e-jwt-graphql-race.md |
| phase2f-lab | SSTI、OAuth 绕过、文件上传 | 对应hunt-* | phase2f-ssti-oauth-fileupload.md |
| phase2g-lab | SAML、MFA 绕过、XXE | 对应hunt-* | phase2g-saml-mfa-xxe.md |
| phase2h-lab | HTTP 请求走私、缓存投毒(Nginx + 源站双容器) | 对应hunt-* | phase2h-smuggling-cachepoison.md |
| phase2i-lab | LLM 驱动的账户接管(ATO)链 | 对应hunt-* | phase2i-llm-ato.md |
| LocalStack 云实验 | 公开 S3 桶、IAM 提权链 | hunt-cloud-misconfig/cloud-iam-deep | phase2j-cloud-localstack.md |
还有一个反直觉的亮点:hardened-lab(加固实验室)。它内置真实防御(预处理语句、输出编码、限流)和一堆"长得像漏洞其实不是"的行为,专门考验技能库会不会误报。结果 8/8 测试都触发了正确的纪律规则——每一个假阳性被拦截,每一个真漏洞被抓出。完整规则见 hardened-lab-discipline-rules.md。
进阶:Playwright 浏览器自动化,把验证做到"执行层"
前几轮实验有个盲区:很多验证只停留在"源码里有这个漏洞点"(source-verified),没有在真实浏览器里执行 payload。Phase 3.1 用 Playwright + 无头 Chromium 补上了这一课,测试台和自动化脚本都随仓库提供:
- 目标应用:docs/verification/phase3-playwright/target_app.py——一个最小 Flask 应用,内置 DOM XSS 和 OAuth 前缀校验两个漏洞端点
- 自动化脚本:docs/verification/phase3-playwright/harness.py
pip install flask playwright playwright install chromium python target_app.py # 启动目标 python harness.py # 运行浏览器自动化测试测试 28a/28b:DOM XSS 真正"跑"起来
- 28a用
<img src=x onerror="alert(...)">注入 URL hash,脚本监听弹窗事件——无头 Chromium 真的弹出了 alert,说明 JS 在浏览器内执行了; - 28b更实用:payload 写入
window变量,脚本再读回该变量。这个"window 变量副作用"模式可以穿越同源内的多次导航,是验证存储型 XSS 的黄金模式。
测试 29:一次漂亮的"打脸式修正"
最有价值的其实是 Phase 3.1 推翻了 Phase 2F 的一处过度宣称。此前文档声称:对带尾斜杠的前缀白名单(https://acme.example/),提交redirect_uri=https://acme.example/@evil.attacker.example/能把授权码带到攻击者域名。
Playwright 实测结果:
- 尾斜杠前缀下不成立——URL 里
://后第一个/之后的所有内容都是路径,@被浏览器当普通路径字符,授权码留在了acme.example; - 无前缀尾斜杠时才成立——此时
@位于 authority 段,浏览器把localhost:58020解析成 userinfo、把evil.attacker.example当成真正的 host 发起请求,服务端startswith()字符串校验又恰好放行——完整 ATO 链路在浏览器中真实复现。
结论被写回文档并同步更新了 skills/hunt-oauth/SKILL.md:服务端前缀校验缺陷只是必要条件,声称 OAuth → ATO 之前必须用无头浏览器实测最终跳转。全部测试记录见 phase3-playwright-browser-execution.md。
这个浏览器自动化框架还能继续用于:存储型 XSS 确认、开放重定向链、CSRF token 绑定、DOM 污染、XSS 后读 Cookie 等场景。
更进一步:eval 评测框架与复现建议
验证文档之外,仓库还有一套自动化评测框架 eval/:用无头 Claude Code 代理攻击自评分目标(OWASP Juice Shop 通过/api/Challenges自动判分,PortSwigger 实验室通过状态组件判分),对比"启用技能 vs 关闭技能"的解题率、回合数与成本。2026-08-25 的基线数据见 eval/BASELINE.md——其中也诚实地记录了"Juice Shop 已被模型记住,存在天花板效应"这类测量局限。
复现建议按顺序来,每一步都有文档可查:
- 热身:跑 phase2e-lab 等自研实验台,熟悉"提示 → 技能触发 → 攻击 → 判定"的完整闭环;
- CVE 复现:用 Docker 依次拉起 Apache、Jenkins、Spring 三个 CVE 环境;
- 浏览器层:安装 Playwright,跑 phase3-playwright 的 harness,体会执行层验证与源码层验证的差别;
- 防误报:跑 hardened-lab,看看技能库的纪律规则如何拦截假阳性。
⚠️ 纪律提醒:所有实验只针对本地自建、你拥有授权的易受攻击环境。验证框架 eval/README.md 中同样强调这一点——对未授权目标下手是红线。
小结
Claude-BugHunter 最值得新手学习的,不只是 82 个技能本身,而是 docs/verification/ 里这套验证方法论:
- 可复现:每个实验台都有最小化源码和一键启动命令;
- 诚实判定:PASS、失败、甚至"作者自己错了"都如实写进文档;
- 分层验证:HTTP 层打穿 → 浏览器执行层确认 → 加固实验室防误报,层层加码;
- 缺口驱动:CVE 实验同时暴露技能库盲区(缺版本细节、缺 CVE 编号),反哺 skills/ 内容更新。
配合 docs/cve-coverage.md 与 docs/architecture.md,你可以完整看懂这个技能包"声称什么、验证了什么、还差什么"。
【免费下载链接】Claude-BugHunterA Claude Code skill bundle for bug hunting and external red-team work - 82 skills, 15 slash commands, 681 disclosed-report patterns curated across 24 core vulnerability classes, plus enterprise identity + infrastructure attack matrices.项目地址: https://gitcode.com/gh_mirrors/cl/Claude-BugHunter
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考