一套可留证的渗透测试工作流"

admin 2026-10-16 12:47:56 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

一套可留证的渗透测试工作流

原创

Aaron
Aaron

Aaron与安全的那些事

2026年10月15日 12:36
上海

在小说阅读器读本章

去阅读

在公众号小说中沉浸阅读

渗透测试里有一类问题很常见:端口扫出来了,接口也找到了,但真正影响安全边界的那段逻辑藏在客户端、打包脚本、插件或二进制里。

这时,单靠扫描器不够。扫描器能告诉你“哪里值得看”,却未必能说明“这段代码为什么会把数据送到这里”;反过来,逆向分析也不等于完成一次渗透测试,它还需要把疑点放回真实服务、真实权限和真实网络边界里验证。

最近公开的三个开源项目,刚好把这条链路拆成了三段:

  • reverse-skill:负责分诊和作战骨架,先判断目标类型,再初始化范围、时间线和证据目录。
  • REA:负责把二进制、JavaScript/Electron、.NET、网页和运行行为拆成可解释的线索。
  • PentAGI:负责在隔离的 Docker worker 中编排资产发现、工具调用、结果记忆和报告。

它们合起来,不是“按一下按钮自动黑进目标”,而是一套更适合项目交付的工作方法,本文讲述:先搞懂目标,再做受控验证;每一步都能回到原始证据。

三个工具的角色定义

1. reverse-skill:条条道路通罗马,应该选哪条?

reverse-skill 更像一个路由和作战契约集合,不是一个独立扫描器。

它的价值在于把容易被忽略的前置工作固定下来:目标是什么类型,当前机器有哪些工具,授权范围是什么,网络模式是什么,哪些动作在当前 case 里被允许,最后哪些证据要进入报告。

公开文档里的主线很清楚:任务先经过规则和路由,再进入 case-init;scope、timeline、Evidence、Finding 和报告之间有明确的关系。授权状态和网络配置没有准备好时,只能做只读规划,不能直接对目标执行动作。

这一步看似不“刺激”,却是很多报告失真的源头。没有范围文件,后面很容易出现两个问题:一是把不在授权范围内的资产扫进去,二是做完一堆动作,却说不清哪一步产生了结论。

2. REA:把“我感觉”变成具象化

REA 的定位是连接分析工具与工作流的逆向连接器。公开资料显示,它可以使用 Hopper、Ghidra 或 IDA 等原生分析引擎,也可以直接分析 JavaScript、Electron、.NET 和网页目标;同一套能力既可以走 MCP,也可以从 CLI 使用。

它返回的重点不是一句“这段代码不安全”,而是函数、调用关系、伪代码、运行观察、原始输出和覆盖限制。对安全测试来说,这些东西很重要,因为最终要回答的不是“模型认为危险吗”,而是:

  1. 哪个入口触发了这段逻辑?
  2. 参数从哪里来,经过了哪些边界?
  3. 敏感操作发生在客户端、主进程还是服务端?
  4. 结论来自静态代码、运行时观察,还是作者推断?

REA 官网公开的案例也体现了这种方法。DX-Ball 案例从声音调用追到位置转声道的函数,再用原始 x86 测试和编译后的函数字节做核对;Notion 案例从渲染层一路追到 Electron 的 preload、IPC 和主进程剪贴板桥;TH04 案例则从 DOS 程序的指令恢复角度计算,再与维护中的 C++ 实现和编译结果比较。

这里的共同点是“追踪 + 复核”,不是“反编译完就算完成”。

3. PentAGI:把疑点放回网络和服务里验证

PentAGI 是自托管的多智能体渗透测试平台。根据公开 README,它把资产发现、研究、工具调用、记忆、监控和报告组织成 flow,并将 20 多种专业安全工具放到隔离的 Docker 环境中执行。

它适合处理的是“目标已经明确,下一步要验证什么”的工作。例如:

  • 只对授权实验网的指定主机做端口和服务识别;
  • 根据已经确认的入口检查认证、授权和输入边界;
  • 对一个已知的服务指纹,补充配置、版本和暴露面的验证;
  • 把命令、输出、时间和产物整理进一份可以复测的流程记录。

PentAGI 不是 CALDERA 那样的预定义攻击模拟平台,也不应该被当作无人监督的攻击按钮。

一次项目应该怎样串起来

下面用一个常见的授权场景说明:客户交付了一个 Electron 客户端和它对应的测试环境,希望确认“复制、导入和导出”这几个功能有没有把敏感数据带到不该去的地方,同时验证服务端是否正确校验权限。

第一步:先写范围,再开工具

不要直接把客户给的信息丢给工具。先建一个 case,把授权、资产、动作边界和交付目标写下来。

一个最小的给AI的 scope.md 可以是这样:

case: electron-lab-001
auth:
status:granted
reference:client-authorization-2026-017
network_profile:lab_only
targets:
-name:desktop-sample
    path:./samples/client.asar
-name:api-lab
    url:https://api.lab.example.test
    ports:[443,8443]
time_window:\"2026-10-15 09:00-18:00 Asia/Shanghai\"
limits:
rate:low
concurrency:2
destructive_actions:false
stop_conditions:
-leavethelabnetwork
-authenticationstateisunclear
-targetownerrequestsstop
deliverables:
-timeline.md
-evidence/INDEX.md
-report.md

然后让路由层把目标分成两条线:客户端走逆向和运行时观察,API 走服务识别和权限验证。这里的“分成两条线”不是把工作拆给两个互不相干的工具,而是让后面的证据能汇合到同一个问题上:客户端传了什么,服务端信了什么。

在 reverse-skill 仓库里,公开文档给出的工作习惯可以概括成下面几步。不同平台的脚本后缀可能不同,执行前以仓库当前版本和本机工具索引为准:

# 在 reverse-skill 仓库目录执行
bash skills/scripts/refresh-tool-index.sh

bash skills/scripts/master-route.sh \\\\
  --hint \"自有 Electron 应用 + 授权实验 API 的安全评估\"

bash skills/scripts/case-init.sh \\\\
  --case-name electron-lab-001 \\\\
  --preset offline-sample

bash skills/scripts/case-guard.sh work/electron-lab-001

如果目标是 Windows,使用仓库提供的 PowerShell 入口,并把授权范围写入对应的 case 文件。

第二步:用 REA 先回答“客户端到底做了什么”

REA 的安装入口是公开的 npx rea-agents setup。它会让使用者选择要接入的客户端、审阅拟修改的配置,并在需要时单独确认 Hopper 安装或连接。安装完重启对应客户端,再做 readiness 检查。

如果目标是原生二进制,先确认可用 provider:

npx rea-agents setup

rea providers --json
rea capabilities --json
rea doctor --provider ghidra --json

一个从粗到细的原生分析顺序可以是:

rea analyze ./samples/client \\\\
  --provider ghidra --json > work/electron-lab-001/analysis.json

rea search ./samples/client \"clipboard\" \\\\
  --provider ghidra --json > work/electron-lab-001/search-clipboard.json

rea function ./samples/client main \\\\
  --provider ghidra --json > work/electron-lab-001/function-main.json

rea xrefs ./samples/client 0x1000 \\\\
  --provider ghidra --json > work/electron-lab-001/xrefs-1000.json

如果交付的是 JavaScript 或 Electron 包,先看应用图和模块关系,再沿着具体能力追踪。下面的 client.asar 是示例路径,实际执行时替换成授权样本:

rea analyze-javascript-application \\\\
  ./samples/client.asar --json \\\\
  > work/electron-lab-001/app-evidence.json

这一步要记录的不是“找到了 clipboard 字符串”,而是类似这样的事实:

E-001
入口:renderer export button
调用链:renderer -> preload -> IPC -> main -> clipboard API
观察:IPC 参数包含文档片段和格式字段
待验证:来源校验是否只在 renderer,服务端是否有独立授权判断
证据:app-evidence.json / function-main.json

REA 的公开 CLI 文档还支持 snapshot。对同一个目标、同一个 provider、同一组参数,保存快照可以减少重复分析,也方便复测时比较结果:

rea analyze ./samples/client \\\\
  --provider ghidra \\\\
  --snapshot work/electron-lab-001/client-analysis.json \\\\
  --json

快照是分析结果的复用手段,不是结论缓存。目标字节、参数或 provider 变化后,必须重新确认覆盖范围。

第三步:把逆向线索翻译成 PentAGI 的验证任务

逆向得到的线索要尽量写成“能被验证的假设”,而不是把一大段伪代码原样塞给 PentAGI。

比如,把“客户端有一个 IPC 剪贴板桥”翻译成:

★

在 api.lab.example.test 的 443 和 8443 端口内,验证当前测试账号能否访问另一个测试账号的文档导出接口;只使用提供的两个账号和测试数据,不修改数据,不上传文件,不尝试持久化;记录请求路径、状态码、响应字段、时间和复现条件;如果发现权限边界不明确,立即停止并标为待人工确认。

PentAGI 的 flow 描述应该把以下内容写清楚:

目标:api.lab.example.test
授权:client-authorization-2026-017
范围:443, 8443;仅 lab_only 网络
账号:tester-a、tester-b,均为测试账号
允许:低速服务识别、已知接口的权限验证、读取无害测试数据
禁止:删除/修改数据、口令喷洒、持久化、扩大网段、绕过 MFA
停止:出现真实用户数据、越出目标主机、速率异常、授权不确定
交付:flow 日志、原始响应、证据 ID、复现步骤、限制说明

PentAGI 的安装文档建议先通过 provider 和 embedding 检查,再启动完整 flow。一个最小的本地部署起步顺序是:

mkdir -p pentagi && cd pentagi
curl -O https://raw.githubusercontent.com/vxcontrol/pentagi/master/.env.example
cp .env.example .env

# 按组织策略填写 provider 和数据库等配置后
docker compose up -d
docker compose logs -f pentagi

# 先验证模型的基本完成、JSON 和工具调用能力
ctester -config ./examples/configs/custom-openai.provider.yml

# 如果改过 embedding,再运行对应的 embedding 检查
etester

PentAGI 官方文档特别提醒了 Docker 权限问题:

把宿主机 Docker socket 直接交给自动化 worker,会让 worker 获得接近宿主机 root 的控制能力。

第四步:把结果升格成可复测的发现

测试报告里最危险的一句话是“存在越权”。它可能是真的,也可能只是客户端显示了一个按钮、接口返回了统一错误,或者测试账号本身权限配置不完整。

更稳妥的做法是把结果拆成五层:

  1. 观察:原始响应、调用链、日志或函数行为是什么。
  2. 证据:哪些文件、命令、时间和输出可以复核。
  3. 假设:为什么这可能影响认证、授权、机密性或完整性。
  4. 验证:在什么前置条件下复现,使用什么无害测试数据。
  5. 结论:影响、置信度、限制和修复建议。

可以给每条证据一个稳定 ID:

{
  \"id\": \"E-002\",
\"source\": \"pentagi-flow-17\",
\"target\": \"api.lab.example.test:8443\",
\"observed_at\": \"2026-10-15T11:20:00+08:00\",
\"action\": \"GET /v1/test-documents/42\",
\"result\": {
    \"status\": 200,
    \"contains\": [\"document_id\", \"owner_id\", \"content\"]
  },
\"precondition\": \"tester-b token, document 42 owned by tester-a\",
\"safety\": \"read-only test data\",
\"limitations\": [
    \"仅验证测试租户\",
    \"未尝试批量枚举\",
    \"未验证生产配置\"
  ]
}

随后再写 Finding,而不是把 Finding 当成工具输出:

F-001:对象级授权校验缺失(待修复)
证据:E-002、E-003
影响:具备有效登录态的低权限账号可读取其他测试账号对象
前置条件:知道对象 ID;测试租户开启该接口
验证状态:已在隔离测试环境复现
不确定性:尚未覆盖生产网关和缓存层
建议:服务端按当前主体重新加载对象并执行所有权/租户校验,不能依赖客户端隐藏入口
复测:使用 tester-a 创建对象,tester-b 访问同一对象应返回 403 或等价拒绝结果

使用手册

安装前

  • reverse-skill:先读当前版本的 README、平台说明和 README_AI.md,确认脚本入口、许可证和工具索引方式。
  • REA:准备 Node.js/npm;原生目标再准备 Hopper、Ghidra 或 IDA 之一;Linux 注意进程检查依赖。
  • PentAGI:准备 Docker Compose、至少一个可用的模型 provider、embedding 配置和隔离 worker;不要把生产密钥直接写进文章里的命令。

第一个 case

  1. 先建立 scope.md、timeline.md、evidence/INDEX.md。
  2. 先做目标分类和工具 readiness,不要一上来全量安装工具。
  3. 先用 REA 解决一个具体问题,例如“哪个进程最终调用了剪贴板 API”。
  4. 把逆向线索改写成 PentAGI 能执行、能停止、能留证的验证任务。
  5. 先做低速、只读、测试数据验证,再考虑更高风险的动作;风险动作需要额外授权,不由工具默认升级。
  6. 交付前检查证据 ID、原始输出、时间线、复现条件和限制是否互相对应。

常见失误

把 REA 的伪代码当成最终真相。 伪代码要回到汇编、调用关系和运行结果核对;不能只根据命名推断业务含义。

把 PentAGI 的报告当成已验证漏洞。 报告是执行记录和分析草稿,最终严重性需要人工检查范围、前置条件、影响和复现路径。

把“本地分析”理解成“所有数据都留在本地”。 REA 的目标文件可以在本机分析,但解释这些结果的模型 provider 仍可能在云端;要按组织政策决定是否允许上传代码片段、日志和请求数据。

让自动化 worker 直接控制宿主机 Docker。 这是部署层面的高风险配置,应该在上线前就改掉,而不是等到发生越界后再补救。

只留结论,不留失败尝试。 失败的 provider、未覆盖的函数、被停止的 flow 和未确认的权限边界,都应该进入 timeline 或限制说明。它们决定了别人能否正确理解“没有发现问题”到底意味着什么。

最后

这三个项目真正有价值的地方,不是把渗透测试变成一段更长的自动执行脚本,而是把过去容易散掉的工作重新接起来:

  • reverse-skill 让项目先有范围和路线;
  • REA 让客户端和二进制里的线索可解释、可追踪;
  • PentAGI 让网络侧验证有隔离、有日志、有产物。

    一套可留证的渗透测试工作流" 网络安全文章

    一套可留证的渗透测试工作流"

    本文介绍一套可留证的渗透测试工作流,通过三个开源工具协同:reverse-skill负责分诊与作战骨架,REA负责逆向分析客户端代码,PentAGI在隔离环境中编排验证。核心方法论是先明确授权范围,再做受控验证,将逆向线索转化为可验证假设,最终形成可复测的发现报告。建议按范围定义、逆向分析、验证执行、证据留存的流程操作。
    评论:0   参与:  0