AI 驱动的 PTES 渗透测试工作流:用支持 AGENTS.md 的 Agent 打开本仓库,按阶段产出可校验的 target/${ID}/ 工作区与报告。
| 产出 | 位置 |
|---|---|
| 一次评估工作区 | target/${ID}/ |
| 阶段交接 | 各 manifest-phase-*.md + chain-status.md |
| 已验证漏洞 | vulns/vuln-NNN/ + Evidence |
| 客户报告 | report.md(用户语言正文) |
阶段链:0 → 1 → 1b? → 2 → 3 → 4 → 5 → 6(有 Web 口才跑 1b)。
需要:Node.js、Docker(可选 Kali 容器)、能加载 AGENTS.md 的 Agent。
# 克隆后
cd pentester
# Schema / 夹具 / LOOKUP / playbook / 架构 lint
npm run test:all
# Playwright(Web 阶段用浏览器取证)
cd .agents/skills/playwright-skill && npm run setup && cd -
# 可选:扫描容器
docker pull kalilinux/kali-rollingSkill 目录:.agents/skills/(勿提交 Claude/Codex 等宿主镜像树;本地 symlink 见 docs/agents/host-skills.md)。
用 Agent 打开仓库根目录,直接说目标(中英文均可,Agent 跟你的语言回复与写报告):
对 192.168.1.100 做渗透测试
测试 https://app.example.com
Pentest 10.0.0.5,范围仅该 IP,不要碰 10.0.0.0/24 其他主机
Agent 应自动:
- 读
AGENTS.md/ROLE.md/ 当前 phase 过程 - Phase 0:物化工作区、谈清 Scope 与 Authorization
- 你确认授权后:
authorization.md中- status: confirmed - 按链执行 1→…→6,每阶段写 Manifest 并校验
在你未确认 Authorization 前,不得进入 phase ≥1 的进攻动作。
下面用示例:ID=lab1,scan_host=192.168.1.100,扫描环境 docker。
把 lab1 / IP 换成你的值即可。
# 创建 Engagement workspace + 目录 + phase-0 清单骨架
node .agents/schema/materialize.js \
--id lab1 \
--host 192.168.1.100 \
--form IP \
--scan-env docker表单 --form |
含义 |
|---|---|
IP |
以 IP 为主目标 |
DOMAIN |
域名 |
URL |
已有 URL(仍要 Phase 0,RoE 可简化) |
--scan-env |
含义 |
|---|---|
docker |
工具跑在 Kali 容器,挂载 target/lab1 → /target |
host-kali |
本机已有 Kali/工具链 |
然后与 Agent / 客户确认:
- 编辑
target/lab1/scope.md(结构化:allow_hosts/deny_hosts/window/banned) - 编辑
target/lab1/authorization.md→- status: confirmed - 补全
manifest-phase-0.md交接摘要字段
Scope 现在机器可校验:扫描前先过闸门
node .agents/schema/scope-check.js lab1 --host 192.168.1.100(命中deny_hosts会拒绝并退出非零)。
node .agents/schema/validate-target-schema.js lab1 --strict-summary --stamp-chain可选 Docker 骨架(materialize 输出里也有):
docker run -d --name kali-target-lab1 \
-v "$(pwd)/target/lab1:/target" \
-v "$(pwd)/.agents/wordlists:/wordlists:ro" \
kalilinux/kali-rolling sleep infinity# 阶段地图(权威来自 schema.json)
node .agents/schema/validate-target-schema.js --print-phase-map
# 当前阶段上下文边界(Session packet)
node .agents/schema/validate-target-schema.js --print-session-packet 1
# Phase 1 产出计划 + 环境键
node .agents/schema/validate-target-schema.js --print-plan 1 \
--id lab1 --host 192.168.1.100 --scan-env docker
# 工具路径 / Evidence 环境变量(可 eval)
node .agents/schema/env-render.js --scan-env docker --id lab1 --host 192.168.1.100
eval "$(node .agents/schema/env-render.js --scan-env docker --id lab1 --host 192.168.1.100 --export)"
# 一屏 engagement 状态(给人看:阶段 / 各 severity / 覆盖度 / 下一步)
node .agents/schema/status.js lab1过程步骤:只读 .agents/phases/ 里当前阶段文件(不要拿 examples/DC-* 当模板)。
Agent 按 phases/01-intelligence.md 扫端口 / 服务 / 摘要,写入 ports/、services/、recon-summary.md,填 manifest-phase-1.md。
# 交接摘要里 web_ports 非空 → 必须做 1b;为 none 则可跳过 1b
node .agents/schema/validate-target-schema.js lab1 --strict-summary --stamp-chain仅当 Phase 1 发现 Web 口。
# 浏览器在**宿主机**;Evidence 路径只来自 env-render
eval "$(node .agents/schema/env-render.js --scan-env docker --id lab1 --host 192.168.1.100 --export)"
mkdir -p "$EVIDENCE_DIR" "$SCREENSHOT_DIR"
# 用 playwright-skill 写 /tmp 脚本,截图落到 EVIDENCE_DIR
# Web 攻击手册(禁止瞎编 payload)
node .agents/skills/src-hunter/playbook.js --signal "unauth,info,idor"
# Read 返回的 playbook 路径后再测产出:services/function-map.md、截图、vulns/playwright/ 等 → manifest-phase-1-web.md → 再 validate … --stamp-chain。
| 阶段 | 过程文件 | 你要盯的结果 |
|---|---|---|
| 2 | phases/02-threat-modeling.md |
threat-model.md(优先级,不是漏洞清单) |
| 3 | phases/03-vulnerability-analysis.md |
确认后的 VULN-NNN + Evidence;分诊台账 vulns/triage.md;威胁覆盖 threat-coverage.md |
| 4 | phases/04-exploitation.md |
exploit-log.md、access.md |
| 5 | phases/05-post-exploitation.md |
post-exploitation/*(仍在 Scope 内) |
Phase 3 新增两个可审计台账(校验器会 gate):每条 Raw scan result 记去向到
vulns/triage.md(交接triaged_count);每个priority_threat记终态到threat-coverage.md(交接threat_coverage)。有原始扫描/优先威胁却缺台账 →--strict-summary报错。
常用:
# 策展知识(按阶段硬分袋)
node .agents/bin/lookup.js --phase 3 --keywords "sqli,ssrf"
# Web playbook
node .agents/skills/src-hunter/playbook.js --signal "sqli,idor"
# 浏览器取证(路径仍用 --export)
eval "$(node .agents/schema/env-render.js --scan-env docker --id lab1 --host 192.168.1.100 --export)"
# 对某个 VULN,把 EVIDENCE_DIR 指到 vulns/vuln-NNN/evidence(NNN 换成真实编号)每阶段结束:
node .agents/schema/validate-target-schema.js lab1 --strict-summary --stamp-chain- 按
.agents/REPORT-SKELETON.md写target/lab1/report.md(正文用你的语言) - 引用仓库内相对路径的 Evidence(反引号路径须真实存在)
- 可选措辞参考:
knowledge/reporting/report-wording-depth.md(不是第二填表权威)
# 装配数据段(发现表 / 风险评级 / Evidence 索引 / 覆盖度)——你只写叙述
node .agents/schema/assemble-report.js lab1 # 粘到 SKELETON 1.3 / 5 / 8
node .agents/schema/check-report.js lab1 # 也会因报告漏掉某个 Verified Vulnerability 而失败
node .agents/schema/validate-target-schema.js lab1 --strict-summary --check-report --stamp-chain
# 通过后 chain-status 应为 next_phase: done
# 客户交付包(存证 + 指向 Report/Evidence 的索引)
node .agents/schema/deliver.js lab1 # 写 target/lab1/delivery/
# 复测(本次是整改后复测时):与旧一次对比 → 已修复 / 仍存在 / 新增
node .agents/schema/retest.js --baseline OLD_ID --current lab1 --write□ 产物写在 schema 规定路径下(无 scans/、顶层 evidence/ 等禁止路径)
□ manifest 反引号路径 + 交接摘要字段齐全
□ phase ≥1 时 Authorization 已为 confirmed
□ validate --strict-summary [--stamp-chain] 通过
□ 可复用方法 → knowledge-base / PTES-INDEX(不要塞 target 细节当通用知识)
□ 临时文件清理;用用户语言同步进度
| 目的 | 命令 |
|---|---|
| 物化工作区 | node .agents/schema/materialize.js --id ID --host HOST --form IP --scan-env docker |
| 校验 + 推进链 | node .agents/schema/validate-target-schema.js ID --strict-summary --stamp-chain |
| 阶段地图 | … validate-target-schema.js --print-phase-map |
| Session packet | … --print-session-packet [N] |
| Phase 计划 | … --print-plan 1 --id ID --host HOST --scan-env docker |
| 环境 / Evidence | … env-render.js --scan-env docker --id ID --host HOST [--export] |
| Scope 闸门 | … scope-check.js ID --host HOST |
| engagement 状态 | … status.js ID |
| 装配报告数据段 | … assemble-report.js ID |
| 报告质量 | … check-report.js ID |
| 交付包 | … deliver.js ID |
| 复测差分 | … retest.js --baseline OLD --current ID --write |
| 知识查找 | node .agents/bin/lookup.js --phase N --keywords "…" |
| Playbook | node .agents/skills/src-hunter/playbook.js --signal "sqli" |
| 全量自测 | npm run test:all |
AGENTS.md # Agent 编排入口(先读)
CONTEXT.md # 领域词
.agents/phases/ # 每阶段怎么做(执行权威)
.agents/schema/ # 路径与校验(契约权威)
.agents/skills/ # 工具适配(materialize / Playwright / playbook…)
.agents/knowledge/ # LOOKUP 策展知识(大库可外置)
.agents/REPORT-SKELETON.md
examples/schema-mini/ # 最小金样夹具(快速契约检查)
examples/DC-1-engagement/ # 真实金样夹具(真实语法 + 工具链冒烟)
target/${ID}/ # 你的本次评估(唯一工作区)
| Skill | 何时用 |
|---|---|
init-target |
Phase 0 物化 |
enum-services |
Phase 1 计划 |
src-hunter |
Web 手册 resolve |
playwright-skill |
浏览器 + Evidence |
gen-report |
Phase 6 填表与检查 |
knowledge-base |
查/写 tier-1 知识 |
setup-pentester-tools |
依赖检查 |
knowledge-import |
维护者离线归档(不要在 phase 里跑) |
Q: 校验不过?
看 validate 报错:缺文件、交接摘要键、Authorization 仍是 pending、Evidence 目录为空、引用路径不存在等。先 --strict-summary 修到绿再 --stamp-chain。
Q: 1b 要不要做?
Phase 1 交接 web_ports 非空 → 必须;none 且无 1b manifest → 跳过。
Q: 报告用中文还是英文?
跟用户对话语言一致;路径、VULN-NNN、CVE 保持英文标识。
Q: 知识库太大?
运行时只用 LOOKUP / PTES-INDEX。github-references 等 bulk 默认不入库,可 KNOWLEDGE_ARCHIVE_ROOT 外置(docs/agents/archive-locality.md)。
Q: 能抄 DC-1/DC-2 目录结构吗?
不要——它们是 pre-schema 遗留(仅报告参考)。布局以 schema.json 为准;要看真实又合规的样子,读 examples/DC-1-engagement/(examples/README.md 有说明)。
- 仅在 Scope + Authorization confirmed 内测试
- 破坏性操作前再次确认用户
- 报告与笔记脱敏;密钥不进 knowledge
| 文档 | 内容 |
|---|---|
AGENTS.md |
Agent 编排与阶段切换 |
.agents/ROLE.md |
身份、intake、红线 |
.agents/phases/*.md |
分阶段步骤 |
CONTEXT.md |
术语(Target、Manifest、Verified Vulnerability…) |
docs/adr/ |
架构决策 |
docs/agents/host-skills.md |
宿主 skill 链接 |
docs/agents/archive-locality.md |
大语料外置 |
License: 见 LICENSE。