Imported from HeaSec/Pentest-Lyan (
SKILL.md). Install upstream withnpx skills add HeaSec/Pentest-Lyan. Copyright stays with the author (MIT).
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 → 不跟随,记
blindspotsBLOCKED) - 禁止删除已存在的真实业务数据或其他用户预存数据
退出条件(目标驱动, 非步骤)
全部满足才允许出报告:
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 → Readpentest-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 由用户在启动时显式声明, 不从用户名推断。