十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Pentagi:基于Neo4j+Docker+AI Agents的渗透测试智能体架构

Pentagi:基于Neo4j+Docker+AI Agents的渗透测试智能体架构 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插件也不等同于“自动化扫描器”如NucleiSliver组合。它的核心差异在于所有动作都发生在图结构中所有状态都持久化在Neo4j里所有执行环境都封装在Docker容器内。你不会看到它输出一串JSON报告然后结束而是看到它在图数据库里持续生长出攻击路径节点、漏洞利用边、凭证传递关系并实时驱动多个Docker容器并行执行探测、提权、横向移动等原子操作。这解释了为什么搜索“pentagi”几乎找不到安装包或文档——它不是一个可下载的二进制文件而是一套可组装的架构模式。就像当年“微服务”不是某个公司发布的软件而是一种分布式系统设计思想“pentagi”现在也处于这个阶段它是红队工程师用Neo4j建模攻击面、用Docker隔离载荷、用Python/Go编写Agent调度器、用LLM做策略推理后自然形成的工程共识。热搜词里反复出现的“docker”“neo4j”“penetration testing”“ai agents”根本不是偶然堆叠的关键词而是构成pentagi三角支柱的三个不可替代组件。如果你还在用单机脚本跑nmapsqlmapcrackmapexec那不是你在做渗透测试你只是在调用命令行工具而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-driverSharpHound.exe必须在.NET Framework 4.7.2环境下运行ldapsearch则依赖OpenLDAP客户端库。若用宿主机全局环境必然版本打架。而Docker方案让每个任务运行在专属容器中# bloodhound-agent/Dockerfile FROM python:3.9-slim RUN pip install bloodhound-python4.3.0 neo4j-driver5.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.0且verified 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 MVPMinimum Viable Pentagi。目标在一个本地靶场中让Agent自动发现靶机、扫描端口、识别漏洞、生成攻击路径并执行简单利用。整个过程不依赖任何云服务全部在你的笔记本上完成。5.1 环境准备WSL2 Docker Desktop Neo4j Desktop三件套首先确认你的Windows已启用WSL2PowerShell管理员运行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 构建首个AgentReconAgent侦察代理创建目录pentagi-recon编写recon_agent.pyfrom 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_outputTrue, textTrue ) 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}) , ipip, portsports) def run(self): while True: # 查询所有statusalive的主机 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(fScanning {host[ip]}...) self.scan_host(host[ip]) time.sleep(300) # 每5分钟扫描一次 if __name__ __main__: agent ReconAgent() agent.run()5.4 容器化ReconAgent并启动编写DockerfileFROM 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_ports10.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_id和payload_imageAgent只需执行Docker run。规则计算交给独立的Scheduler服务用PythonAPScheduler它每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_time、duration_ms、success_rate等属性。用这些数据训练一个简单的XGBoost模型预测下次扫描超时概率——这才是pentagi该有的AI味道不炫技只解决问题。
返回列表