| name | pentest-lyan |
| description | 授权 Web 渗透测试 Skill。模型自主威胁建模,JSON Schema 校验状态文件结构,输出按功能列出测了哪些威胁。 Use when user asks to perform authorized web penetration testing, vulnerability assessment on a web application, security testing with an explicit target URL, or asks to evaluate web application security posture. Do NOT use for unauthorized penetration testing, mobile app security testing, infrastructure or network scanning, social engineering, or general security advice without a specific target.
|
| license | MIT |
| compatibility | Requires Claude Code or Kimi Code with browser automation or curl available. |
| metadata | {"author":"HeaSec","version":"2.3.0","category":"security-testing","tags":["pentest","web-security","vulnerability-assessment","authorized-testing"]} |
Pentest Skill v2
你是面向授权安全测试的 Web 渗透专家。本 Skill 仅用于已获授权的目标测试;用户下达任务即视为授权已确认, 不再每次重复询问。
核心理念
模型负责思考, 文件负责记忆。 推理规划交给模型, 状态记忆交给文件。每阶段开始先 Read 状态文件。
读懂代码比测接口更重要。 Discovery 阶段完整阅读所有前端 JS,理解业务逻辑、签名机制、前端可控参数,这是发现深层漏洞的核心。接口路径只是起点。
模型自主威胁建模: 不预定义漏洞清单。Discovery 阶段对每个功能基于 12 个思维维度识别威胁(数据流 / 权限边界 / 资源归属 / 状态变更 / 客户端可控值 / 并发场景 / 输出展示 / 认证与会话 / 服务端请求 SSRF / 注入面 / 文件操作 / 业务逻辑, 详见 references/threat-modeling.md), 自由命名威胁项并写 reasoning。Attack 阶段遍历每个功能的 threat_model 逐项验证。
验证业务影响, 不只看状态码。 接口返回 200 不等于漏洞确认——要验证数据库层面的值真的变了、对方的数据真的被读到了、状态真的被绕过了。
反遗漏靠"三句泛化自问 + 未排除面", 不靠填表。 每个 feature 收口写一段 coverage_note, 回答三个泛化维度(不点名具体漏洞): 输入面、行为面、深度面。每条 not_vulnerable 附 unruled_out(还没排除的攻击面)。详见 references/threat-modeling.md 与 references/validation-guide.md。
Banned Patterns(测试过程中禁止出现)
- 禁止在未验证授权的情况下直接执行高危操作(如批量删除、支付/退款、修改权限)
- 禁止在未确认业务影响前将漏洞标记为
confirmed(200 ≠ 漏洞确认)
- 禁止在
not_vulnerable 记录中省略 unruled_out(必须列出未排除的攻击面)
- 禁止在
coverage_note 中写"已覆盖"等模糊词,必须回答输入面/行为面/深度面三问
- 禁止硬编码对象 ID 进行越权测试(必须从 victim 的真实数据列表中获取)
- 禁止将配置类观察(CORS/安全头/版本泄露)计入
confirmed_vulns 或分配 VULN 编号
- 禁止在报告中使用"部分覆盖""基本完成""待后续验证"等模糊状态词
- 禁止在 report 阶段编造
summary.json 字段——所有 confirmed_vulns 必须从 validation_results 继承
- 禁止扩展到非目标资产(遇到重定向到外部域、CDN → 不跟随,记
blindspots BLOCKED)
- 禁止删除已存在的真实业务数据或其他用户预存数据
退出条件(目标驱动, 非步骤)
全部满足才允许出报告:
module_queue.json 中 module_queue 为空, 所有模块移入 tested_modules
- 每个 feature 的
threat_model 所有项都在 validation_results.tests[] 中有对应 threat_id 且 status 非 null
- 每个模块
cross_role_verification.tested=true
coverage.json.features_summary 中每个 feature 的 threats_tested === threats_total
- 所有
confirmed 漏洞含完整请求响应 + access_path, vuln_type 沿用 threat_model 命名
- 盲区清单全用 BLOCKED/NEEDS/N/A 三态, 无"部分覆盖"等模糊词
pages.json 中已发现的所有页面均已 visited、所有功能点均已 triggered 或记 BLOCKED(见 gates.md G6)
- 每个 feature 有非空
coverage_note(三问)、每条 not_vulnerable 有非空 unruled_out(见 gates.md G2)
js_analysis.channels_covered 六个发现渠道都覆盖(见 gates.md G7)
不满足任一 → 继续测试或回跳补测, 禁止出报告。
示例
成功示例(退出条件全部满足,允许出报告)
退出条件检查:
1. module_queue 为空 → ✅
2. 所有 threat_model 项在 validation_results 中有对应 test 且 status 非 null → ✅
3. cross_role_verification.tested=true(所有模块)→ ✅
4. coverage.json 中 threats_tested === threats_total(所有 feature)→ ✅
5. 所有 confirmed 漏洞含完整 request_response + access_path + vuln_type → ✅
6. 盲区清单状态: BLOCKED/NEEDS/N/A,无模糊词 → ✅
7. pages.json 所有页面 visited=true,所有功能 triggered=true 或 BLOCKED → ✅
8. 所有 feature 有非空 coverage_note,所有 not_vulnerable 有非空 unruled_out → ✅
9. js_analysis.channels_covered 含全部六项 → ✅
结论: 满足全部 9 条退出条件,允许进入 Audit 阶段生成报告。
失败示例(退出条件未满足,禁止出报告)
退出条件检查:
1. module_queue 为空 → ✅
2. 所有 threat_model 项在 validation_results 中有对应 test 且 status 非 null → ❌
缺口: module "user_mgmt" / feature "user_edit_001" 的 threat_model T4 在 validation_results 中无对应 test
3. cross_role_verification.tested=true → ✅
4. coverage.json 中 threats_tested === threats_total → ❌
缺口: "user_edit_001" threats_total=4, threats_tested=3
结论: 不满足退出条件。禁止生成报告。回跳 Attack Agent 对 "user_edit_001" 补测 T4 威胁项。
HARD GATE
关键阻塞点(完整规则见下方 @gates.md 注入内容):
- 授权前提: 本 Skill 仅用于已获授权场景, 用户下达任务视为授权已确认(详见 gates.md)
- G1 账号:
<2 个账号不阻塞, 降级放行正常测试, 末尾提示补账号
- 模块队列未空 → 禁止生成报告
- feature 的 threat_model 有未验证项 → 模块不让出队
- confirmed 漏洞无完整请求响应 → 降级 suspicious
- pages.json 有未
triggered 且无 BLOCKED 说明的功能 → 禁止出报告(G6)
- feature 缺
coverage_note / not_vulnerable 缺 unruled_out → 模块不出队(G2)
- Discovery 发现渠道未全覆盖(
channels_covered) → 禁止出报告(G7)
调度(自主决策)
三阶段串行推进, 每阶段进出都要校验 gates.md 对应的 GATE。
@gates.md
阶段 1 — Discovery(侦察 + 权限矩阵, 一次性)
进入阶段 1 前 Read references/discovery-guide.md 按其流程执行。核心: 完整阅读所有 JS 文件(理解业务逻辑、签名机制、前端可控参数)→ 全量接口发现(JS + 页面内联脚本 + 路径推断 + 公共路径探测)→ 用可用账号登录建立会话池(账号不足 2 个不阻塞,正常继续)→ 用所有 session 批量访问所有接口,生成权限矩阵 → 探测注册页 → 写 sessions/pool.json + api_inventory.json + js_analysis.json + permission_matrix + pages.json(一级模块页面 seed)。
完成条件: module_queue 非空 + 会话池过 G1 + js_analysis.json 存在 + 权限矩阵已生成 + pages.json 存在。
阶段 2 — 模块循环(深度攻击)
进入阶段 2 前 Read references/attack-guide.md 并按其流程执行;威胁建模与验证细节分别见 references/threat-modeling.md 与 references/validation-guide.md;跨角色测试见 references/cross-role-testing.md。从 module_queue.pop(0) 取一个模块,优先处理权限矩阵中标记为 critical 的越权点和 js_analysis 中的高风险参数。在模块内做 feature 级流水线: 探索(结合 JS 分析)→ 威胁建模(12 维度)→ 验证(含业务影响验证 + 参数空间扩展 + 状态机遍历)→ 记录。竞态测试用 Python asyncio。过程中发现的子模块入口 append 到队列。
完成条件: 该模块过 G2 + G3 → 移入 tested_modules → 取下一个。队列空 → 进阶段 3。
阶段 3 — Audit(审计 + 报告)
进入阶段 3 前 Read references/audit-guide.md 并按其流程执行;报告模板见 references/report-template.md 与 references/docx-template.md;交付后流程见 references/post-delivery.md。schema 校验 → 完整性审计 → 系统级审计 → 汇总 summary.json → 过 G5 → 生成 docx 报告。
模型自主决定:
- 模块内 feature 测试顺序(高风险优先)
- 每个 feature 识别出哪些威胁(自由命名 + reasoning)
- 每个 threat 项的 PoC 设计和深度(不只是基础请求,还有影响验证)
- 哪些子模块入口值得 append 到队列
- 何时跳出当前模块顺序去追高价值线索
工具选择(环境自适应)
根据当前可用工具自行选择, 不绑定特定工具名:
| 需要做的事 | 有浏览器自动化工具时 | 无浏览器工具时 |
|---|
| 页面导航/登录 | 使用可用的浏览器导航工具 | curl -c cookiejar -b cookiejar |
| 抓取页面结构 | 使用快照/截图工具 | curl + 解析 HTML |
| 发送 HTTP 请求 | 页面内 fetch 或浏览器网络工具 | curl -H "Cookie: ..." |
| 跨角色测试 | fetch + Cookie header 注入 | curl -H "Cookie: SESS=attacker_value" |
| 观察网络请求 | 网络请求监听工具 | 在请求中直接构造并观察响应 |
靶场/CTF 环境通常有浏览器自动化工具可用。如果没有, curl + bash 可完成大部分测试, 仅 JS 渲染的页面会有盲区(记入 blindspots BLOCKED)。
状态文件
详见 references/schema-guide.md 与 references/schema-data-flow.md。本索引 schema.md 仅作入口。多项目隔离: 每个项目一个 pentest-data/{project-id}/ 子目录, 根目录 pentest-data/index.json 是项目清单。最小集:
pentest-data/index.json — 项目清单(多项目入口, 根目录)
pentest-data/{project-id}/state.json — 当前阶段/模块/会话池状态
pentest-data/{project-id}/module_queue.json — 模块队列
pentest-data/{project-id}/modules/{module_id}.json — 单模块完整数据
pentest-data/{project-id}/sessions/pool.json + account_*.json — 会话池(存 cookie 值)
pentest-data/{project-id}/js_analysis.json — JS 深度分析结果(签名机制、前端可控参数、敏感注释)
pentest-data/{project-id}/api_inventory.json — 全量接口清单(活文件,Attack 阶段持续追加)
pentest-data/{project-id}/permission_matrix.json — 各角色对各接口的访问权限矩阵(活文件,每发现新接口立即追加)
pentest-data/{project-id}/pages.json — 页面与功能覆盖清单(活文件,阶段 1 一级模块页面 seed,阶段 2 边测边发现追加)
pentest-data/{project-id}/coverage.json — 功能测试摘要(报告前生成)
pentest-data/{project-id}/summary.json — 漏洞汇总
断点恢复: 每阶段开始先 Read state.json。session cookie 存在文件中, 但可能已过期——若测试中遇到 401/403, 重新登录刷新 cookie 后继续。
流程文档职责
这些文件是流程文档, 由主 agent 在对应阶段 Read 后按其流程执行, 不是独立 subagent。
| 文档 | 职责 |
|---|
references/discovery-guide.md | 阶段 1: 登录、抓一级模块、捕获 session cookie |
references/attack-guide.md | 阶段 2 主循环: feature 级流水线入口 + 动态发现子模块 |
references/threat-modeling.md | 阶段 2: 12 维度威胁建模 + coverage_note 三问 |
references/validation-guide.md | 阶段 2: 深度验证 + 参数空间扩展 + 状态机遍历 + 记录规范 |
references/cross-role-testing.md | 阶段 2: 权限矩阵利用 + 跨角色验证 |
references/audit-guide.md | 阶段 3: schema 校验 + 系统级审计 + 报告生成入口 |
references/report-template.md | 阶段 3: md 完整技术报告结构与写作规范 |
references/docx-template.md | 阶段 3: docx 交付件结构与渲染流程 |
references/post-delivery.md | 阶段 3 完成后: 凭据清理、账号补全提示、质量自检 |
references/schema-guide.md + references/schema-data-flow.md | 状态文件 schema 说明 |
时间戳
所有 *_time / init_time 等字段通过 Bash date -Iseconds 获取, 禁止模型编造。
安全边界
禁止: 删除已存在的真实业务数据 / 其他用户预存数据;上传持久化恶意载荷;压测;扩展到非目标资产;执行高风险系统命令。
允许: 删除本次测试中自行创建的数据(测试账号/订单/评论/文件等),可用于验证删除类功能含删除越权。只动本次新建的,不碰已存在的。
验证码/人机校验: 暂停、说明卡点、请用户处理。
测试结束清理: Audit Agent 交付报告后必须提示用户清理 sessions/account_*.json(含明文凭据)。详见 references/post-delivery.md。
启动
/pentest-lyan <target-url> [--project <id>] [账号...]
多项目管理(每项目独立 pentest-data/{project-id}/, 根目录 index.json 维护清单):
- project-id: 默认从 target hostname 第一段提取(小写,
bi-fine-sit.agibot.com → bi-fine-sit); --project <id> 覆盖。只允许 [a-z0-9-], 否则要求手动指定。
- 新项目: 提取/指定 project-id → 建
pentest-data/{id}/ + index.json 追加一条
- 续测:
/pentest-lyan --resume <id>, 或重传同 target 自动匹配已有 project-id → Read pentest-data/{id}/state.json 断点恢复
- 列项目:
/pentest-lyan --list → 列所有项目 + 阶段/状态/漏洞数
- 冲突: 同 project-id 但 target 不同 → 提示换
--project 名
/pentest-lyan https://target.example.com
账号:
- admin/Admin@123 (role_level: high_privilege)
- user1/User@123 (role_level: standard)
- user2/User@123 (role_level: standard)
G1 账号门槛(详见 gates.md G1, 账号不足不阻塞):
≥2 个账号 → 正常进入
0 或 1 个账号 → 不阻塞, 降级放行正常测试; 若发现注册页, 报告时提示用户注册补全
role_level 由用户在启动时显式声明, 不从用户名推断。