文章总结: 本文介绍基于ClaudeCode扩展机制构建可控漏洞挖掘系统的工程实践。核心思路是将AI的不确定性约束在工程系统内,通过skills自动路由工具、三道质量门(验证门、策略归一门、事实固化门)确保输出可靠、scope硬约束hook强制阻断越界、以及双层学习闭环积累经验。系统强调prompt管SOP、script管判断、hook管边界、schema管数据,最终由代码而非AI拍板,有效控制误报并提升持续挖掘效率。 综合评分: 95 文章分类: 渗透测试,漏洞分析,红队,安全工具,AI安全
基于 Claude Code 构建可控,持续漏洞挖掘
原创
whoami4936 whoami4936
SecurityPaper
2026年7月1日 15:45 江苏
在小说阅读器读本章
去阅读
挖挖挖!挖漏洞
为什么直接让 AI 挖洞会翻车
半年前我让 AI 直接测一个目标。它跑完报了 12 个漏洞,我逐个验证,11 个假的。
根因不是模型笨,是渗透测试的要求和 AI 的天性正好相反。AI 擅长发散联想,渗透测试要的是收敛克制。具体表现为五个确定性的失效模式:
scope 漂移——AI 看到”有意思”的域名就去戳,忽略授权边界。扫描器结果轻信——AI 直接采信 nuclei 输出,不做独立验证,误报率 60% 起。状态遗忘——上下文压缩后丢失已测记录,重复测或漏测。判定不一致——同一个 CORS * 响应,不同时间 AI 给不同结论。经验不沉淀——每次从零开始,不积累有效策略。
这五个问题不是调 prompt 能解决的。我基于 Claude Code 的原生扩展机制搭了套系统解决它们,在几个 SRC 实测下来误报可控。下面讲架构。
Claude Code 的八类扩展机制
Claude Code 不只是聊天框。~/.claude/ 目录下有八类扩展点,每类有明确职责边界:
~/.claude/
├── commands/ 斜杠命令入口(/hunt)
├── hooks/ 工具调用前的硬拦截器(scope 强制)
├── agents/ 角色定义 + 阶段 SOP
├── skills/ 工具说明书(AI 按 description 自动路由)
├── scripts/ 确定性逻辑(11 个 Python 脚本)
├── schemas/ 数据契约(六态 verdict 枚举)
└── workflows/ 阶段契约(phase_manifest.json)
核心设计原则是职责分层:prompt 管 SOP(怎么测),script 管判断(判什么),hook 管边界(能不能跑)。能代码化的绝不写进 prompt——prompt 越长 AI 越不可控。
下面讲三个最关键的设计。
设计一:Skills 让 AI 自动选工具
渗透测试一堆工具。传统做法是写脚本串起来。Claude Code 的 Skills 机制更聪明——你给每个工具写份说明书,AI 自己判断该用哪个。
机制在 SKILL.md 的 description 字段。Claude Code 读所有 skill 的 description,按当前任务语义自动路由:
# fofa/SKILL.md
description: "FOFA 资产收集:子域拉取、反查同集团资产。
当用户要做资产发现、按公司名找关联资产时使用。"
你说”查这个公司有哪些资产”,AI 自动调 fofa,不用你指定工具名。
更关键的是工具领地设计——每个 skill 显式声明”何时不用我”,定义工具间边界:
# fofa/SKILL.md 的 "不要使用" 段
- 存活检测 → httpx(FOFA 只给历史测绘,非实时)
- 指纹识别 → xingfinger
- 漏洞扫描 → nuclei
AI 读到这些边界就不会越权。我写了十几个这样的 skill,覆盖从资产发现到漏洞扫描的完整链路。
Skills 的真正价值不只是调公共工具——你可以把自己的私有 POC、定制字典、检测规则都沉淀成 skill。AI 会按需自动调用它们,等于把个人积累的经验变成了一套会自动运转的工具库。具体沉淀了什么内容这里不展开,但这是整个系统里最值得长期投入的部分。
设计二:三道质量门串行,数据单向流动
这是系统可靠性的核心。整个流水线 16 个阶段,其中 7 个是 blocking 硬关卡。但流水线本身不稀奇——真正可靠的是三道质量门。
数据流单向,不可跳过:
扫描器产出"候选" → ★验证门 → ★策略归一 → ★事实固化 → 报告
验证门:不复现不入库
所有扫描器输出(nuclei / fuzzer / 手工)只算”候选”,不算漏洞。候选必须经独立复现才能入库。
“独立”是关键。验证 agent 新开干净上下文,自己发请求,不照抄扫描器结论。按漏洞类设精确门槛,不一刀切:
| 漏洞类 | CONFIRMED 条件 |
| — | — |
| CORS | ACAO 回显 + ACAC=true + 敏感数据 + 跨域可读,四者全满足 |
| SQLi | 布尔差异:' OR 1=1-- vs ' OR 1=2-- 响应长度真有差 |
| IDOR | 对象 ID 替换 + 双身份响应内容差异 |
| SSRF | OOB 回连可重复 |
| RCE | 命令回显(id/whoami)或 OOB,不植入 webshell |
策略归一门:代码审稿防误报升级
即使复现了,结论还要过 verdict_policy.py 的确定性归一。这层专门处理 AI 容易夸大的高噪声漏洞。
核心逻辑:按漏洞类检查 impact evidence,只允许降级不允许升级。以 Clickjacking 为例:
# 简化逻辑
ifis_clickjacking(text):
ifis_sensitive_action(text) andis_authenticated(text):
return"CONFIRMED" # 登录后敏感操作可劫持 = 漏洞
ifis_public_page(text):
return"INFO_ONLY" # 公共首页能嵌入 = 不算事
return"AUTH_NEEDED" # 需登录态验证 = 转队列
这层是代码不是 prompt,所以每次给一样的判断。 AI 说”这是 Clickjacking 漏洞”,代码查这是公共首页还是敏感操作,代码拍板。
事实固化门:schema 校验 + 单向渲染
归一后由 finding_writer.py 固化。这层做三件事:
schema 运行时校验——读 finding_schema.json 的 enum 约束,校验每条记录。不合规的 verdict 降级 UNCONFIRMED、severity 降级 unknown,--strict 模式直接拒绝入库。校验逻辑纯标准库实现(不依赖 jsonschema 第三方包),enum 从 schema 文件读取,改 schema 即生效。
全量写入 finding_records.jsonl——这是唯一事实源。
单向渲染——报告 agent 只能读 JSON 渲染,不能改 verdict/severity。状态裁决优先级写死在 report-agent 的 prompt 里:finding_records.jsonl > findings/*.md。防止报告层为”好看”而篡改事实。
设计三:Scope 硬约束——hook 代码强制,不靠 prompt
渗透测试第一红线是 scope。AI 天性是”看到有意思的域名就去测”,可能打出授权外的真实生产系统。
Claude Code 的 Hooks 机制给了解法。在 settings.json 注册 PreToolUse hook,AI 每次执行命令前先过拦截器:
"hooks": {
"PreToolUse": [{
"matcher": "Bash|PowerShell",
"hooks": [{"command": "powershell ... hunter-guard.ps1"}]
}]
}
hook 通过 stdin 收工具调用事件,通过 exit code 控制:exit 0 放行,exit 2 阻断。
hunter-guard.ps1 从命令里提取目标候选(6 种来源:URL 正则 / -u 参数 / Host header / 列表文件 / 子域命令 / MCP 工具字段),和 scope.txt 比对。匹配规则:
- 根域
example.com→ 覆盖自身 + 所有子域 - 子域
api.example.com→ 覆盖自身 + 其子域,不覆盖兄弟域 - IP 精确匹配,CIDR 字节级掩码计算
越界直接 exit 2,AI 根本执行不了那条命令。 这是”prompt 软约束”和”hook 硬约束”的根本区别——prompt 是请求(AI 可能不听),hook 是强制(绕不过)。
fail 策略的设计取舍:解析层 fail-open(hook bug 不该卡死所有命令),scope 层 fail-closed(宁可误拦不可放行越界)。
设计四:双层学习闭环
AI 天然缺陷是”下次从零开始”。系统用两层闭环解决:
短期闭环(单次 engagement 内)——strategy_feedback.py 把验证结果反馈成信号权重:
CONFIRMED → 奏效信号 +8.0(加权)
FALSE_POSITIVE → 误导信号 -8.0(降权)
AUTH_NEEDED/OOB_NEEDED → +2.0(非失败,保留重访价值)
权重硬限 [-30, +40] 防止单信号过度支配。下一轮 signal_fusion.py 读权重加到候选 score 上。
长期闭环(跨 engagement)——reflect-agent 把 confirmed 漏洞蒸馏成 pattern:
{
"fingerprint": {"tech": ["Spring Boot"], "endpoint_signals": ["/actuator/env"]},
"vuln": {"class": "INFO_LEAK", "severity": "high"},
"exploit": {"method": "GET /actuator/env", "validation": "返回含 datasource.password"}
}
追加到全局经验库 patterns.jsonl。下次新 engagement 的 recon 阶段查这个库——”这种指纹历史上出过什么洞”——直接定向测。第三次用时体感明显不同于第一次,不是模型变聪明了,是经验库在积累。
payload 脱敏(<param>/<target> 占位),不写真实凭据——经验库不变成新的泄露点。
Agent 权限分层
每个 typed agent 的 tools 字段按职责精确授权,不是统一给 ["*"]:
| Agent | tools | 理由 |
| — | — | — |
| recon/vuln-scan/verify/exploit | Bash, Read, Write, Glob, Grep | 需 shell 跑工具,但不需 Edit |
| report/reflect | Read, Write, Glob, Grep | 只读数据,物理上无法碰目标 |
| coordinator | ["*"] | 调度大脑,需委派所有阶段 |
执行类给 Bash 但不给 Edit(它们写 jsonl 新文件,不精编代码);report/reflect 没有 Bash(它们不碰目标,物理上无法闯祸)。最小权限不是靠 prompt 自觉,是靠 tools 字段强制。
真实的设计权衡
为什么用文件系统做状态存储,不用数据库——AI 上下文会被压缩丢失,子 agent 间不天然共享记忆。文件系统提供可恢复(中断后 hunter_runner 检查文件契约从断点继续)、可审计(.audit/ 记录所有命令)、跨 agent 共享(读同一批 .hunt/ 文件)。
小结
整套系统的核心思路一句话:把 AI 的不确定性约束在有边界的,可持续运行的工程系统里。
具体落地:prompt 管 SOP(方法论),script 管判断(确定性归一),hook 管边界(scope 硬强制),schema 管数据(枚举校验),skill 管工具(自动路由),agent 管执行(权限分层)。三道质量门串行保证输出可靠,双层闭环让系统越用越准。
AI 可以发现、可以判断,但最终拍板的不是它,是代码。
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:SecurityPaper whoami4936 whoami4936《基于 Claude Code 构建可控,持续漏洞挖掘》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。











评论