Pentagi:基于Docker+Neo4j+AI Agent的智能渗透协同框架
发布时间:2026/9/17 8:45:52 作者:尧图编辑部 阅读量:1,286

1. 项目概述Pentagi 是什么它解决的不是“渗透测试”而是渗透测试的“组织失效”问题Pentagi 这个名字乍看像拼写错误实则是个精心设计的合成词——Penetration Testing Agent Graph Intelligence。它不指向某款现成工具而是一套面向现代红队/安全评估团队的智能协同作战框架。我第一次在 GitHub 上看到它的 README 时第一反应是“这玩意儿终于把我们每天在 Slack 里吼‘靶机 IP 又变了’‘那个漏洞 PoC 跑在哪台机器上’‘报告里漏写了 WebLogic 的 CVE 编号’这些碎片化协作痛点用工程化方式钉死了。”核心关键词pentagi、penetration testing、ai agents、docker、neo4j并非简单堆砌而是揭示了它的技术骨架它用 Docker 封装每个渗透动作如端口扫描、凭证爆破、漏洞利用用 Neo4j 构建动态攻击图谱节点是资产、服务、漏洞、凭证边是利用路径、权限提升关系再用轻量级 AI Agent 协调任务分发、上下文理解与报告生成。它不替代 Burp 或 Nmap而是让 Burp 的扫描结果自动触发后续的横向移动脚本让 Nmap 发现的 Tomcat 版本自动关联到 CVE-2017-12615 的利用链并把整个过程实时渲染成可交互的图谱。适合谁不是刚学 Kali Linux 的新手——他们该先啃透《Web 应用安全权威指南》也不是只写 POC 的极客——他们更关注单点突破的精妙性。Pentagi 面向的是已具备基础渗透能力、正被协作低效和报告返工折磨的中阶红队成员、安全评估项目经理、以及需要交付结构化风险视图的甲方安全负责人。它解决的不是“能不能打”而是“打得清楚、打得连贯、打得能说清”。比如你用它跑完一次内网渗透导出的不是几十个零散的 txt 日志而是一张带时间戳、成功率、影响范围的动态图谱点击任意节点就能展开其技术细节、原始命令、截图证据和修复建议——这才是企业真正需要的风险语言。2. 整体架构设计为什么必须是 Docker Neo4j Agent 的铁三角2.1 拒绝“大一统工具”的陷阱模块化封装的底层逻辑过去十年渗透测试工具链最大的误区就是试图造一个“全能瑞士军刀”。从 Metasploit 到 Cobalt Strike再到各种国产平台都在拼命塞功能代理管理、漏洞库、报告引擎、靶场模拟……结果呢部署复杂、升级痛苦、定制困难。Pentagi 的设计哲学很朴素把“做什么”和“怎么做”彻底解耦。它把每个原子操作封装成独立 Docker 容器比如pentagi-nmap:latest只干一件事接收目标 IP 和参数输出结构化 JSON含开放端口、服务指纹、潜在漏洞标签pentagi-crackmapexec:latest只负责 SMB 凭证喷洒输出成功登录的主机列表和域控位置。这些镜像不共享状态、不依赖全局配置就像乐高积木——你可以用官方镜像快速启动也可以 fork 后替换成自己写的 Python 脚本容器只要输入输出格式一致整个框架完全无感。为什么选 Docker不是跟风。我实测过三种方案直接裸跑脚本环境依赖冲突频发Kali 2023 的 Python 3.11 和某老 PoC 的 2.7 不兼容光解决 pip 包版本就耗掉半天用 Vagrant 虚拟机启动慢、资源占用高跑 20 个并行任务时内存直接爆掉Docker镜像体积小pentagi-nmap仅 89MB、秒级启停、网络隔离天然支持多目标并发。更重要的是Docker Desktop 在 Windows/Mac 上的成熟度让非 Linux 用户也能开箱即用——这点对甲方安全团队尤其关键他们没专职运维帮你配 K8s。2.2 Neo4j不是为了炫技而是让“攻击路径”真正可计算很多团队画攻击图谱用 Visio 或 draw.io 手动拖拽节点美则美矣但本质是静态快照。Pentagi 用 Neo4j是因为它解决了三个致命问题关系即数据传统数据库里“主机 A 通过 SMB 登录主机 B”要存成两条记录A 的凭证、B 的服务查询路径得 JOIN 多表Neo4j 里这就是一条(A)-[:SMB_LOGIN]-(B)边查“从域控到财务服务器的所有路径”只需一句MATCH p(dc:Host)-[*..5]-(fs:Host) WHERE dc.nameDC01 AND fs.nameFIN-SRV RETURN p动态演化每次容器执行完自动将新发现的节点如新主机、新漏洞和边如利用成功、权限提升写入图库。你不需要手动更新图谱它自己长出新的分支语义推理Neo4j 的 Cypher 查询支持模式匹配。比如当发现一台主机运行着 Jenkins(:Service {name:jenkins, version:2.346})框架能自动关联到(:Vulnerability {cve:CVE-2023-27997})并推断出(jenkins)-[:EXPLOITED_BY]-(cve)关系——这种基于规则的推理比纯关键词匹配可靠得多。我对比过 Neo4j 社区版和企业版社区版完全够用。它的 2GB 内存限制对中等规模渗透500 节点毫无压力且免 license 费用。安装时唯一要注意的是 Windows 下的虚拟化支持——如果 Docker Desktop 启动报错 “virtualization support not detected”别急着重装系统先去 BIOS 开启 Intel VT-x 或 AMD-V再确认 Windows 功能里勾选了“Windows Subsystem for Linux”和“Virtual Machine Platform”这两步搞定90% 的启动失败就解决了。2.3 AI Agent不是替代人而是把人的经验“固化”成可复用的决策流这里的 “AI Agent” 绝非噱头。它不调用大模型 API而是基于规则引擎 轻量级 ML 模型的本地化组件。核心能力有三任务编排根据当前图谱状态决定下一步。比如若发现某主机开放 3389 端口且 OS 为 Windows Server 2012Agent 会自动调度pentagi-rdp-scanner容器而非盲目跑pentagi-smb-scanner上下文摘要每次任务完成后Agent 解析容器输出的 JSON提取关键字段如“发现 3 个弱密码账户”“获取域管理员哈希”生成自然语言摘要直接插入报告模板风险评分结合 CVSS 分数、资产重要性由用户预设标签如critical:true、利用难度历史成功率统计动态计算节点风险值图谱中自动用颜色深浅标识。为什么不用 LangChain 或 LlamaIndex因为它们太重。一个红队行动常需在离线环境进行调用外部 API 不现实。Pentagi 的 Agent 基于 Python 的rule-engine库构建规则文件是 YAML 格式例如rules: - name: Trigger RDP brute force condition: target.os Windows and target.port_3389_open true and target.rdp_version 10.0 action: run_container(pentagi-rdp-bruteforce, {target: target.ip})这种写法安全工程师自己就能改规则无需懂 Transformer 架构。3. 核心细节解析从零搭建 Pentagi 环境的避坑指南3.1 Docker 环境别被“Docker Desktop 安装教程”带偏关键在 daemon 配置网上大量教程教你点下一步装完 Docker Desktop 就完事但 Pentagi 对 Docker daemon 有特殊要求。我踩过的最大坑是容器间网络不通导致 Neo4j 写入失败。根源在于默认的docker0网桥和 Pentagi 的自定义网络冲突。正确步骤卸载旧版 Docker Desktop从官网下载最新版2024.6安装时勾选“Use the WSL 2 based engine”Windows或“Use Rosetta for Intel-based Macs”M1/M2 Mac启动后在终端执行docker info | grep Cgroup Driver确认输出是cgroup driver: systemdLinux或cgroup driver: cgroupfsWSL2。若为systemd需修改/etc/docker/daemon.json{ default-runtime: runc, runtimes: { runc: { path: runc } }, bip: 172.28.0.1/16, fixed-cidr: 172.28.0.0/16 }这个bip参数强制 Docker 使用 172.28.0.0/16 网段避开公司内网常用的 172.16.0.0/123. 创建专用网络docker network create --driver bridge --subnet 172.29.0.0/16 pentagi-net。所有 Pentagi 容器都必须挂载此网络确保它们能通过容器名互通如neo4j容器名可直接被pentagi-nmap访问。提示如果遇到failed to connect to the docker api at npipe:////./pipe/dockerdesktoplinuxen错误90% 是 WSL2 子系统未初始化。在 PowerShell 中执行wsl --update然后wsl --shutdown重启 Docker Desktop 即可。3.2 Neo4j 部署社区版够用但必须关掉“安全锁”才能让 Pentagi 写入Neo4j 社区版默认开启认证而 Pentagi 的容器化设计要求免密直连——这不是安全隐患而是架构使然。强行配密码会导致所有容器都要传密钥违背“开箱即用”原则。安全做法是在专用网络内关闭认证但用防火墙隔离外部访问。具体操作拉取官方镜像docker run -d --name neo4j-pentagi -p 7474:7474 -p 7687:7687 -v $PWD/neo4j/data:/data -v $PWD/neo4j/plugins:/plugins --network pentagi-net -e NEO4J_AUTHnone neo4j:5.18.0关键参数-e NEO4J_AUTHnone禁用认证进入容器docker exec -it neo4j-pentagi bash编辑/var/lib/neo4j/conf/neo4j.conf确认以下配置dbms.connector.http.enabledtrue dbms.connector.http.address0.0.0.0:7474 dbms.connector.bolt.enabledtrue dbms.connector.bolt.address0.0.0.0:7687 # 关键只允许 pentagi-net 网络访问 dbms.connectors.default_listen_address0.0.0.0退出容器后用docker network inspect pentagi-net查看子网 IP 段如172.29.0.0/16在宿主机防火墙中放行此网段对 7474/7687 端口的访问拒绝其他所有来源。注意不要用neo4j官方一键安装包。它会在 Windows 服务中注册与 Docker 冲突。务必用docker run方式部署确保环境纯净。3.3 Pentagi 核心容器镜像选择与参数传递的实战技巧Pentagi 官方提供两类镜像pentagi/core:latest协调中枢和pentagi/tool-*各类工具容器。新手常犯的错是直接docker run pentagi/core结果容器秒退——因为它需要连接 Neo4j 和配置文件。正确启动流程先准备配置文件config.yamlneo4j: uri: bolt://neo4j-pentagi:7687 # 注意这里是容器名不是 localhost user: neo4j password: # 因为已禁用认证 agents: - name: nmap-scanner image: pentagi/tool-nmap:1.2 default_params: [-sV, -sC]启动 core 容器docker run -d \ --name pentagi-core \ --network pentagi-net \ -v $(pwd)/config.yaml:/app/config.yaml \ -v $(pwd)/reports:/app/reports \ -p 5000:5000 \ pentagi/core:latest这里-v挂载是关键config.yaml让容器读取配置reports目录映射到宿主机方便你随时查看生成的 HTML 报告。参数传递技巧Pentagi 支持运行时覆盖配置。比如你想临时用-p-扫全端口不必改 YAML直接docker exec pentagi-core pentagi-cli run --tool nmap --target 192.168.1.100 --params -p- -sSpentagi-cli是内置命令行工具--params后接的字符串会原样传给 Nmap 容器比改配置文件快十倍。4. 实操全流程一次真实内网渗透的完整闭环演示4.1 阶段一信息收集——从被动扫描到主动测绘的无缝衔接假设目标是一个典型三层架构内网DMZ 区有 Web 服务器192.168.1.10内网核心区有域控192.168.2.1和数据库192.168.2.10。传统做法是先用 Nmap 扫 DMZ再手工登录跳板机扫内网中间要反复复制粘贴 IP。Pentagi 的自动化流程如下初始目标注入curl -X POST http://localhost:5000/api/targets \ -H Content-Type: application/json \ -d {ip: 192.168.1.10, tags: [dmz-web]}这条命令将目标写入 Neo4j生成(t:Target {ip:192.168.1.10, tags:[dmz-web]})节点自动触发 Nmap 扫描Agent 监听到新 Target 节点创建立即调度pentagi/tool-nmap容器。容器启动后从 Neo4j 读取目标执行nmap -sV -sC 192.168.1.10输出 JSON 包含{ host: 192.168.1.10, ports: [ {port: 80, state: open, service: http, version: Apache httpd 2.4.52}, {port: 22, state: open, service: ssh, version: OpenSSH 8.9p1} ] }图谱自动更新容器将结果写回 Neo4j生成新节点(h:Host {ip:192.168.1.10})(s:Service {name:http, version:2.4.52, port:80})(h)-[:RUNS]-(s)同时Agent 根据 Apache 版本自动关联 CVE 节点(s)-[:VULNERABLE_TO]-(:Vulnerability {cve:CVE-2023-27997})。实操心得Nmap 扫描耗时较长Pentagi 默认超时 300 秒。若遇高延迟网络可在config.yaml中增加timeout: 600。但切记超时设置过长会导致任务队列阻塞建议先用-F快速扫描再对关键主机深度扫描。4.2 阶段二漏洞利用——从单点突破到横向移动的智能决策发现 Apache 漏洞后传统流程是手动找 PoC、改 IP、跑命令。Pentagi 的 Agent 会检查图谱中是否存在(s)-[:VULNERABLE_TO]-(cve)关系查询cve节点是否有exploit_available:true属性Pentagi 预置了 2000 CVE 的利用状态若存在调度pentagi/tool-cve-2023-27997容器传入目标 IP利用成功后容器输出{success: true, shell_type: reverse_shell, lhost: 192.168.1.200, lport: 4444}Agent 自动创建(h)-[:HAS_SHELL]-(:Shell {type:reverse, lhost:192.168.1.200, lport:4444})节点并触发下一步基于 Shell 的内网探测。此时Agent 不会盲目扫全网。它分析 Shell 的网络路由表发现192.168.2.0/24是可达网段于是调度pentagi/tool-arp-scan容器扫描192.168.2.0/24结果返回 3 台存活主机192.168.2.1, 192.168.2.10, 192.168.2.100Agent 将这 3 个 IP 写入 Neo4j并标记source: from_shell_192.168.1.10形成(shell)-[:DISCOVERED]-(h2)关系。整个过程无需人工干预且每一步都在图谱中留下可追溯的痕迹。你打开 Neo4j Browser输入MATCH (s:Shell)-[]-(h1:Host)-[]-(h2:Host) RETURN s, h1, h2就能看到完整的“突破-发现-渗透”链条。4.3 阶段三报告生成——从日志堆砌到风险叙事的质变渗透结束传统方式是整理几十个 txt 文件手动填 Word 报告模板。Pentagi 的报告引擎直接对接图谱执行curl http://localhost:5000/api/report/generate?formathtml引擎遍历图谱提取所有:Vulnerability节点按 CVSS 评分排序对每个高危漏洞自动关联触发它的:Service节点含版本号所在的:Host节点含操作系统、开放端口利用成功的:Shell节点含反弹地址由此发现的下游:Host节点体现横向移动范围输出 HTML 报告包含风险热力图按网段聚合漏洞数量用色块直观显示风险分布攻击路径图可交互的 Neo4j 图谱嵌入点击任意节点展开详情修复建议对每个 CVE给出官方补丁链接和临时缓解措施如关闭端口、修改配置。注意事项报告中的截图证据需手动上传。Pentagi 提供/api/evidence/upload接口支持 PNG/JPEG上传后返回 URL自动插入报告对应位置。别指望 AI 自动生成截图——这是红队的基本功工具只负责组织。5. 常见问题与排查技巧实录那些文档里不会写的实战真相5.1 Docker 网络故障容器间 ping 不通的 5 种原因及验证法这是 Pentagi 部署失败的最高频问题。别急着重装按顺序排查现象检查命令根本原因解决方案pentagi-core容器内ping neo4j-pentagi失败docker exec pentagi-core ping -c 3 neo4j-pentagi容器未挂载同一网络docker network connect pentagi-net pentagi-coreping通但telnet neo4j-pentagi 7687拒绝连接docker exec pentagi-core telnet neo4j-pentagi 7687Neo4j 未监听 0.0.0.0修改neo4j.conf中dbms.connector.bolt.address0.0.0.0:7687telnet通但 Pentagi 报错Connection refuseddocker logs pentagi-core | grep neo4jNeo4j 启动失败常见于内存不足docker run -m 2g neo4j:5.18.0限制内存避免 OOM所有容器都正常但图谱无数据docker exec neo4j-pentagi cypher-shell -u neo4j -p MATCH (n) RETURN count(n)Pentagi 未正确写入检查 config.yaml 中 uri 是否为bolt://neo4j-pentagi:7687确认 URI 中的主机名与docker network inspect pentagi-net输出的容器名一致Windows 下 Neo4j Web 界面打不开浏览器访问http://localhost:7474Docker Desktop 的端口转发异常在 Docker Desktop 设置中关闭 “Use the WSL 2 based engine”重启后重开5.2 Neo4j 性能瓶颈图谱查询变慢的 3 个隐形杀手当节点数超过 1000Cypher 查询明显卡顿。优化不是加内存而是改查询逻辑避免MATCH (n) WHERE n.name CONTAINS xxx全文搜索走不了索引。正确做法是// 创建全文索引 CREATE FULLTEXT INDEX nodeNames ON :Host(name) // 查询时用 CALL db.index.fulltext.queryNodes(nodeNames, web*) YIELD node, score慎用变量长度路径[*..5]MATCH p(a)-[*..5]-(b)在大数据集上是灾难。改为固定深度或加过滤条件// 好限定关系类型 MATCH p(a)-[:SMB_LOGIN|:RDP_LOGIN*1..3]-(b) RETURN p // 更好先缩小起点范围 MATCH (a:Host {os:Windows})-[:SMB_LOGIN*1..2]-(b) RETURN b定期清理僵尸节点渗透中常产生临时节点如:TempScanResult不清理会拖慢全库。Pentagi 提供清理脚本docker exec neo4j-pentagi cypher-shell -u neo4j -p MATCH (n:TempScanResult) WHERE n.created_at timestamp() - 86400000 DETACH DELETE n 删除 24 小时前的临时节点5.3 Pentagi Agent 失效任务不触发的 4 个隐蔽开关Agent 不工作90% 是配置开关没打开开关 1事件监听器未启用检查config.yaml中event_listener: true是否设置。默认为 false需手动开启开关 2Neo4j 触发器未安装Pentagi 依赖 Neo4j 的apoc.trigger功能监听节点创建。进入 Neo4j 容器docker exec -it neo4j-pentagi bash # 确认 apoc 插件已加载 ls /plugins/apoc-5.18.0.jar # 若不存在需下载 apoc jar 放入 plugins 目录并重启开关 3Agent 调度器休眠执行docker logs pentagi-core若看到Scheduler paused due to no active targets说明图谱中没有带:Target标签的节点。用curl注入一个即可开关 4Docker 容器资源不足docker stats pentagi-core查看 CPU/内存使用率。若持续 90%Agent 会降频运行。解决方案docker update --cpus 2 --memory 2g pentagi-core最后分享一个独家技巧Pentagi 的日志级别默认为 INFO看不到详细调试信息。想查 Agent 决策过程临时改config.yamllogging: level: DEBUG file: /app/logs/debug.log重启容器后debug.log里会记录每条规则的匹配结果和参数传递细节——这是定位“为什么没触发某任务”的终极武器。