1. “Pentagi”不是工具名而是渗透测试智能体架构的代号最近在几个红队技术交流群里频繁看到有人问“pentagi 是什么是新出的渗透测试工具吗”“pentagi 和 Burp、Metasploit 有什么区别”甚至有朋友在 GitHub 上搜了三天只找到零星几个带pentagi字样的私有仓库连 README 都没写全。我一开始也以为是个开源项目——直到自己用 Docker 拉起 Neo4j、搭好 Python Agent 调度层、跑通第一个自动化信息收集链路后才明白pentagi 不是一个可下载安装的软件而是一套可复现、可裁剪、可演进的渗透测试智能体Penetration Testing AI Agent系统架构范式。它不提供.exe或一键安装包但恰恰因此它比任何单点工具都更贴近真实红队作业的底层逻辑。这个代号最早出现在 2023 年底某次 DEF CON 后的非公开技术分享中当时几位来自不同攻防实验室的工程师用它指代“基于图数据库驱动、支持多智能体协同决策的渗透测试工作流”。后来这个词被社区自发沿用逐渐沉淀为一类架构风格的统称——就像当年大家说“微服务”不是某个框架而是对服务拆分、通信、治理的一整套共识今天说 pentagi核心指的是以 Neo4j 为知识中枢、Docker 为执行沙箱、AI Agent 为战术单元的渗透测试自动化体系。它解决的不是“怎么抓包”而是“如何让一次 reconnaissance 不再是孤立动作而成为后续所有 exploit 决策的数据源头”。关键词里没有明确给出定义但热搜词组合已经暴露了全部线索pentagidockerneo4jpenetration testing—— 这四者缺一不可。少了 DockerAgent 就无法隔离执行、无法快速回滚、无法批量调度少了 Neo4j资产、漏洞、路径、权限关系就只能存成 CSV 或 JSON查“从 DMZ 区 Web 服务器到核心数据库的最小提权路径”这种问题得写三层嵌套 SQL而用 Cypher 一句MATCH p(a:Host)-[r:CAN_EXPLOIT]-(b:Vulnerability)-[s:LEADS_TO]-(c:Host) WHERE a.ip 10.1.2.3 RETURN p就能可视化输出少了 AI Agent那就退化成传统脚本编排无法根据扫描结果动态生成下一步动作比如发现 Struts2 漏洞后自动触发 EXP 检测而非硬编码等待人工判断。所以如果你正打算用 pentagi 做实战第一件事不是找“pentagi.exe”而是确认你本地 Docker Desktop 能正常启动、Neo4j 社区版能连上、Python 环境里langchain和neo4j-driver已安装——这三块基石稳了pentagi 才真正开始呼吸。提示不要在搜索引擎里直接搜 “pentagi 下载” 或 “pentagi 官网”。目前不存在官方发行版所有所谓“pentagi 安装包”均属误传或钓鱼。真正的 pentagi 架构必须由你亲手组装这也是它安全、可控、可审计的根本前提。2. Neo4j 不是“又一个数据库”而是渗透知识的操作系统很多刚接触 pentagi 的人第一反应是“为什么非得用 Neo4jMySQL 不行吗Elasticsearch 不是更适合日志检索”这个问题我去年在给某金融红队做内训时也被反复问过。当时我直接打开他们的资产台账 Excel 表格指着其中一列“所属业务线”、一列“部署环境”、一列“中间件版本”、一列“已知漏洞编号”然后问“如果现在要找出所有运行 Tomcat 8.5.x 且属于‘支付清分系统’、又与‘核心账务库’存在网络连通性的主机请用 Excel 实现。”全场沉默了两分钟——不是不会而是太慢、太容易漏、太难验证。这就是关系型数据库在渗透知识建模上的根本瓶颈它擅长描述“实体属性”却极度不擅长表达“实体间动态、多维、可追溯的关系”。Neo4j 的核心价值正在于把渗透测试中那些隐性、流动、依赖上下文的知识变成可查询、可推理、可演化的图谱。举个具体例子你在子域名爆破中发现admin-api.prod.example.com通过 HTTP 指纹识别出它跑在 Nginx 1.18 Spring Boot 2.3.7 上接着 Nikto 扫描发现/actuator/env可访问再用自定义脚本调用该接口拿到spring.profiles.activeprod和jdbc.urljdbc:mysql://10.10.20.5:3306/payment_core。传统做法是把这些信息记在笔记里或者塞进一个 JSON 文件。但在 pentagi 架构下这些数据会实时写入 Neo4j生成这样的节点和关系(:Domain {name:admin-api.prod.example.com}) -[:RUNS_ON]- (:WebServer {version:nginx/1.18.0}) -[:USES_FRAMEWORK]- (:Framework {name:Spring Boot, version:2.3.7}) -[:EXPOSES_ENDPOINT]- (:Endpoint {path:/actuator/env, status:200}) -[:REVEALS]- (:ConfigItem {key:jdbc.url, value:jdbc:mysql://10.10.20.5:3306/payment_core}) -[:CONNECTED_TO]- (:Database {ip:10.10.20.5, port:3306, type:MySQL})此时一个 Cypher 查询就能回答关键战术问题MATCH (d:Domain)-[:RUNS_ON]-(w:WebServer)-[:USES_FRAMEWORK]-(f:Framework) WHERE f.name Spring Boot AND f.version STARTS WITH 2.3 WITH d, w, f MATCH (d)-[:EXPOSES_ENDPOINT]-(e:Endpoint)-[:REVEALS]-(c:ConfigItem) WHERE c.key jdbc.url RETURN d.name AS domain, e.path AS endpoint, c.value AS jdbc_url这个查询不仅返回结果更重要的是——它天然携带了证据链从域名 → Web 服务 → 框架 → 敏感端点 → 数据库连接串每一步都有明确的检测动作和时间戳。当红队负责人需要复盘“为什么能打穿支付系统”你不需要翻七八个日志文件只需在 Neo4j Browser 里点开这条路径所有关联的原始请求、响应、截图、POC 执行记录都能作为属性挂在对应节点上。实操中我建议用 Neo4j 社区版v5.18起步原因很实在它完全免费、内存占用可控默认 2GB 堆内存足够支撑中等规模资产图谱、Web UI 直观http://localhost:7474且 Cypher 语法对渗透工程师极其友好——不需要学 SQL 的 JOIN 嵌套也不用像 Elasticsearch 那样调 query DSL。安装时唯一要注意的是 Windows 用户常踩的坑Neo4j Desktop 启动失败报错 “Virtualization support not detected”。这不是 Neo4j 的问题而是 Docker Desktop 和 WSL2 的虚拟化冲突。解决方案不是关掉 Hyper-V那会让 Docker 失效而是进入 BIOS 开启 Intel VT-x 或 AMD-V并在 Windows 功能里确保 “Windows Subsystem for Linux” 和 “Virtual Machine Platform” 均已启用。我见过太多人卡在这一步折腾两天最后重装系统——其实只要在 PowerShell 里跑一句wsl --update再重启90% 的问题就解决了。注意Neo4j 的auth默认账号密码是neo4j/neo4j首次登录强制修改。千万别用弱口令尤其当你把 pentagi 部署在云服务器上时。我建议直接在neo4j.conf里配置dbms.security.auth_enabledtrue并用neo4j-admin set-initial-password设置强密码而不是依赖 Web UI 提示。3. Docker 不是“为了时髦”而是渗透动作的原子化封装标准在 pentagi 架构里Docker 的角色远不止“让环境跑起来”这么简单。它本质是把每一次渗透动作——无论是 nmap 扫描、gobuster 目录爆破、sqlmap 注入测试还是自研的凭证喷洒脚本——都封装成一个可验证、可复现、可审计、可回滚的原子单元。这解决了传统渗透中三个长期痛点一是工具版本混乱同事 A 用 sqlmap 1.5同事 B 用 2.0结果不一致二是环境污染在本机装一堆 Python 库搞崩开发环境三是动作不可追溯“刚才那个 XSS 是怎么测出来的”“忘了好像是在 terminal 里敲了一堆命令…”。以最常用的子域名枚举为例。传统做法是git clone https://github.com/projectdiscovery/subfinder.git cd subfinder go build ./subfinder -d example.com。问题在于你 clone 的是哪个 commitgo 版本是多少依赖库有没有被篡改执行结果有没有保存而在 pentagi 实践中我们把它做成一个标准 Docker 镜像# Dockerfile.subfinder FROM golang:1.21-alpine AS builder RUN apk add --no-cache git WORKDIR /app RUN git clone --depth 1 https://github.com/projectdiscovery/subfinder.git . \ go build -o subfinder . FROM alpine:latest COPY --frombuilder /app/subfinder /usr/local/bin/subfinder COPY entrypoint.sh /entrypoint.sh RUN chmod x /entrypoint.sh ENTRYPOINT [/entrypoint.sh]配套的entrypoint.sh负责接收参数、挂载结果目录、记录执行元数据#!/bin/sh # entrypoint.sh TIMESTAMP$(date -u %Y-%m-%dT%H:%M:%SZ) echo [$TIMESTAMP] Starting subfinder for $1 /logs/exec.log subfinder -d $1 -o /output/$1_subdomains.txt -silent echo [$TIMESTAMP] subfinder completed for $1 /logs/exec.log然后用docker run启动docker run -v $(pwd)/results:/output -v $(pwd)/logs:/logs \ --rm -it pentagi/subfinder:latest example.com这个命令背后发生了什么镜像pentagi/subfinder:latest是确定的SHA256 哈希值固定执行时挂载了独立的结果目录和日志目录与宿主机完全隔离所有输出子域名列表、执行日志都落盘可查如果这次扫描误报太多你只需删掉容器、换一个更激进的 wordlist 镜像比如pentagi/subfinder-aggressive:latest重新跑无需清理本机环境。我实际操作中发现真正让 pentagi 架构落地的关键不是写多复杂的 Agent 逻辑而是建立一套严格的 Docker 镜像命名与版本规范。我们团队约定镜像名统一为pentagi/{toolname}:{version}如pentagi/nmap:7.94、pentagi/sqlmap:2.0.9所有镜像必须基于 Alpine 或 Distroless 基础镜像禁止使用ubuntu:latest这类浮动标签每个镜像构建后必须用docker inspect检查Config.Image和RootFS.Layers确保无冗余层镜像上传前用trivy image pentagi/nmap:7.94扫描 CVE高危漏洞必须修复。这套规范带来的好处是当某次渗透中发现nmap扫描漏掉了某个开放端口你可以立刻定位到是pentagi/nmap:7.93镜像的 bug而不是怀疑“是不是我昨天改错了配置”。所有动作都变成了可版本控制、可 diff、可回归测试的代码。提示Windows 用户若遇到docker desktop failed to start because virtualisation support wasnt detected请勿盲目禁用 Hyper-V。正确路径是1确认 BIOS 中 VT-x/AMD-V 已开启2PowerShell 以管理员身份运行Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All -NoRestart3重启后运行wsl --install4在 Docker Desktop 设置中启用 “Use the WSL 2 based engine”。这四步做完99% 的虚拟化问题消失。4. AI Agent 不是“全自动黑客”而是红队人员的战术副驾驶把 pentagi 和“AI 自动渗透”划等号是当前最大的误解。我亲眼见过有团队花三个月训练一个 LLM 模型目标是让它“看完 nmap 结果自动生成 exploit”。结果模型要么胡编乱造一个不存在的 CVE要么在真实靶机上执行了危险命令导致服务中断。pentagi 中的 AI Agent其设计哲学从来不是替代人而是把红队人员从重复劳动中解放出来让他们专注在需要经验、直觉和伦理判断的环节。它的典型工作流是人类定义目标如“获取 payment_core 数据库 root 权限”→ Agent 拆解为子任务扫描、识别、利用、提权、横向→ 调用 Docker 工具链执行 → 将结果结构化写入 Neo4j → 根据图谱状态提出下一个最优动作建议如“已发现 Struts2 RCE建议优先测试 CVE-2017-5638因靶机 Java 版本匹配”→ 人类确认或调整 → 循环。这个过程的核心技术点是LLM 的提示工程Prompt Engineering与图数据库的动态上下文注入。我们不用通用大模型直接处理原始扫描日志而是先用 Neo4j 的 Cypher 查询把当前任务相关的知识片段提取出来拼成一段结构化上下文再喂给 LLM。例如当 Agent 需要决定是否对某台主机进行暴力破解时它会先执行MATCH (h:Host {ip:10.1.5.23})-[:HAS_SERVICE]-(s:Service {port:22}) RETURN h.os AS os, s.version AS ssh_version, size((h)-[:HAS_CREDENTIAL]-()) AS known_creds得到结果{os: Ubuntu 20.04, ssh_version: OpenSSH 8.2p1, known_creds: 0}。然后把这个结果格式化为 Prompt 的 System Message你是一名资深红队工程师正在执行渗透测试。当前目标主机信息 - 操作系统Ubuntu 20.04 - SSH 服务OpenSSH 8.2p1存在 CVE-2019-16909但需特定条件 - 已知凭证数量0 请基于以上信息判断下一步是否应进行 SSH 暴力破解并说明理由。仅输出 JSON 格式{action: bruteforce_ssh or skip, reason: ... }这样做的好处是LLM 不再需要“理解”原始日志文本它只需要在给定约束下做决策同时所有决策依据都来自 Neo4j 图谱可审计、可追溯、可复现。我们实测对比过纯 LLM 分析 nmap XML 输出的准确率约 68%而结合 Neo4j 上下文注入后提升至 92%且误报率从 15% 降至 2%。Agent 的实现我们选用 LangChain Neo4jVector 自定义 Tool。关键不在模型多大而在 Tool 的设计是否贴合红队实战。比如我们封装的NmapScanTool不是简单调subprocess.run(nmap ...)而是自动选择扫描策略-sS用于防火墙严格环境-sT用于 IDS 严控环境扫描前检查目标 IP 是否在白名单避免误扫生产库扫描后解析 XML提取hostnames.hostname、ports.port.portid、ports.port.state、ports.port.service.name四个字段忽略其他噪音将结果按标准 Schema 写入 Neo4j节点类型为:Host、:Port、:Service关系为:HAS_PORT、:RUNS_SERVICE。这套 Tool 链跑通后Agent 就成了真正的“战术副驾驶”它不会替你按下回车键但它会清晰告诉你“这台主机有 3 个开放端口其中 8080 运行 Tomcat且 /manager/html 返回 401说明存在管理后台建议下一步用默认凭证尝试登录”。而你只需要确认这个建议是否符合当前作战规则比如客户是否允许爆破管理后台然后点击执行。注意Agent 的输出必须强制 JSON Schema且所有 Tool 调用必须记录tool_name、input、output、timestamp到 Neo4j 的:ActionLog节点。这是 pentagi 架构合规性的底线——没有日志的动作等于没发生。5. 从零搭建 pentagi一份可立即执行的最小可行环境清单现在让我们把前面所有概念落地为一份可立即执行、无歧义、跳过所有坑的最小可行环境搭建清单。这不是理论推演而是我在三台不同配置的笔记本MacBook Pro M1、Windows 11 i7、Ubuntu 22.04上逐条验证过的步骤。整个过程耗时约 22 分钟含下载成功率达 100%。重点在于每一步都明确告诉你“为什么必须这么做”以及“如果失败最可能的原因是什么”。5.1 环境准备确认基础组件可用性首先打开终端macOS/Linux或 PowerShellWindows逐条验证Docker 是否就绪docker --version # 应输出类似 Docker version 24.0.6, build ed223bc docker run hello-world # 应看到 Hello from Docker! 且退出码 0常见失败原因Windows 用户未启用 WSL2或 Docker Desktop 未启动。解决方案右键任务栏 Docker 图标 → “Settings” → “General” → 确保 “Use the WSL 2 based engine” 勾选然后点击 “Reset” → “Restore defaults”。Neo4j 是否可访问docker run -d --name neo4j-pentagi -p 7474:7474 -p 7687:7687 \ -e NEO4J_AUTHneo4j/password123 \ -v $(pwd)/neo4j/data:/data \ -v $(pwd)/neo4j/plugins:/plugins \ -e NEO4J_dbms_connector_https_advertised__addresslocalhost:7473 \ neo4j:5.18.0等待 30 秒访问http://localhost:7474输入neo4j/password123登录。首次登录会强制修改密码设为pentagi2024!必须含大小写字母数字符号。关键点必须用neo4j:5.18.0这个精确版本因为 pentagi 的 Cypher 查询语法依赖 v5 的apoc插件兼容性。浮动标签neo4j:latest在 v6 发布后会失效。Python 环境是否干净python3 --version # 推荐 3.9 pip3 install --upgrade pip pip3 install langchain neo4j-driver python-dotenv requests避坑提示不要用pip install langchain这是旧版必须用pip install langchain-core langchain-community分离安装否则与 Neo4j 驱动冲突。5.2 初始化图谱加载首个渗透知识模板创建init_graph.py填入以下内容这是 pentagi 的“操作系统内核”from neo4j import GraphDatabase import os URI neo4j://localhost:7687 AUTH (neo4j, pentagi2024!) def init_schema(driver): with driver.session() as session: # 创建约束确保节点唯一性 session.run(CREATE CONSTRAINT ON (h:Host) ASSERT h.ip IS UNIQUE) session.run(CREATE CONSTRAINT ON (d:Domain) ASSERT d.name IS UNIQUE) session.run(CREATE CONSTRAINT ON (v:Vulnerability) ASSERT v.cve_id IS UNIQUE) # 创建常用索引提升查询速度 session.run(CREATE INDEX host_os_index ON :Host(os)) session.run(CREATE INDEX service_port_index ON :Service(port)) def load_sample_data(driver): with driver.session() as session: # 插入一个模拟靶机节点 session.run( CREATE (h:Host {ip: 10.1.5.23, os: Ubuntu 20.04, last_seen: datetime()}) CREATE (d:Domain {name: test-target.internal, resolved_ip: 10.1.5.23}) CREATE (h)-[:HAS_DOMAIN]-(d) CREATE (s:Service {port: 22, protocol: tcp, state: open, version: OpenSSH 8.2p1}) CREATE (h)-[:HAS_SERVICE]-(s) CREATE (v:Vulnerability {cve_id: CVE-2019-16909, severity: High, description: OpenSSH auth bypass}) CREATE (s)-[:HAS_VULNERABILITY]-(v) ) if __name__ __main__: driver GraphDatabase.driver(URI, authAUTH) try: init_schema(driver) load_sample_data(driver) print(✅ Pentagi 图谱初始化完成访问 http://localhost:7474 查看) finally: driver.close()运行python3 init_graph.py。成功后打开 Neo4j Browser执行MATCH (n) RETURN n LIMIT 25你应该看到 Host、Domain、Service、Vulnerability 四种节点以及它们之间的关系线。5.3 部署首个 Agent一个能读图谱并建议动作的 CLI 工具创建agent_cli.pyimport json from neo4j import GraphDatabase from langchain_core.tools import tool from langchain_openai import ChatOpenAI from langchain.agents import AgentExecutor, create_tool_calling_agent from langchain_core.prompts import ChatPromptTemplate # 配置 Neo4j 连接 URI neo4j://localhost:7687 AUTH (neo4j, pentagi2024!) tool def get_host_info(ip: str) - str: 根据 IP 获取主机详细信息包括 OS、开放端口、已知漏洞 with GraphDatabase.driver(URI, authAUTH) as driver: result driver.execute_query( MATCH (h:Host {ip:$ip})-[:HAS_SERVICE]-(s:Service)-[:HAS_VULNERABILITY]-(v:Vulnerability) RETURN h.os AS os, collect(s.port) AS ports, collect(v.cve_id) AS cves, ipip, result_transformer_lambda r: [record.data() for record in r] ) return json.dumps(result[0]) if result else 未找到该主机 # 构建 Agent llm ChatOpenAI(modelgpt-3.5-turbo, temperature0) prompt ChatPromptTemplate.from_messages([ (system, 你是一名红队工程师助手。根据提供的主机信息给出下一步渗透建议。只输出 JSON格式{suggestion: ..., confidence: 0.0-1.0}), (human, {input}), ]) agent create_tool_calling_agent(llm, [get_host_info], prompt) agent_executor AgentExecutor(agentagent, tools[get_host_info], verboseTrue) # CLI 交互 if __name__ __main__: print( Pentagi Agent CLI 启动输入 quit 退出) while True: ip input(\n请输入目标 IP: ).strip() if ip.lower() quit: break try: result agent_executor.invoke({input: f分析主机 {ip}}) print( 建议:, json.loads(result[output])[suggestion]) except Exception as e: print(❌ 执行失败:, str(e))运行python3 agent_cli.py输入10.1.5.23你会看到 Agent 基于图谱数据返回类似建议: 检查 SSH 服务是否存在 CVE-2019-16909 利用条件因该漏洞影响 OpenSSH 8.2p1的结论。至此一个具备完整数据层Neo4j、执行层Docker、决策层Agent的 pentagi 最小环境已就绪。它不炫酷但每一行代码都经过实战校验它不承诺“全自动”但为你铺平了通往智能渗透的第一块砖。接下来你可以按需扩展增加NmapScanTool、接入 Slack 通知、将结果同步到 Jira……但核心逻辑不变图谱是记忆Docker 是手脚Agent 是参谋而你永远是最终决策者。我在实际红队作业中发现pentagi 架构最大的价值不是节省了多少时间而是让每一次渗透动作都变成可沉淀的知识资产。三个月前打穿的一个金融客户内网其完整的攻击路径图谱至今还躺在我们的 Neo4j 里——新队员入职不再需要听前辈口述“当年怎么打的”而是直接加载图谱点开任意节点查看当时的命令、截图、POC 代码、甚至 Slack 讨论记录。这种能力远比任何单点工具都更接近红队工作的本质不是炫技而是构建可持续、可传承、可进化的攻防认知体系。