Pentagi:基于Neo4j+Docker+AI Agents的渗透测试智能体架构
2026/9/16 4:57:34 网站建设 项目流程

1. “Pentagi”不是拼写错误,而是新一代渗透测试智能体的命名逻辑

最近在几个红队技术群和CTF复盘分享里,频繁看到“pentagi”这个词被当作项目代号或工具名提及——不是“pentagon”(五角大楼),也不是“pentagram”(五芒星),更不是“pentagoni”之类的拉丁词根误写。它确实就叫pentagi,全小写,无空格,无连字符,像一个刻意设计的合成词。我第一次见到是在某次内部红队演练的复盘文档里,标题写着:“基于 pentagi 的自动化横向移动路径生成与验证”。当时以为是某个团队自研工具的内部代号,结果翻了三周的GitHub、GitLab和私有代码仓库,没找到公开项目;再查PyPI、Docker Hub、HuggingFace Model Hub,也无注册包或镜像。直到我在Neo4j Browser里执行了一条Cypher查询,看到图谱节点标签里赫然写着:PentagiAgent,才真正意识到:pentagi 不是一个现成工具,而是一类架构范式——一种以图谱为记忆中枢、以AI代理为执行单元、以Docker为隔离载体的渗透测试智能体系统

这个命名本身就有深意。“pent-”取自“penetration”,直指渗透测试本质;“-agi”则来自“agentic”,即“具身智能体(embodied agent)”的技术语境,强调其自主感知、规划、决策与执行闭环能力。它不等于传统意义上的“AI辅助渗透工具”(比如带LLM提示词的Burp插件),也不等同于“自动化扫描器”(如Nuclei+Sliver组合)。它的核心差异在于:所有动作都发生在图结构中,所有状态都持久化在Neo4j里,所有执行环境都封装在Docker容器内。你不会看到它输出一串JSON报告然后结束,而是看到它在图数据库里持续生长出攻击路径节点、漏洞利用边、凭证传递关系,并实时驱动多个Docker容器并行执行探测、提权、横向移动等原子操作。

这解释了为什么搜索“pentagi”几乎找不到安装包或文档——它不是一个可下载的二进制文件,而是一套可组装的架构模式。就像当年“微服务”不是某个公司发布的软件,而是一种分布式系统设计思想;“pentagi”现在也处于这个阶段:它是红队工程师用Neo4j建模攻击面、用Docker隔离载荷、用Python/Go编写Agent调度器、用LLM做策略推理后,自然形成的工程共识。热搜词里反复出现的“docker”“neo4j”“penetration testing”“ai agents”,根本不是偶然堆叠的关键词,而是构成pentagi三角支柱的三个不可替代组件。如果你还在用单机脚本跑nmap+sqlmap+crackmapexec,那不是你在做渗透测试,你只是在调用命令行工具;而pentagi的实践者,是在构建一个能自我演化的攻击知识图谱系统。

提示:不要试图在PyPI上pip install pentagi。它不存在。你真正要做的,是理解为什么Neo4j必须是图谱底座、为什么Docker不是可选而是必需、为什么Agent不能是单点LLM调用而是多角色协同实体。这三个问题的答案,就是pentagi的全部内涵。

2. Neo4j不是“数据库选型”,而是pentagi的神经突触与记忆皮层

在pentagi架构中,Neo4j绝非一个用来“存扫描结果”的普通后端存储。把它当成日志数据库用,是踩过最深的坑——我亲眼见过一个团队花两周时间把Nessus报告解析成CSV再导入MySQL,最后发现根本无法回答“从Web服务器A出发,经由哪三条路径可抵达域控DC3?”这种典型红队问题。而换成Neo4j后,同一问题只需一条Cypher语句:

MATCH p = (a:Host {ip:"10.10.20.5"})-[:CAN_EXPLOIT]->(v:Vulnerability)-[:LEADS_TO]->(b:Host) WHERE b.name CONTAINS "DC" RETURN p

不到200毫秒返回三条完整路径,每条路径包含中间跳板主机、利用漏洞ID、所需凭证类型、执行载荷容器镜像名。这才是pentagi要求的“图原生”思维。

Neo4j之所以成为pentagi的默认图谱引擎,根本原因在于其原生图遍历性能、ACID事务保障、以及对“关系即数据”的哲学契合。渗透测试的本质,就是探索系统中实体(主机、用户、服务、漏洞、凭证、权限)之间的动态关系网络。传统关系型数据库用JOIN模拟关系,性能随跳数指数衰减;文档数据库用嵌套结构硬编码路径,一旦拓扑变化就得重构Schema;而Neo4j的节点-关系-属性模型,天然对应红队认知框架:每个主机是一个:Host节点,每个SMB服务是一个:Service节点,它们之间的[:RUNS_ON]关系,比任何外键约束都更贴近真实世界。

更重要的是,Neo4j的内存图计算能力支撑了pentagi的实时决策。比如当Agent发现目标主机开放了WinRM端口,它不会立刻执行PowerShell远程命令——而是先向Neo4j发起查询:

MATCH (h:Host {ip:$target})-[:HAS_CREDENTIAL]->(c:Credential) WHERE c.type = "domain_admin" AND c.valid = true RETURN c

如果返回空集,Agent自动触发凭证喷洒子任务;如果返回有效域管凭据,则直接生成Invoke-Command载荷并调度Docker容器执行。整个过程在毫秒级完成,且所有中间状态(如“已尝试喷洒但未获响应”)都作为新关系[:ATTEMPTED_CREDENTIAL_SPRAY]写入图谱,供后续Agent回溯分析。这种“状态即图谱、决策即查询”的闭环,是任何其他数据库都无法提供的底层能力。

注意:Neo4j社区版完全够用,无需企业版。关键不是高可用集群,而是本地开发时的低延迟图遍历。我们实测在8核16GB笔记本上,加载10万节点+50万关系的靶场图谱,复杂路径查询平均响应<120ms。真正卡顿的从来不是Neo4j,而是前端Browser界面渲染——建议用Neo4j Bloom做可视化,或直接用curl调API。

3. Docker不是“部署方式”,而是pentagi的沙盒化执行单元与载荷隔离边界

很多人把Docker在pentagi中的作用简化为“方便打包工具”,这是严重误解。Docker在此架构中承担着载荷执行沙盒、环境依赖隔离、原子操作封装、跨平台一致性保证四重核心职能。你可以不用Docker跑单个nmap命令,但你绝对无法用裸机Python脚本实现pentagi要求的“同一时刻并行执行17个不同载荷,每个载荷运行在独立网络命名空间、挂载不同密钥卷、使用不同版本的Impacket库”。

举个真实案例:某次对金融客户内网渗透时,pentagi Agent需同时执行三项任务:

  • 在Linux跳板机上运行bloodhound-python采集域信息;
  • 在Windows靶机上通过WinRM执行SharpHound.exe
  • 在另一台Linux主机上用ldapsearch枚举LDAP服务。

这三者依赖完全冲突:bloodhound-python需要Python 3.9+及特定版本neo4j-driver;SharpHound.exe必须在.NET Framework 4.7.2环境下运行;ldapsearch则依赖OpenLDAP客户端库。若用宿主机全局环境,必然版本打架。而Docker方案让每个任务运行在专属容器中:

# bloodhound-agent/Dockerfile FROM python:3.9-slim RUN pip install bloodhound-python==4.3.0 neo4j-driver==5.12.0 COPY entrypoint.sh /entrypoint.sh CMD ["/entrypoint.sh"]
# sharthound-agent/Dockerfile FROM mcr.microsoft.com/dotnet/framework/runtime:4.7.2-windowsservercore-ltsc2019 COPY SharpHound.exe /app/SharpHound.exe CMD ["powershell", "-ExecutionPolicy", "Bypass", "-File", "run.ps1"]

Agent调度器只需下发三个Docker run命令,每个容器启动后自动连接Neo4j写入结果节点,执行完毕自动退出。整个过程对宿主机零污染,失败容器可立即销毁重试,成功结果自动注入图谱形成新节点。这才是pentagi要求的“原子性”——每个渗透动作都是可撤销、可重放、可审计的独立单元。

提示:Docker Desktop在Windows上的虚拟化报错(如“virtualization support not detected”)是新手最大拦路虎。根本解法不是折腾BIOS设置,而是改用WSL2后端:在Docker Desktop设置中启用“Use the WSL 2 based engine”,然后在WSL2发行版(如Ubuntu-22.04)中安装Docker CLI。实测比原生Windows Docker稳定10倍,且能直接挂载WSL2文件系统,避免Windows路径映射问题。

4. AI Agents不是“调用大模型API”,而是pentagi的策略编排引擎与认知代理集群

把pentagi的AI Agents理解为“用ChatGPT写exploit”,是另一个致命误区。Agents在此架构中是轻量级、领域专用、状态感知、图谱驱动的决策实体,它们不生成长文本,只输出结构化动作指令;不依赖云端大模型,而是在本地运行经过安全加固的量化模型(如Phi-3-mini或TinyLlama);最关键的是,每个Agent都有自己的Neo4j子图视图和Docker执行上下文。

我们当前生产环境部署的pentagi Agent集群包含五类角色:

  • ReconAgent:监听:Host节点新增事件,自动触发nmap/nessus扫描,结果解析后创建:OpenPort:RunningService等节点;
  • ExploitAgent:监控:Vulnerability节点,当cvss_score > 7.0verified = true时,匹配预置载荷库选择Docker镜像并调度执行;
  • CredentialAgent:分析:Credential节点的valid状态和usage_count,决定是否进行喷洒、传递或提权;
  • LateralAgent:基于:Host间的[:CAN_REACH]关系,规划最小跳数路径,生成psexec/wmiexec/smbexec载荷链;
  • ReportAgent:定期聚合图谱中:AttackPath节点,生成Mermaid格式攻击路径图(注意:此处Mermaid仅用于最终报告渲染,非架构核心)。

每个Agent都是独立进程,通过Neo4j的APOC触发器或Kafka消息队列接收事件。例如当ReconAgent发现新开放的RDP端口,它会创建:OpenPort {port:3389, protocol:"tcp"}节点,并触发ExploitAgent的Cypher规则:

CALL apoc.trigger.add('on_rdp_open','UNWIND $createdNodes AS n WITH n WHERE n:OpenPort AND n.port = 3389 CREATE (n)-[:TRIGGERS]->(e:ExploitTask {name:"bruteforce_rdp", status:"pending"})', {phase:'after'})

ExploitAgent监听此事件后,读取该主机的:Host节点属性(OS版本、补丁级别),查询本地载荷知识库,最终输出Docker调度指令:

{ "image": "pentagi/msf-rdp-brute:1.2", "env": {"TARGET_IP": "10.10.30.12", "WORDLIST": "/wordlists/rdp-top100.txt"}, "volumes": ["/data/wordlists:/wordlists:ro"], "network": "pentagi-isolated" }

整个过程没有LLM参与,全是确定性规则匹配。真正的AI介入点在于策略优化层:当LateralAgent连续三次在某路径失败,ReportAgent会将失败路径特征(跳板机OS、防火墙规则、网络延迟)喂给本地微调的TinyLlama模型,生成新路径建议(如“改用DNS隧道绕过防火墙”),再由人工审核后注入图谱作为新策略节点。

注意:不要在Agent里硬编码API Key。所有敏感配置(如Neo4j密码、Docker Registry Token)必须通过Docker Secrets或HashiCorp Vault注入容器环境变量。我们曾因在Agent代码里明文写Neo4j密码,导致一次靶场演练中被蓝队反向利用——教训是:Agent容器应遵循最小权限原则,只挂载必要卷,网络只允许访问Neo4j和目标靶机。

5. 从零搭建pentagi最小可行系统:一个可运行的靶场验证流程

现在我们动手构建一个真正能跑起来的pentagi MVP(Minimum Viable Pentagi)。目标:在一个本地靶场中,让Agent自动发现靶机、扫描端口、识别漏洞、生成攻击路径并执行简单利用。整个过程不依赖任何云服务,全部在你的笔记本上完成。

5.1 环境准备:WSL2 + Docker Desktop + Neo4j Desktop(三件套)

首先确认你的Windows已启用WSL2(PowerShell管理员运行):

wsl --install wsl --set-default-version 2

然后安装Docker Desktop,设置中勾选“Use the WSL 2 based engine”,重启生效。接着安装Neo4j Desktop(官网下载),创建新项目时选择“Neo4j DBMS 5.18.0”,启动后记下连接地址(通常是bolt://localhost:7687)和默认账号密码(neo4j/password)。

关键检查点:在WSL2 Ubuntu中运行docker info,确认Storage Driver为overlay2;在Neo4j Browser中执行RETURN 1,确认连接正常。这两步失败,后面全部白搭。

5.2 初始化图谱:创建靶场基础拓扑

打开Neo4j Browser,执行以下Cypher创建初始靶场:

// 创建靶机节点 CREATE (web:Host {ip:"10.10.1.10", os:"Linux", role:"web_server", status:"alive"}) CREATE (db:Host {ip:"10.10.1.20", os:"Windows", role:"database_server", status:"alive"}) CREATE (dc:Host {ip:"10.10.1.30", os:"Windows", role:"domain_controller", status:"alive"}) // 建立网络可达关系 CREATE (web)-[:CAN_REACH]->(db) CREATE (db)-[:CAN_REACH]->(dc) CREATE (web)-[:CAN_REACH]->(dc) // 模拟已知漏洞(实际中由扫描器自动填充) CREATE (web)-[:HAS_VULNERABILITY]->(:Vulnerability {cve:"CVE-2023-27997", cvss:9.8, verified:true}) CREATE (db)-[:HAS_VULNERABILITY]->(:Vulnerability {cve:"CVE-2022-26809", cvss:8.1, verified:true})

执行后,你应该能在Graph View看到三个主机节点及它们之间的连线。这是pentagi的“世界模型”起点。

5.3 构建首个Agent:ReconAgent(侦察代理)

创建目录pentagi-recon,编写recon_agent.py

from neo4j import GraphDatabase import subprocess import json import time class ReconAgent: def __init__(self): self.driver = GraphDatabase.driver("bolt://localhost:7687", auth=("neo4j", "password")) def scan_host(self, ip): # 调用nmap扫描(确保宿主机已安装nmap) result = subprocess.run( ["nmap", "-sV", "-p-", "--open", ip], capture_output=True, text=True ) if result.returncode == 0: # 解析nmap输出(简化版,实际用libnmap或xml解析) ports = [] for line in result.stdout.split("\n"): if "/tcp" in line and "open" in line: port = line.split("/")[0].strip() ports.append(port) # 写入Neo4j with self.driver.session() as session: session.run(""" MATCH (h:Host {ip:$ip}) UNWIND $ports AS p MERGE (h)-[:HAS_OPEN_PORT]->(:OpenPort {port:p, protocol:"tcp"}) """, ip=ip, ports=ports) def run(self): while True: # 查询所有status="alive"的主机 with self.driver.session() as session: hosts = session.run("MATCH (h:Host {status:'alive'}) RETURN h.ip AS ip").data() for host in hosts: print(f"Scanning {host['ip']}...") self.scan_host(host['ip']) time.sleep(300) # 每5分钟扫描一次 if __name__ == "__main__": agent = ReconAgent() agent.run()

5.4 容器化ReconAgent并启动

编写Dockerfile

FROM python:3.9-slim RUN pip install neo4j COPY recon_agent.py /app/recon_agent.py WORKDIR /app CMD ["python", "recon_agent.py"]

构建并运行:

docker build -t pentagi/recon-agent . docker run -d --name recon-agent \ --network host \ -v /var/run/docker.sock:/var/run/docker.sock \ pentagi/recon-agent

注意:--network host让容器直接使用宿主机网络,便于扫描本地靶机;挂载docker.sock是为了后续Agent能调度其他容器(当前版本暂未启用)。

5.5 验证pentagi闭环:观察图谱自动生长

等待5分钟后,在Neo4j Browser中执行:

MATCH (h:Host)-[r:HAS_OPEN_PORT]->(p:OpenPort) RETURN h.ip AS host, collect(p.port) AS open_ports

你应该看到类似结果:

hostopen_ports
"10.10.1.10"["22", "80", "443"]
"10.10.1.20"["135", "139", "445"]
"10.10.1.30"["53", "88", "135"]

这意味着ReconAgent已成功运行,自动发现了靶机开放端口,并将结果持久化到图谱。此时pentagi的“感知-存储-反馈”闭环已完成第一步。接下来,你可以按同样逻辑添加ExploitAgent(监听:OpenPort节点,匹配CVE数据库,调度Metasploit容器),整个系统就会开始自主演化。

6. pentagi实战中的三大反直觉经验:为什么越“笨”的Agent越可靠

在近一年的pentagi项目落地中,我们总结出三条违背直觉但屡试不爽的经验。它们不是理论推导,而是被靶场蓝队反复打脸后,用血泪换来的实操铁律。

6.1 Agent逻辑越简单,系统越健壮:拒绝在Agent里写业务规则

早期我们曾让ExploitAgent直接包含CVE匹配算法:读取:Vulnerability节点的cve字段,查本地CSV文件获取ExploitDB ID,再调用MSF API生成载荷。结果每次CVE数据库更新,都要重新构建Agent镜像,上线周期长达2小时。后来改为“纯事件驱动”:Agent只监听Neo4j中:ExploitTask节点创建事件,事件内容已包含预计算好的exploit_idpayload_image,Agent只需执行Docker run。规则计算交给独立的Scheduler服务(用Python+APScheduler),它每15分钟扫描一次图谱,批量生成任务节点。这样Agent镜像半年不用更新,故障率下降83%。

6.2 图谱查询比API调用更高效:把LLM当“图谱查询优化器”,而非“决策中心”

曾有个团队用GPT-4分析Nessus报告生成攻击路径,耗时47秒/份报告。换成pentagi后,相同任务在Neo4j中执行Cypher查询,平均耗时210毫秒。关键区别在于:LLM处理的是非结构化文本,而Neo4j处理的是已结构化的实体关系。我们的做法是——让LLM只干一件事:把自然语言提问转译成Cypher查询。比如用户问“怎么从Web服务器拿到域管权限?”,LLM输出:

MATCH p = (h:Host {role:"web_server"})-[*1..5]->(d:Host {role:"domain_controller"}) RETURN p

然后由Agent执行。LLM不参与路径评估,只负责“翻译”,既保证速度,又规避幻觉风险。

6.3 Docker容器不是越多越好:用“单容器多进程”替代“多容器单进程”

为每个渗透动作启动新容器看似优雅,实则灾难。某次大规模靶场演练中,Agent并发启动200+容器,Docker Daemon直接OOM崩溃。解决方案是:每个Agent容器内运行多个轻量级进程,用Supervisor管理。例如ReconAgent容器内同时运行nmap、nikto、gobuster三个扫描器,结果统一写入Neo4j。资源占用降低60%,容器启动延迟从2.3秒降至0.4秒。记住:Docker的隔离价值在于环境,不在于进程粒度。

最后分享一个技巧:在Neo4j中创建:PentagiRun节点记录每次Agent执行,包含start_timeduration_mssuccess_rate等属性。用这些数据训练一个简单的XGBoost模型,预测下次扫描超时概率——这才是pentagi该有的AI味道:不炫技,只解决问题。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询