Pentagi:基于Docker与Neo4j的AI渗透测试代理系统

发布时间:2026/9/17 10:58:27
Pentagi:基于Docker与Neo4j的AI渗透测试代理系统 1. “Pentagi”不是产品名而是渗透测试AI代理系统的代号级命名实践你搜“pentagi”页面上跳出来的全是Docker、Neo4j、渗透测试工具链的零散教程——没有官网、没有GitHub仓库、没有文档首页甚至没有一条像样的介绍视频。这不是项目失败恰恰说明它已进入真实红队工程师的工作流深处一个不靠品牌营销、只靠实战交付存活的内部代号系统。我第一次在某金融红队的离线靶场环境里见到它是在一台禁网的Windows主机上通过Docker Desktop启动的容器集群里跑着五个协同节点其中一个标着pentagi-core另一个叫pentagi-graph日志里反复出现[neo4j] connected bolt://graph:7687。没人把它当SaaS产品宣传但所有参与过三次以上实战演练的同事都会在复盘会上说“这次pentagi自动补全了两个漏掉的横向移动路径。”“Pentagi”这个词本身是合成词Penetration Agients取自Agentic AI中的AgI不是缩写也不是注册商标而是一种工程命名习惯——就像当年Metasploit团队把模块叫“exploits/windows/smb/ms17_010_eternalblue”Kali把工具集叫“kali-tools-top10”一样它指向的是一套可组合、可演进、可审计的AI驱动渗透测试工作流。关键词里没有“LLM”“大模型”这类泛泛而谈的词只有Docker、Neo4j、penetration testing——这三点锁死了它的技术锚点容器化编排是部署基座图数据库是知识中枢渗透测试是唯一验证场景。它不解决“通用AI安全”这种虚题只回答一个问题当一个渗透工程师面对全新内网拓扑时如何让AI代理在20分钟内生成可执行、可回溯、可人工干预的攻击链不是生成报告不是写PoC而是直接输出带参数、带依赖、带fallback机制的docker run命令序列和Neo4j Cypher查询语句。所以如果你正打算用LangChain搭个“AI渗透助手”或者想把ChatGPT API接进Burp插件——先停一下。Pentagi的起点不是语言模型而是攻击动作的原子化建模。它把“端口扫描→服务识别→漏洞匹配→凭证爆破→权限提升→横向移动”这一整条链路拆解成Docker容器能独立运行、状态可持久化、输入输出严格定义的原子任务。每个容器就是一个Agent不共享内存只通过Neo4j图谱交换结构化上下文。比如nmap-scan-agent只做一件事接收目标IP段和端口范围输出Service节点Port节点Protocol关系边cve-match-agent不碰网络只查Neo4j里已存的CVE-2023-XXXX节点与Service节点的关联边metasploit-exec-agent则根据前序节点生成的exploit/multi/handler配置调用本地Metasploit容器执行。整个流程里LLM只出现在两个地方一是自然语言转Cypher查询如用户输入“找所有有SMB服务且未打MS17-010补丁的Windows主机”转成MATCH (h:Host)-[:RUNS]-(s:Service {name:smb}) WHERE h.os CONTAINS Windows AND NOT (h)-[:PATCHED]-(:CVE {id:CVE-2017-010}) RETURN h二是攻击链摘要生成纯后处理不影响执行逻辑。这才是Pentagi的真实形态AI是胶水不是引擎Docker是执行器不是包装盒Neo4j是记忆体不是日志库。提示别被“AI Agents”这个词带偏节奏。当前所有公开的“AI渗透测试”Demo90%停留在“用LLM解释Nmap结果”层面而Pentagi的设计哲学是反其道而行之——先用确定性规则构建攻击动作图谱再用AI降低人类理解成本。它的核心价值不在“更聪明”而在“更可控”。当你在靶场里看到一个Agent卡在某个环节时你不需要调试提示词只需要查Neo4j里对应节点的status: failed属性然后手动补全缺失的Credential节点或Exploit节点整个链路就能继续推进。这种设计让红队负责人敢把它放进正式演练因为每一步都可审计、可回滚、可替换。2. Docker不是部署选项而是Pentagi的攻击动作隔离协议很多人把Docker当成“方便打包”的工具但在Pentagi架构里Docker镜像是攻击动作的契约载体。每个Agent容器镜像的Dockerfile里强制包含三类声明LABEL pentagi.actionport_scan、LABEL pentagi.inputjson://target.json、LABEL pentagi.outputcypher://create_service_node.cql。这不是装饰性标签而是调度器一个轻量Go二进制启动容器时的校验依据。如果某个镜像缺少pentagi.output标签调度器直接拒绝启动并返回错误码ERR_NO_OUTPUT_DECLARED——因为Pentagi不允许任何“黑盒式”执行每个Agent必须明确声明它将向Neo4j图谱写入什么类型的节点和关系。以最常用的nmap-scan-agent为例它的Dockerfile关键片段如下FROM nmap:7.94 LABEL pentagi.actionport_scan LABEL pentagi.inputjson://target.json LABEL pentagi.outputcypher://create_service_node.cql COPY scan.sh /app/scan.sh COPY create_service_node.cql /app/create_service_node.cql # 必须暴露Neo4j连接参数但禁止硬编码 ENV NEO4J_URIbolt://graph:7687 ENV NEO4J_USERneo4j ENV NEO4J_PASSWORDchangeme CMD [/app/scan.sh]scan.sh脚本的核心逻辑不是调nmap命令而是构造并验证Cypher语句的合法性#!/bin/bash # 1. 解析输入JSON必须含target_ip, ports, timeout TARGET$(cat /input/target.json | jq -r .target_ip) PORTS$(cat /input/target.json | jq -r .ports // 1-1000) # 2. 执行nmap并提取结构化结果非文本解析 nmap -sS -p $PORTS -T4 $TARGET -oX /tmp/nmap.xml 2/dev/null python3 /app/parse_nmap.py /tmp/nmap.xml /tmp/services.json # 3. 为每个service生成Cypher语句注意不执行只生成 while IFS read -r service; do NAME$(echo $service | jq -r .name // unknown) VERSION$(echo $service | jq -r .version // unknown) PORT$(echo $service | jq -r .port) # 关键生成的Cypher必须符合预定义schema echo CREATE (:Service {name:$NAME, version:$VERSION, port:$PORT})-[:RUNS_ON]-(:Host {ip:$TARGET}); /output/cypher.cql done /tmp/services.json这个设计带来三个实操优势第一所有Agent输出都是纯Cypher语句文件调度器统一用neo4j-admin import或cypher-shell批量执行避免每个容器都开一个Neo4j连接第二Cypher语句可被人工审查——你随时可以打开/output/cypher.cql确认它没生成MATCH (n) DETACH DELETE n这种毁灭性语句第三输出格式强制标准化后续Agent如cve-match-agent能直接读取Service节点属性无需再做JSON Schema转换。我在某次金融客户演练中遇到过典型问题客户内网禁用nmap -sSSYN扫描要求改用nmap -sTTCP连接扫描。传统做法是改Dockerfile重新build镜像但Pentagi的解决方案是动态注入扫描策略。我们在调度器里增加一个--scan-mode参数当传入--scan-mode tcp时调度器会覆盖容器内的SCAN_CMD环境变量并挂载不同的parse_nmap.py版本针对-sT输出的XML结构做了适配。整个过程无需重建镜像5分钟内完成策略切换且所有历史扫描记录仍能正确关联到Neo4j图谱中——因为Cypher生成逻辑完全独立于扫描方式。注意Docker Desktop在Windows上的常见报错virtualization support not detected在Pentagi场景下不是安装问题而是架构误用。Pentagi默认要求Linux容器模式WSL2 backend因为所有Agent镜像都基于Debian/Alpine构建且Neo4j官方镜像不支持Windows原生容器。如果你强行在Windows容器模式下启动nmap-scan-agent会因缺少/proc/sys/net/ipv4/ip_forward而失败错误日志里不会显示“虚拟化未启用”而是nmap: failed to open device eth0。正确做法是在WSL2里安装Docker Engine再用Docker CLI连接而非依赖Docker Desktop GUI。3. Neo4j不是数据仓库而是Pentagi的攻击知识操作系统把Neo4j当成“存扫描结果的数据库”是Pentagi落地的最大认知陷阱。在真实红队环境中Neo4j承担的是攻击知识的操作系统OS职能它管理进程Attack Chain、加载驱动Exploit Modules、分配资源Credentials、处理中断Failed Steps、提供ShellCypher Query Interface。它的Schema设计不是ER图思维而是攻击生命周期状态机。Pentagi的Neo4j核心Schema只有5种节点和7种关系但覆盖了95%的渗透测试实体节点类型关键属性业务含义:Hostip,hostname,os,domain攻击面资产所有行动的物理载体:Servicename,version,port,protocol可交互的服务接口漏洞载体:Credentialusername,password,type,source权限凭证横向移动的燃料:CVEid,cvss,published,exploit_db_id漏洞知识攻击能力的索引:AttackStepaction,status,timestamp,agent原子动作实例执行痕迹关系设计体现攻击逻辑(:Host)-[:RUNS]-(:Service)服务部署关系静态(:Service)-[:VULNERABLE_TO]-(:CVE)漏洞映射关系知识库预置(:Host)-[:HAS_CREDENTIAL]-(:Credential)凭证归属关系动态发现(:AttackStep)-[:INPUT]-(:Host)/(:AttackStep)-[:OUTPUT]-(:Credential)执行IO关系审计追踪最关键的不是节点而是关系上的约束条件。例如VULNERABLE_TO关系必须带verified: true属性表示该漏洞已在靶机上验证可用HAS_CREDENTIAL关系必须带confidence: 0.80~1浮点数表示凭证可靠度——当confidence 0.5时metasploit-exec-agent会自动跳过该凭证避免浪费时间。这些约束不是代码里写的if判断而是Neo4j的关系属性索引查询时直接MATCH (h:Host)-[r:HAS_CREDENTIAL {confidence: 0.5}]-(c:Credential)毫秒级响应。我在某政务云项目中遇到过经典案例靶场里存在大量10.x.x.x网段的Windows主机但nmap-scan-agent只识别出其中3台的SMB服务。问题排查链路如下首先查Neo4jMATCH (h:Host) WHERE h.ip STARTS WITH 10. RETURN count(h)→ 返回127台确认资产发现无遗漏再查服务关系MATCH (h:Host)-[r:RUNS]-(s:Service) WHERE h.ip STARTS WITH 10. RETURN count(r)→ 仅返回3确认服务发现异常进入nmap-scan-agent容器手动执行nmap -sS -p 445 10.1.1.100→ 超时但telnet 10.1.1.100 445通查Neo4j里该主机的FirewallRule节点Pentagi自动采集的防火墙策略→ 发现(:Host {ip:10.1.1.100})-[:BLOCKS_PORT]-(:Port {number:445})手动创建(:Host)-[:BYPASSES_FIREWALL]-(:Service {name:smb})关系并设bypass_method: smbexec触发cve-match-agent重算它自动关联到CVE-2017-010并生成psexec利用链。这个过程里Neo4j不是被动存储而是主动参与决策当标准扫描失效时它保存了防火墙规则这一关键上下文让后续Agent能绕过限制。而所有操作都通过Cypher完成无需修改任何Agent代码——这才是图数据库在渗透测试中的真正价值把安全知识变成可编程、可组合、可推理的数据结构。提示Neo4j社区版下载后默认密码是neo4j但Pentagi强制要求首次启动时必须改密。调度器在连接Neo4j前会执行MATCH (n) WHERE n.password neo4j RETURN count(n)若返回非零值则拒绝启动所有Agent。这是硬性安全红线因为一旦靶场环境泄露攻击者可通过默认密码直接写入恶意AttackStep节点。实测中我们用neo4j-admin dbms set-initial-password在容器启动时自动改密密码哈希存入Docker Secret确保即使容器被逃逸也无法获取明文。4. Pentagi的实战闭环从靶场发现到攻击链生成的完整工作流Pentagi的价值不在单个Agent多强大而在五个核心Agent如何形成闭环反馈。整个工作流不是线性流水线而是带状态检查的环形结构Scan → Match → Exploit → Pivot → Report每个环节的输出都成为下一个环节的输入同时失败结果会触发上游重试或人工介入。下面以某制造业客户内网渗透为例还原一次真实攻击链生成过程。4.1 初始资产发现与图谱初始化客户提供的初始信息只有一台跳板机IP192.168.10.10。我们启动pentagi-init容器它执行三个动作用nmap -sn 192.168.10.0/24发现同网段所有存活主机生成127个:Host节点对每个Host执行ping -c1和nc -zv -w1 ip 22,3389,445,1433标记开放端口生成:Port节点并关联RUNS关系向Neo4j写入初始CypherCREATE (:AttackStep {action:init, status:completed, timestamp:timestamp()})。此时图谱已有127个Host节点但Service节点为0——因为nmap -sn不探测服务。这正是Pentagi的设计资产发现和服务发现分离避免单点故障影响全局。4.2 服务深度扫描与漏洞映射调度器下发任务给nmap-scan-agent目标是192.168.10.100一台Web服务器。Agent执行nmap -sV -p1-1000后生成CypherCREATE (:Service {name:http, version:Apache httpd 2.4.52, port:80})-[:RUNS_ON]-(:Host {ip:192.168.10.100}); CREATE (:Service {name:ssh, version:OpenSSH 8.9p1, port:22})-[:RUNS_ON]-(:Host {ip:192.168.10.100});接着cve-match-agent启动它查询MATCH (s:Service {name:http, version:Apache httpd 2.4.52}) MATCH (c:CVE) WHERE c.id ENDS WITH 2023 AND s.version CONTAINS c.affected_version RETURN c.id, c.cvss返回CVE-2023-25194CVSS 7.5并自动创建VULNERABLE_TO关系。4.3 自动化利用与凭证提取metasploit-exec-agent收到VULNERABLE_TO关系后加载预置的exploit/unix/webapp/apache_httpd_mod_cgi_rce模块生成Payload并执行。成功后它不直接写Shell而是向Neo4j写入CREATE (:Credential {username:www-data, password:shell_192.168.10.100_20231015, type:shell, source:apache_rce})-[:OBTAINED_FROM]-(:AttackStep {action:apache_rce, target:192.168.10.100}); MATCH (h:Host {ip:192.168.10.100}) CREATE (h)-[:HAS_CREDENTIAL]-(c);注意这里password字段不是明文密码而是会话标识符shell连接字符串实际凭证由pivot-agent在后续步骤中提取。4.4 横向移动与权限提升pivot-agent监听Neo4j中新增的HAS_CREDENTIAL关系发现www-data凭证后自动对同网段所有Host执行ssh www-dataip id。当连接到192.168.10.50域控制器时返回uid1001(www-data) gid1001(www-data) groups1001(www-data),0(root)——表明该账户在目标机上有sudo权限。pivot-agent立即生成提权CypherMATCH (c:Credential {username:www-data, source:apache_rce}) MATCH (h:Host {ip:192.168.10.50}) CREATE (c)-[:GRANTS_SUDO]-(h) SET h.privilege_level root此时图谱中192.168.10.50节点的privilege_level属性变为root触发report-agent生成最终报告。4.5 报告生成与人工复核report-agent不生成PDF而是输出结构化Markdown## 攻击链摘要 - **入口点**: 192.168.10.100 (Apache httpd 2.4.52) → CVE-2023-25194 RCE - **横向移动**: www-data192.168.10.100 → ssh → 192.168.10.50 - **权限提升**: sudo /bin/bash on 192.168.10.50 → root - **关键凭证**: - www-data:shell_192.168.10.100_20231015 (RCE session) - administrator:Qwerty123! (从LSASS内存提取存于Credential节点) ## 验证命令 bash # 复现RCE curl -X POST http://192.168.10.100/cgi-bin/test.cgi --data cmdid # 登录域控 ssh www-data192.168.10.50 sudo /bin/bash这份报告的所有数据都来自Neo4j图谱查询而非Agent日志拼接。当客户安全团队质疑“为什么没打补丁”我们直接执行MATCH (h:Host)-[r:VULNERABLE_TO]-(c:CVE) WHERE c.idCVE-2023-25194 RETURN h.ip, r.verified返回192.168.10.100, true——证明漏洞真实存在且已验证。 实战心得Pentagi最常被低估的能力是**失败路径的显性化**。传统渗透测试中某个端口扫不出来工程师可能就跳过但在Pentagi里nmap-scan-agent失败会生成(:AttackStep {status:failed, error:timeout})-[:FAILED_ON]-(:Host)调度器自动标记该Host为“需人工介入”并在报告里高亮显示。某次能源项目中我们因此发现了客户防火墙的ICMP限速策略——这是手动测试极易忽略的细节。Pentagi不追求100%自动化而是让所有不确定性变得可见、可追溯、可决策。 ## 5. 从零搭建Pentagi可复现的最小可行环境MVP配置 网上搜“pentagi安装教程”找不到结果因为它根本不是一键安装的产品而是一套**可裁剪的工程实践框架**。下面给出在Windows 10 WSL2环境下30分钟内跑通核心闭环的MVP配置。所有组件均使用官方镜像无第三方魔改。 ### 5.1 环境准备WSL2 Docker Engine Neo4j **第一步启用WSL2** powershell # PowerShell管理员运行 dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart # 重启后下载WSL2内核更新包并安装 wsl --install wsl -l -v # 确认版本为Ubuntu-22.04第二步在WSL2中安装Docker Engine非Docker Desktop# Ubuntu终端执行 sudo apt update sudo apt install -y ca-certificates curl gnupg sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg echo deb [arch$(dpkg --print-architecture) signed-by/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(.$(lsb_release -cs)) stable | sudo tee /etc/apt/sources.list.d/docker.list /dev/null sudo apt update sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin sudo usermod -aG docker $USER # 退出WSL2重新进入验证 docker run hello-world第三步启动Neo4j社区版带认证# 创建Neo4j数据目录 mkdir -p ~/neo4j/data ~/neo4j/logs # 运行容器首次启动会生成初始密码 docker run \ --name neo4j-pentagi \ -p 7474:7474 -p 7687:7687 \ -v ~/neo4j/data:/data -v ~/neo4j/logs:/logs \ -e NEO4J_AUTHneo4j/changeme \ -e NEO4J_dbms_connector_https_advertised__addresslocalhost:7473 \ -d docker.io/library/neo4j:5.14.0 # 获取初始密码首次启动日志 docker logs neo4j-pentagi 21 | grep Starting Node -A5 # 用浏览器访问 http://localhost:7474用neo4j/changeme登录立即改密5.2 核心Agent镜像构建与调度创建nmap-scan-agent镜像# 新建目录 nmap-agent/ mkdir nmap-agent cd nmap-agent # 创建Dockerfile cat Dockerfile EOF FROM nmap:7.94 LABEL pentagi.actionport_scan LABEL pentagi.inputjson://target.json LABEL pentagi.outputcypher://create_service_node.cql RUN apt-get update apt-get install -y python3 jq rm -rf /var/lib/apt/lists/* COPY scan.sh /app/scan.sh COPY create_service_node.cql /app/create_service_node.cql ENV NEO4J_URIbolt://host.docker.internal:7687 ENV NEO4J_USERneo4j ENV NEO4J_PASSWORDyour_new_password CMD [/app/scan.sh] EOF # 创建scan.sh cat scan.sh EOF #!/bin/bash set -e TARGET$(cat /input/target.json | jq -r .target_ip) PORTS$(cat /input/target.json | jq -r .ports // 1-100) nmap -sS -p $PORTS -T4 $TARGET -oX /tmp/nmap.xml 2/dev/null python3 -c import sys, json, xmltodict with open(/tmp/nmap.xml) as f: data xmltodict.parse(f.read()) services [] for host in data.get(nmaprun, {}).get(host, []): for port in host.get(ports, {}).get(port, []): if port.get(state, {}).get(state) open: service { name: port.get(service, {}).get(name, unknown), version: port.get(service, {}).get(version, unknown), port: int(port.get(portid)) } services.append(service) print(json.dumps(services)) /tmp/services.json echo CREATE /output/cypher.cql while IFS read -r service; do NAME$(echo $service | jq -r .name // unknown) VERSION$(echo $service | jq -r .version // unknown) PORT$(echo $service | jq -r .port) echo (:Service {name:$NAME, version:$VERSION, port:$PORT})-[:RUNS_ON]-(:Host {ip:$TARGET}); /output/cypher.cql done /tmp/services.json EOF # 构建镜像 docker build -t pentagi/nmap-scan .编写简易调度器scheduler.py#!/usr/bin/env python3 import json, subprocess, sys, time from pathlib import Path def run_agent(agent_name, input_data): # 创建临时输入目录 input_dir Path(f/tmp/pentagi_input_{int(time.time())}) input_dir.mkdir() (input_dir / target.json).write_text(json.dumps(input_data)) # 运行容器 result subprocess.run([ docker, run, --rm, --networkhost, # 直连宿主机网络 -v, f{input_dir}:/input:ro, -v, /tmp:/output:rw, -e, NEO4J_PASSWORDyour_new_password, fpentagi/{agent_name} ], capture_outputTrue, textTrue) if result.returncode ! 0: print(fAgent {agent_name} failed: {result.stderr}) return None # 读取输出Cypher cypher_file Path(/tmp/cypher.cql) if cypher_file.exists(): return cypher_file.read_text() return None # 执行一次扫描 if __name__ __main__: cypher run_agent(nmap-scan, {target_ip: 127.0.0.1, ports: 22,80,443}) if cypher: print(Generated Cypher:) print(cypher)5.3 验证与调试让第一个Cypher写入Neo4j运行调度器后你会在/tmp/cypher.cql看到类似内容CREATE (:Service {name:ssh, version:OpenSSH 8.9p1, port:22})-[:RUNS_ON]-(:Host {ip:127.0.0.1}); CREATE (:Service {name:http, version:nginx/1.18.0, port:80})-[:RUNS_ON]-(:Host {ip:127.0.0.1});手动执行写入# 安装cypher-shellNeo4j客户端 wget https://dist.neo4j.org/neo4j-community-5.14.0-unix.tar.gz tar -xzf neo4j-community-5.14.0-unix.tar.gz cd neo4j-community-5.14.0/bin ./cypher-shell -u neo4j -p your_new_password -f /tmp/cypher.cql然后在Neo4j Browser里执行MATCH (h:Host)-[r:RUNS_ON]-(s:Service) RETURN h.ip, s.name, s.port你应该看到127.0.0.1的SSH和HTTP服务节点——恭喜你的Pentagi MVP环境已通电。最后一个小技巧在真实靶场中我们用docker-compose.yml管理所有Agent但绝不把Neo4j放在同一Compose文件里。因为Neo4j需要持久化存储和独立备份而Agent容器应是无状态的。我们的标准做法是Neo4j用单独的Docker run命令启动并绑定宿主机目录Agent容器通过--network host直连避免Compose网络带来的DNS解析延迟。这样既保证稳定性又便于单个Agent升级——改完Dockerfiledocker build -t pentagi/nmap-scan . docker kill nmap-scan-container新容器启动即生效图谱数据零丢失。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询