vxcontrol/pentagi:让 AI 自主跑完渗透测试全流程
posts posts 2026-07-10T02:58:08+08:00拆解 vxcontrol/pentagi 的核心机制——25K+ stars 的开源渗透测试 Agent 平台,自托管多 Agent 在 Docker 沙箱里自主执行 nmap/metasploit/sqlmap 等工具,覆盖侦察、利用、后渗透、报告全流程。文末附采用顺序与适用边界。技术笔记渗透测试, AI Agent, Go, LLM这套系统真正在赌什么
大部分"AI + 安全"项目停在两件事上:要么让 LLM 给人当参谋、生成 payload,人自己执行;要么做个 Burp 插件分析流量。PentAGI(Penetration testing Artificial General Intelligence)赌的是另一条路——让 AI Agent 自己在隔离容器里真正运行渗透工具,从侦察一路跑到报告,中间尽量不需要人。
这不是措辞差异,是能力差异。PentestGPT、BurpGPT 这类工具的输出是"建议你跑这条命令";PentAGI 的输出是"我已经跑完了 nmap、试了三个 exploit 模块、拿到一份漏洞报告,你来 review"。能否自主执行真实工具、能否跨越单次调用做长程规划,是 Agent 从"助手"变成"操作员"的分界线。
它因此成了观察 LLM Agent 落地攻防场景的一个完整参考实现:multi-agent 编排、tool use、长期记忆、知识图谱、可观测性,一套全打包在 Go 后端 + React 前端里,docker-compose 一键起。
基本盘
| 项 | 值 |
|---|---|
| GitHub | https://github.com/vxcontrol/pentagi |
| Stars / Forks | 25,084 / 3,225(2026-09-29,GitHub API) |
| 主语言 | Go 1.26(后端,go.mod 声明 1.26.5)+ TypeScript/React(前端) |
| 许可证 | 源码 MIT;Docker 镜像与整体使用另受 EULA 约束(适用法律:英国) |
| 部署 | 交互式安装器(官方推荐)或 Docker Compose;也支持 Podman(含 rootless) |
| 最近活跃 | 持续迭代,2026-09-23 仍有 push |
一个容易踩的坑:源码是 MIT,但官方提供的 Docker 镜像和整体使用行为受独立的 EULA 约束,EULA 要求"仅用于授权渗透测试"。两者冲突时源码部分以 MIT 为准。要二次分发或商业嵌入前,先把 EULA 读完。
系统地图:四条不能混在一起的主线
PentAGI 内部至少有四条并行主线,混在一起整篇都会糊涂:
┌─────────────────────────────────────────────────────────────┐
│ React Web UI ←(REST/GraphQL, Bearer Token)→ Go Backend │
└──────────────────────────┬──────────────────────────────────┘
│ Agent 编排层(主线 1)
↓
primary_agent(orchestrator)
┌────────┬────────┬────────┬────────┐
↓ ↓ ↓ ↓ ↓
searcher pentester coder installer ...(14 个 specialist)
│
│ 工具执行层(主线 2)
↓
image_chooser 按任务选镜像
├─ debian:latest (通用任务)
└─ vxcontrol/kali-linux(渗透任务,200+ 工具)
│ 每个 agent 操作开独立 worker 容器
│ via docker.sock 或 TCP+TLS(:2376)
↓
记忆层(主线 3) 图谱层(主线 4)
PostgreSQL + pgvector Graphiti + Neo4j
(命令/输出持久化、 (攻击路径语义关系、
向量语义召回) 跨任务复用)
│
↓
可观测性:OpenTelemetry → Grafana / VictoriaMetrics
/ Jaeger / Loki / Langfuse(+ClickHouse)四条主线各自的职责,分开看:
- 主线 1 · 编排:多个 agent 角色怎么分工、谁来决定下一步——也就是谁在思考。
- 主线 2 · 执行:工具跑在哪、怎么隔离、镜像怎么选——决定谁在动手、在哪动手。
- 主线 3 · 记忆:命令历史、输出原文、向量化的语义召回——记下做过什么、怎么找回来。
- 主线 4 · 图谱:实体与实体之间的攻击关系,可跨任务复用——沉淀目标之间的拓扑。
记忆和图谱是两套不同的东西,别当成一个——pgvector 存的是"执行过的事实"和"语义相似召回",Graphiti + Neo4j 存的是"实体关系网络"。下面逐条展开。
主线 1:Agent 编排——不只是"三个专家"
README 的宣传口径会把 specialist 笼统说成"research / development / infrastructure",这是对外简化的说法。真正去看 backend/pkg/templates/prompts/ 目录,agent 角色比这丰富得多。
核心是一个 primary_agent 作为 orchestrator(编排器),它不亲自干活,而是把任务委派给一排 specialist。角色的权威口径在 GraphQL schema 的 AgentType 枚举里(backend/pkg/graph/schema.graphqls),与数据库 msgchain_type 枚举完全一致,共 15 个值——编排器之外是 14 个 specialist:
| 角色 | 职责 | 工具调用上限档位 |
|---|---|---|
primary_agent | 主编排器,拆解任务并分派给 specialist | General |
searcher | 信息检索(对应"research"宣传口径) | Limited |
pentester | 执行渗透操作(对应"executor") | General |
coder | 代码/脚本开发(对外叫"developer") | General |
installer | 环境/依赖安装、基础设施维护 | General |
adviser | 规划模式下出计划;执行监督开启时作为 mentor 介入纠偏 | Limited |
memorist | 长期记忆查询 | Limited |
reporter | 生成报告 | Limited |
refiner | 精炼子任务与推理,可单独配置更强模型 | — |
reflector | 工具调用连续失败后的恢复与优雅终止(见下) | Limited |
generator / enricher | 内容生成、上下文增强 | Limited |
assistant | 独立对话助手实例,带自己的上下文摘要配置,不挂在任务流上 | General |
summarizer / tool_call_fixer | 上下文链式摘要、工具调用格式修复 | 内部工序 |
需要澄清一个容易讹传的细节:子任务表(subtasks)本身没有 agent_type 字段,角色归属记录在消息链与各类日志的 initiator / executor 字段里,值域就是上面这个 15 值枚举。网传"底层枚举是 researcher / developer / executor 三个"的说法与源码不符——那三个词只出现在 README 的宣传语和工具描述文本里,从来不是代码里的枚举。
每类角色的工具调用次数有硬上限,且与模型档位挂钩:General 五个(Assistant、Primary Agent、Pentester、Coder、Installer)默认 100 次(MAX_GENERAL_AGENT_TOOL_CALLS),Limited 八个(Searcher、Enricher、Memorist、Generator、Reporter、Adviser、Reflector、Planner)默认 20 次。这是防失控的第一道闸,不是可选项。
两个细节值得单独拎出来:
- 每个角色可以配不同的模型。Settings → Providers 里的 provider profile 控制的是 per-agent 模型选择。README 给的默认分配是:generator/refiner/adviser/coder 用
gpt-5.6-terra,primary_agent/assistant/reflector/installer/pentester 用gpt-5.4-mini——便宜模型干粗活、关键角色用好模型的混搭是官方默认,不是玩家自定义。 - reflector 的触发条件是精确的。LLM 连续 3 次没能生成合法工具调用时 reflector 自动介入(README 标注 Always Active),把跑偏成自由文本的输出拉回结构化工具调用格式,或引导改用
done/ask这类收尾工具;临近调用上限时也由它协调优雅终止。长程任务能不能跑到底,靠的就是这道兜底加上面的硬上限,而不是模型自觉。
主线 2:工具执行——主镜像不含工具
这是最容易看走眼的一点。PentAGI 的主镜像(vxcontrol/pentagi,基于 alpine)本身不包含任何渗透工具,Dockerfile 里只装了 ca-certificates openssl openssh-keygen shadow 这几样基础件。工具全部运行在独立的 worker 容器里。
机制是这样:
- 一个
image_chooseragent 根据当前任务自动挑镜像——通用任务用debian:latest,渗透任务用vxcontrol/kali-linux。 - 每个 agent 操作会开一个独立的 worker 容器,命名形如
pentagi-terminal-1。 - PentAGI 主服务通过访问
docker.sock(默认)或 TCP+TLS(:2376) 来管理这些 worker 容器。 - 生产推荐双节点分布式:worker 节点跑 Host Docker(:2376 TLS)+ Docker-in-Docker(:3376 TLS,带 OPA 授权策略 + seccomp),worker 容器经 TLS 端点访问内层 dind。早期指南用 socket 映射,现行版本已弃用——挂载的 socket 源不存在时 Docker 会把它物化成目录,节点重启后 dind 可能因此起不来,TLS 端点没有这类启动竞态。
关于工具数量,有两个口径要分清:README 反复强调"20+ professional security tools",这是营销口径;底层 vxcontrol/kali-linux 镜像是完整 Kali,Docker Hub 描述写明含 200+ 工具。镜像描述的 “Essential Tools Included” 一节列出的 20 个核心工具(完整清单另在 vxcontrol/kali-linux-image 仓库):
nmap · masscan · amass · subfinder · httpx · nuclei ·
sqlmap · gobuster · ffuf · nikto · impacket-* · evil-winrm ·
bloodhound-python · crackmapexec · hashcat · john · hydra ·
metasploit · radare2 · binwalk侦察(nmap/masscan/subfinder)、Web 漏扫(nuclei/nikto/sqlmap/gobuster/ffuf)、利用(metasploit)、后渗透与 Active Directory(impacket/evil-winrm/bloodhound-python/crackmapexec)、破解(hashcat/john/hydra)、逆向与固件(radare2/binwalk)——一条完整的攻防工具链。清单里没有 wpscan;完整 200+ 集合内有没有它,镜像描述未说,不以猜测充数。
强制 Docker 沙箱解决的是一个真实风险:AI 自主执行命令意味着它完全可能跑出破坏性指令,隔离容器保证即使 agent 误判,rm -rf 也只毁掉一个可重建的 worker,碰不到宿主机。
主线 3 与主线 4:记忆和图谱是两套东西
这里有一个常见的混淆:很多人会把"记忆"当成一个整体。PentAGI 里其实分两层:
执行记忆 —— PostgreSQL + pgvector。 所有命令和输出原文存进 PostgreSQL,配上 pgvector 扩展做向量化。它的作用是语义召回:agent 下一步决策时,能按语义相似度找回"我之前在这台机器上跑过什么、拿到什么结果"。这是短中期的工作记忆。
关系图谱 —— Graphiti + Neo4j。 Graphiti(源自 getzep/graphiti 项目,PentAGI 用自建的 vxcontrol/graphiti 镜像)是面向 LLM Agent 的时序知识图谱。它自动从 agent 响应和工具执行结果里抽取实体与关系,存进 Neo4j,构建渗透测试的知识网络。它的价值在跨任务复用:这次摸清的"某子域 → 某服务 → 某凭据"关系链,下次面对相关目标时可以直接召回,不用从头摸。启用条件是 GRAPHITI_ENABLED=true 且 GRAPHITI_URL 非空,启动时做三次健康检查(间隔两秒),全部失败就记一条警告、带着主记忆继续跑——图谱挂了不拖垮渗透主流程。
两者的边界很清楚:pgvector 回答"我做过这件相似的事吗",Graphiti 回答"这些目标之间什么关系"。
可观测性:README 和实际配置有出入
README Features 文案写的是 “Grafana / Prometheus”,但去看实际的 compose 和架构图,时序库用的是 VictoriaMetrics(Prometheus 兼容的高性能替代),不是原生 Prometheus。这是项目自己文档的一处不一致,下文以实际配置为准。
完整可观测性栈是这样的:
| 层 | 组件 | 作用 |
|---|---|---|
| 采集 | OpenTelemetry | 统一埋点 |
| 指标 | VictoriaMetrics + Grafana | 时序存储 + 仪表盘 |
| 追踪 | Jaeger | 分布式调用链 |
| 日志 | Loki | 日志聚合 |
| LLM 分析 | Langfuse(+ ClickHouse 后端) | 每次 LLM 调用的 token、延迟、成本、prompt 回放 |
| 辅助 | Redis(缓存/限流)、MinIO(S3 兼容对象存储) | — |
这套东西解决的是一个具体问题:当一个 AI Agent 自主跑了半小时、调了几十次工具,出问题时你得能回放它每一步在想什么。Langfuse 尤其关键——它把每次模型调用的 prompt、输出、耗时、成本都记下来,审计 agent 行为时最先要看的便是它。对一个"会自己执行攻击工具"的系统,没有这层可观测性等于黑箱。
任务怎么流过系统:对一台 Web 应用做黑盒渗透
抽象机制讲多了容易空,串一个具体任务。假设目标是一个已授权的 Web 应用 https://target.example.com:
- 部署:官方现在推荐交互式安装器(终端 UI,引导系统检查、LLM provider 与搜索引擎配置、安全加固,管理员密码丢了也从它的维护菜单重置);习惯手工的话
docker-compose up -d加 graphiti、observability、langfuse 三个可选 compose。默认访问https://localhost:8443,初始账号[email protected] / admin,首次登录先改密码。 - 建任务:在 Web UI 创建 task,填入目标 URL,可选 planning mode(让 adviser 先出 3 到 7 步可执行计划,专家角色开工前就有一份行动边界)。
- 侦察:
primary_agent把任务拆给searcher(多源搜索目标信息)和pentester(image_chooser选vxcontrol/kali-linux,开 worker 容器跑nmap扫端口、subfinder找子域、httpx探活)。 - 漏洞探测:worker 里继续跑
nuclei(模板漏扫)、nikto(Web 服务器漏扫)、sqlmap(注入测试)。每条命令和输出进 PostgreSQL + pgvector;关键实体/关系被 Graphiti 抽取进 Neo4j。 - 利用尝试:若发现可利用点,
pentester调metasploit框架试 exploit 模块。exploit 本身失败不触发兜底——那是正常的攻防试错;只有模型连续 3 次生成不出合法工具调用时,reflector才介入把输出拉回结构化格式。 - 后渗透:拿到 shell 后尝试提权、内网横移(
crackmapexec/evil-winrm/bloodhound-python等 AD 向工具)。 - 报告:
reporter把全程结果整理成漏洞报告 + 利用指南。 - 人工 review:整个过程在 Grafana / Langfuse 里可回放,人最后审报告、定级。
这套流程对标一个初级渗透测试员的工作方式,区别在于执行者换成了多 agent。它能不能替人,取决于目标的复杂度和对误报的容忍度——这也是适用边界要谈的。
跟同类项目差在哪
先按官方自己的定位划一条线:README 的 “Current Capability Boundaries” 一节写明,PentAGI 是自主与助手引导的渗透测试平台,不是 CALDERA 那类带预置攻击战役的 BAS(Breach and Attack Simulation)或 adversary emulation 产品;agent 自写攻击脚本被归为概念或未来工作。别把它当成自动化攻击模拟器来采购。
| 工具 | 形态 | 自动程度 | 自主执行工具 | 知识图谱 |
|---|---|---|---|---|
| PentAGI | Web UI + 全栈平台 | 高(自主决策) | ✅(Docker 沙箱内跑真实工具) | ✅ Graphiti + Neo4j |
| PentestGPT | CLI 助手 | 中(人机配合) | ❌ 只给建议命令 | ❌ |
| BurpGPT | Burp 插件 | 低(分析流量) | ❌ | ❌ |
| 自建 CrewAI/AutoGen | 通用框架 | 高 | 要自己集成 | 要自己集成 |
PentestGPT 和 BurpGPT 是"AI 给人当参谋",PentAGI 是"AI 自己上手干"。前两者根本不执行工具,只输出建议;PentAGI 在隔离容器里真正运行 nmap、sqlmap、metasploit。执行能力 vs 建议能力,这条线划开了两个品类。
PentAGI 的位置:目前最完整的开箱即用 AI 渗透平台。multi-agent + tool use + 知识图谱 + 可观测性一次性打包,不用从 CrewAI/AutoGen 自己拼。代价是你得接受它那一整套 Docker + 多数据库的运维复杂度。
(对比项的维护状态截至 2026-09-29,这类小项目迭代快,引用前建议再核一次仓库。)
自托管 LLM:不被单一厂商锁住
内置 provider 类型在 GraphQL ProviderType 枚举里是 11 个:OpenAI、Anthropic、Gemini、Bedrock、Ollama、Custom、DeepSeek、GLM(智谱)、Kimi(月之暗面)、Qwen(阿里)、MiniMax;聚合器走 Custom/OpenAI 兼容端点,README 点名 OpenRouter、DeepInfra、Atlas Cloud、OpenCode Go plan。examples/configs/ 下的现成配置样例已到 27 个(含 xai、azure-openai、novita、orcarouter 及一批 vLLM + Qwen 组合)。examples/guides/vllm-qwen35-27b-fp8.md 是一份详尽的自托管指南,实测数据是:4×RTX 5090 上(10 并发请求)prompt processing 约 13K TPS(tokens/秒)、completion 约 650 TPS,12 条并发 flow 稳定运行,每卡显存约 30 GB。这几个数字分别反映"吃输入"和"吐输出"的吞吐——prompt processing 衡量把长上下文灌进模型的速度(攻防场景上下文往往很长,这个值决定了并发起来快不快),completion 衡量逐 token 生成的速度(决定了单条任务的实际体感)。但它不能推出端到端的渗透成功率,吞吐只说明硬件能撑住多少并发,不说明 agent 的决策质量。对"数据不能出本地"的攻防场景,vLLM + 开源模型这条路是可走通的。
前面提到的 refiner 换强模型机制在这里就很有用:粗活用便宜的本地模型,关键推理切到强模型,成本和效果可以分开优化。
谁该用,怎么开始
适合:
- Red Team / 安全研究员:把 AI 当"初级渗透测试员"使,自己 review 结果、定级、对外负责。
- 企业蓝队:周期性扫自家已授权资产,验证防御覆盖。
- CTF 选手:训练阶段加快手工渗透节奏。
- 研究 Agent 架构的人:multi-agent + tool use + 知识图谱在安全场景的完整参考实现,代码可读。
采用顺序建议:
- 读 README 和本文的系统地图,搞清四条主线(编排 / 执行 / 记忆 / 图谱)的边界。
- 用官方安装器或
docker-compose up -d起一套,登录 Web UI,建一个无危害的 demo 任务(扫自己的博客或靶机)。 - 对照 Docker Hub 镜像描述里的 20 个核心工具清单,理解每个工具的能力边界,知道 agent 在调用什么。
- 打开 Langfuse,回放一次完整任务的每一步模型调用,理解 agent 行为审计怎么落地。
- 基于 PentAGI 的 multi-agent 模式,搭一个自己领域的 agent(比如代码审计 agent),复用它的编排 + 沙箱 + 可观测性骨架。
绝对不要碰的红线
PentAGI 是攻击工具,EULA 写得很硬:
PentAGI is to be used exclusively for authorized penetration testing and security assessments in environments where you have explicit permission from the network owner.
三条不要碰:
- 未授权目标——对没拿到书面授权的目标使用,违法。EULA 还补了一句"只用于 lawful penetration testing"。
- 生产环境高风险目标——AI 自主执行可能造成 DoS 或数据损坏,必须人在回路。
- 没有可观测性的裸跑——不开 Langfuse / Grafana,agent 失控了你都不知道它干了什么。
部署它的工程师要把"授权意识 + Docker 沙箱 + 完整审计日志"当成前置条件,不是可选项。pentagi 服务在 compose 里以 root 运行(compose 文件里的原话:user: root:root # while using docker.sock),这一点也要心里有数。
参考
- 仓库:https://github.com/vxcontrol/pentagi
- 官网(含交互式安装器下载):https://pentagi.com
- 核心工具清单出处:Docker Hub
vxcontrol/kali-linux镜像描述 “Essential Tools Included” 一节;完整清单在 https://github.com/vxcontrol/kali-linux-image - EULA 全文:仓库内
EULA.md(英国法管辖,源码 MIT 的例外边界) - 角色枚举:
backend/pkg/graph/schema.graphqls的AgentType(15 值);每角色模型分配见backend/pkg/providers/openai/config.yml - 官方视频介绍:https://youtu.be/R70x5Ddzs1o
- Discord:https://discord.gg/2xrMh7qX6m
- Telegram:https://t.me/+Ka9i6CNwe71hMWQy
- Graphiti(知识图谱上游):https://github.com/getzep/graphiti
- vLLM 自托管指南:仓库内
examples/guides/vllm-qwen35-27b-fp8.md - 分布式 worker 部署:仓库内
examples/guides/worker_node.md
参与讨论
使用 GitHub 登录。欢迎补充事实、异议与实践。
讨论暂时无法加载。