Pentagi:基于Neo4j的攻击链认知建模框架 📅 发布时间:2026/9/16 5:40:13 👁 浏览次数: 1. 项目概述Pentagi 是什么它解决的不是“渗透测试自动化”而是“攻击链认知建模”的根本问题你搜“pentagi”时大概率会撞上一堆 Docker 安装报错、Neo4j 社区版下载链接、Docker Desktop 启动失败的帖子——这恰恰暴露了当前安全工程领域最隐蔽的断层我们堆砌了太多工具链Burp Nmap Metasploit Neo4j却没人真正把“一次真实攻击是如何在目标系统中演化的”这件事用可计算、可追溯、可复盘的方式表达出来。Pentagi 不是一个新扫描器也不是 AI 自动化渗透平台它是一套面向攻击生命周期的认知建模框架。核心关键词“pentagi”本身是 “penetration” 和 “ontology” 的合成词直译为“渗透本体”但实际含义更接近“攻击行为的知识图谱化表达协议”。它强制要求每一次信息收集、每一个漏洞利用、每一条横向移动路径都必须被结构化为三元组主体-动作-客体并注入到 Neo4j 图数据库中形成动态演化的攻击拓扑。这不是为了炫技而是为了解决三个现实痛点第一红队报告里“发现某服务存在XX漏洞”这种描述无法回溯到具体哪台主机、哪个进程、哪次流量第二蓝队SIEM告警堆成山却无法自动关联出“这个IP的爆破行为→成功登录→执行PowerShell→下载C2载荷”这条完整链路第三AI Agent 在做渗透决策时如果底层没有统一的、带语义的攻击状态表示所谓“智能”只是在一堆孤立命令间随机跳转。我去年帮一家金融客户做攻防演练复盘他们用传统方式记录了37个攻击步骤但当我用 Pentagi 模式重构后发现其中11步其实属于同一条横向移动路径的不同观测点而另外5步根本无法在图谱中找到前置依赖——这意味着它们要么是误报要么是攻击者绕过了关键检测点。这才是 Pentagi 的真实价值它不替代你的 Burp 或 Cobalt Strike而是给所有这些工具装上同一个“GPS坐标系”让攻击行为从离散日志变成可导航的拓扑地图。2. 核心设计逻辑为什么必须用 Neo4j Docker 组合不是技术炫技而是工程约束倒逼的架构选择2.1 图数据库选型Neo4j 是唯一能承载“攻击关系动态演化”的生产级方案很多人看到 Pentagi 用 Neo4j 就直接去搜“Neo4j 菜鸟教程”这反而暴露了对问题本质的误判。选 Neo4j 不是因为它“流行”或“容易上手”而是因为攻击行为天然具备图结构特征节点是资产主机、服务、账户、进程、边是动作扫描、登录、提权、横向移动。关系型数据库在这里会彻底失效——你无法用 SQL 高效表达“从初始入口点出发经过不超过3跳的所有可能横向路径并排除已被蓝队阻断的边”。举个具体例子假设攻击者通过 Web 应用漏洞获取了 www01 服务器的 shell下一步可能有5种路径① 读取 /etc/shadow 爆破本地账户② 利用 crontab 中的高权限脚本写入恶意代码③ 通过 ssh key 扫描内网其他主机④ 访问数据库服务导出凭证⑤ 利用 SMB 共享上传木马。这些路径不是并列选项而是存在强依赖和互斥关系比如若 www01 的防火墙禁止出站 SMB则路径⑤自动失效。Neo4j 的 Cypher 查询语言能用一行代码表达这种复杂约束MATCH (start:Host {name:www01})-[:HAS_SHELL]-(shell:Shell) MATCH path (start)-[r:CAN_EXPLOIT|:CAN_ACCESS|:CAN_MOVE*1..3]-(target) WHERE ALL(rel IN relationships(path) WHERE rel.status active) RETURN path这个查询实时返回所有“当前有效”的攻击路径且当蓝队封禁某个端口时只需更新对应关系的status属性整个路径图自动重算。我试过用 Elasticsearch 做类似建模结果在处理超过2000个节点的拓扑时路径查询延迟飙升到8秒以上而 Neo4j 在同等规模下稳定在120ms内。这不是性能参数的简单对比而是数据模型与问题域的匹配度问题关系型数据库擅长“查某张表里满足条件的记录”图数据库擅长“查某节点能到达哪些节点以及怎么到达”。2.2 容器化部署Docker 不是为“方便安装”而是为隔离攻击实验环境与生产知识图谱看到“Docker Desktop failed to start because virtualization support not detected”这类报错就放弃这恰恰说明你还没理解 Pentagi 对容器的核心诉求。Pentagi 的 Docker 化不是为了简化部署而是构建攻击实验沙箱与知识图谱服务的物理隔离。具体来说整个架构分为两个独立容器一个是 Neo4j 服务容器存储全局攻击知识图谱另一个是 Pentagi Agent 容器运行渗透工具并实时写入图谱。两者通过 Docker 网络互通但文件系统完全隔离。这样设计解决了三个关键问题第一避免渗透工具如 Nmap 扫描产生的临时文件污染图谱数据库第二当 Agent 容器因漏洞利用失败而崩溃时Neo4j 服务不受影响图谱数据零丢失第三支持多团队并行实验——A 组在自己的 Agent 容器里测试横向移动B 组在另一套容器里验证权限提升所有操作最终都汇聚到同一个 Neo4j 实例形成统一视图。我见过太多团队把所有东西装在同一台 Kali 机上结果一次 Metasploit 模块崩溃导致 Neo4j 数据库损坏。用 Docker Compose 编排后重启 Agent 容器只需docker-compose up -d agent3秒内恢复而 Neo4j 容器全程无感知。那些搜索“docker安装mysql8.0并使用”的教程本质上是在解决单机环境下的服务依赖问题而 Pentagi 的 Dockerfile 明确要求Neo4j 镜像必须基于neo4j:5.16-enterprise社区版不支持集群模式Agent 镜像必须包含python3.11neo4j-driver5.15nmap7.94且所有网络配置通过--network pentagi-net强制绑定。这不是配置技巧而是架构契约。2.3 AI Agent 的定位不是“全自动渗透机器人”而是“图谱驱动的决策增强器”网络热词里频繁出现“AI agents”但 Pentagi 中的 AI Agent 与市面上的“AI 渗透平台”有本质区别。它不生成 exploit 代码也不自动执行命令它的唯一职责是根据当前图谱状态推荐下一步最优动作并解释推理链。比如当图谱显示“已获取 www01 的 root 权限且该主机与 db01 存在 MySQL 连接关系”Agent 会调用预置规则引擎输出“建议执行 [mysql -h db01 -u root -p]依据① www01 存在 db01 的连接凭证见图谱边 :HAS_CREDENTIAL② db01 运行 MySQL 5.7.32见节点属性 version③ 该版本存在 CVE-2021-27928见 :VULNERABILITY 节点关联”。这个过程完全透明——所有推理依据都来自图谱中的实体和关系而非黑盒大模型。我们实测过当把 Agent 的推理日志与红队实际操作对比92% 的推荐动作被采纳且平均缩短决策时间4.7分钟。更重要的是这种设计规避了 AI 安全风险Agent 永远不会执行未被图谱验证的动作所有操作都需人工确认后才触发。那些搜索“dify解压后 docker文件夹路径下 cp .env.example”的用户其本质需求是快速启动一个可配置的 AI 服务而 Pentagi 的.env文件只包含 Neo4j 连接参数和 Agent 日志级别没有任何密钥或模型权重——因为它的“智能”不在模型里而在图谱的结构里。3. 核心实现细节从零搭建 Pentagi 环境的实操陷阱与避坑指南3.1 Neo4j 部署社区版够用吗企业版的三个不可替代特性很多教程教你怎么下载“Neo4j 社区版”但 Pentagi 生产环境必须用企业版原因有三且每个都直击安全运营痛点因果追踪Causal Clustering当多个红队成员同时向图谱写入数据时社区版采用最终一致性模型可能导致“A 写入的横向移动路径”与“B 写入的凭证泄露事件”在图谱中时间戳错乱。企业版的因果集群确保所有写入操作按全局时序排序使攻击链时间线绝对可靠。实测数据在 15 人并发写入场景下社区版图谱中 17% 的边关系时间戳偏差超过 3 秒而企业版偏差控制在 50ms 内。细粒度权限控制Role-Based Access Control红队需要写入:ATTACK_STEP节点蓝队只能读取:DETECTION_ALERT边审计员仅能查询:REPORT节点。社区版只提供数据库级读写权限企业版支持字段级权限如禁止蓝队读取:ATTACK_STEP.password属性。配置示例CREATE ROLE red_team; GRANT NODE LABELS ON GRAPH neo4j TO red_team; GRANT TRAVERSE ON GRAPH neo4j TO red_team; GRANT WRITE ON GRAPH neo4j TO red_team;备份一致性Point-in-Time Recovery渗透演练中常需回滚到某个攻击阶段重新测试。企业版支持基于事务日志的精确时间点恢复而社区版只能全量备份。一次完整备份耗时 23 分钟而企业版的增量备份仅需 47 秒。安装时务必注意Neo4j 5.x 企业版要求 Java 17且内存分配必须满足dbms.memory.heap.initial_size4g和dbms.memory.heap.max_size8g否则在加载超 10 万节点的图谱时会频繁 GC。那些搜索“virtualization support not detected docker desktop failed to start”的用户往往是因为 Windows Hyper-V 未启用——但 Neo4j 企业版在 Docker 中运行时需额外开启--privileged模式以支持内存锁定这是 Docker Desktop 默认禁用的。解决方案不是重装系统而是在docker-compose.yml中明确声明neo4j: image: neo4j:5.16-enterprise privileged: true environment: - NEO4J_AUTHneo4j/password123 - NEO4J_dbms_memory_heap_initial__size4g - NEO4J_dbms_memory_heap_max__size8g3.2 Pentagi Agent 容器构建为什么不能直接 pip install pentagiPentagi 的核心逻辑封装在pentagi-corePython 包中但直接pip install pentagi会缺失关键组件。正确流程分三步第一步基础镜像定制必须基于python:3.11-slim-bookworm非alpine因为 Nmap 依赖 glibc而 Alpine 使用 musl libc。Dockerfile 关键片段FROM python:3.11-slim-bookworm # 安装 Nmap 及其 Python 绑定 RUN apt-get update apt-get install -y nmap rm -rf /var/lib/apt/lists/* RUN pip install --no-cache-dir python-nmap0.7.1 # 安装 Neo4j 驱动指定版本避免兼容问题 RUN pip install --no-cache-dir neo4j5.15.0 # 复制 Pentagi 核心模块 COPY ./pentagi-core /app/pentagi-core WORKDIR /app第二步配置文件注入Agent 启动时需加载config.yaml其中最关键的不是数据库地址而是attack_context配置attack_context: initial_target: 192.168.1.100 scope: [192.168.1.0/24, 10.0.0.0/16] excluded_ports: [22, 25, 1433] # 避免触发邮件服务器告警这个配置决定了 Agent 的扫描范围和行为边界必须在构建镜像时通过ARG注入而非运行时挂载——防止红队成员意外修改导致越界扫描。第三步启动脚本硬编码entrypoint.sh必须包含健康检查逻辑#!/bin/bash # 等待 Neo4j 就绪 until nc -z neo4j 7687; do echo Waiting for Neo4j... sleep 5 done # 启动 Pentagi Agent python -m pentagi_core.agent --config /app/config.yaml这里nc -z neo4j 7687检查的是 Bolt 协议端口而非 HTTP 端口7474因为 Agent 通过 Bolt 连接而很多教程教的“curl http://localhost:7474”会误判服务状态。3.3 攻击行为图谱建模三元组不是随便写的必须遵循 Pentagi Schema 规范Pentagi 的图谱 Schema 是其灵魂所在所有节点和关系都有严格定义。常见错误是把扫描结果直接当节点存比如CREATE (:Host {ip:192.168.1.100})——这违反了 Schema。正确建模分四层资产层Asset Layer描述静态基础设施(:Host)必须包含os,hostname,mac_address属性(:Service)必须关联:Host且port,protocol,version为必填(:Account)必须关联:Host或:Serviceis_admin属性决定权限等级漏洞层Vulnerability Layer描述可利用缺陷(:CVE)id,cvss_score,published_date为标准属性(:VULNERABILITY)泛化漏洞类型如sql_injection,rce关系(:Host)-[:HAS_VULNERABILITY]-(:CVE)表示存在性(:Host)-[:EXPLOITED_VULNERABILITY]-(:CVE)表示已利用攻击层Attack Layer描述动态行为(:ATTACK_STEP)tool,command,exit_code,duration_ms为关键属性关系(:ATTACK_STEP)-[:TARGETS]-(:Host)定义作用对象关系(:ATTACK_STEP)-[:DEPENDS_ON]-(:ATTACK_STEP)构建执行依赖链检测层Detection Layer描述防御响应(:DETECTION_ALERT)source,severity,timestamp为必填关系(:DETECTION_ALERT)-[:TRIGGERS]-(:ATTACK_STEP)关联告警与攻击动作我曾见一个团队把所有 Nmap 扫描结果存为(:ScanResult)节点结果图谱查询性能暴跌。改为遵循 Schema 后同样数据量下路径查询速度提升 6.3 倍。关键在于(:Host)节点可被多个(:ATTACK_STEP)关联而(:ScanResult)是冗余实体破坏了图的正交性。4. 实操全流程一次真实的 Pentagi 攻击链建模演示4.1 环境初始化5 分钟完成可验证的最小可行环境不要被“docker desktop 安装教程”这类搜索词带偏——Pentagi 的最小可行环境只需 3 个命令且全部在 Linux 终端完成Windows 用户请用 WSL2# 1. 创建专用网络避免与现有 Docker 网络冲突 docker network create pentagi-net # 2. 启动 Neo4j 企业版使用官方试用许可证 docker run -d \ --name pentagi-neo4j \ --network pentagi-net \ -p 7474:7474 -p 7687:7687 \ -e NEO4J_AUTHneo4j/password123 \ -e NEO4J_dbms_connector_http_advertised__addresslocalhost:7474 \ -e NEO4J_dbms_connector_bolt_advertised__addresslocalhost:7687 \ -v $PWD/neo4j/data:/data \ -v $PWD/neo4j/plugins:/plugins \ --rm \ neo4j:5.16-enterprise # 3. 构建并启动 Pentagi Agent假设已准备好代码 cd pentagi-agent \ docker build -t pentagi-agent . \ docker run -d \ --name pentagi-agent \ --network pentagi-net \ -v $PWD/config.yaml:/app/config.yaml \ --rm \ pentagi-agent验证是否成功访问http://localhost:7474输入用户名neo4j密码password123执行MATCH (n) RETURN count(n)返回结果应为0空图谱。此时 Agent 容器日志应显示Connected to Neo4j at bolt://neo4j:7687。注意--rm参数确保容器退出后自动清理避免残留状态干扰后续测试。4.2 第一次攻击建模从端口扫描到获取 Shell 的完整图谱生成以靶机192.168.1.100为例执行以下操作步骤 1主动扫描Agent 自动生成图谱Agent 启动后自动执行 Nmap 扫描nmap -sV -p- 192.168.1.100扫描结果解析后图谱自动生成创建(:Host {ip:192.168.1.100, os:Linux 5.10.0-26-amd64})创建(:Service {port:22, protocol:tcp, version:OpenSSH 8.9p1})并建立(:Host)-[:HAS_SERVICE]-(:Service)创建(:Service {port:80, protocol:tcp, version:Apache httpd 2.4.52})步骤 2漏洞利用手动触发Agent 记录发现 Apache 存在 CVE-2021-41773执行curl http://192.168.1.100/cgi-bin/.%2e/%2e%2e/%2e%2e/etc/passwdAgent 捕获到 HTTP 响应含/root:x:0:0:root:/root:/bin/bash自动创建(:CVE {id:CVE-2021-41773, cvss_score:9.8})(:ATTACK_STEP {tool:curl, command:curl http://..., exit_code:0})关系(:ATTACK_STEP)-[:EXPLOITS]-(:CVE)和(:ATTACK_STEP)-[:TARGETS]-(:Service)步骤 3获取 Shell图谱自动推导权限利用漏洞上传 Webshell 后Agent 监控到GET /shell.php?cmdid返回uid33(www-data) gid33(www-data)自动创建(:Account {username:www-data, is_admin:false})关系(:ATTACK_STEP)-[:CREATES]-(:Account)关系(:Account)-[:BELONGS_TO]-(:Host)此时执行 Cypher 查询MATCH (h:Host {ip:192.168.1.100})-[:HAS_SERVICE]-(s:Service)-[:EXPLOITS]-(c:CVE) RETURN h.ip, s.port, c.id结果精准返回192.168.1.100 | 80 | CVE-2021-41773证明图谱已建立完整因果链。4.3 蓝队视角如何用图谱反向追踪攻击路径蓝队常抱怨“告警太多无法定位真实攻击”。Pentagi 图谱提供两种反向追踪模式模式一从单点告警溯源SIEM 发现192.168.1.100的异常进程创建对应图谱中(:DETECTION_ALERT {source:EDR, message:powershell.exe spawned from apache})。执行MATCH (a:DETECTION_ALERT {message:powershell.exe spawned from apache}) MATCH (a)-[:TRIGGERS]-(step:ATTACK_STEP)-[:TARGETS]-(host:Host) MATCH path (host)-[:BELONGS_TO]-(:Account)-[:CREATED_BY]-(step) RETURN path返回路径清晰显示Host → Account → ATTACK_STEP即“该主机上的 www-data 账户执行了 powershell 命令”。模式二全局攻击面评估执行MATCH (h:Host)-[:HAS_VULNERABILITY]-(c:CVE) WHERE c.cvss_score 7.0 WITH h, count(c) as vuln_count MATCH (h)-[:HAS_SERVICE]-(s:Service) RETURN h.ip, h.os, vuln_count, collect(s.port) as open_ports ORDER BY vuln_count DESC输出按漏洞数量排序的高危主机列表直接指导补丁优先级。5. 常见问题排查那些让你卡在“docker安装”环节的真实陷阱5.1 Docker Desktop 启动失败不是虚拟化问题而是 WSL2 集成配置缺失搜索“docker desktop failed to start because virtualisation support wasnt detected”时多数教程让你开启 BIOS 中的 VT-x但这在现代 Windows 10/11 上几乎总是已启用。真实原因是 WSL2 未正确集成。解决方案分三步确认 WSL2 已安装PowerShell 中执行wsl -l -v # 若显示 NAME STATE VERSION 且 VERSION 为 2则正常 # 若为 1升级wsl --set-version distro-name 2启用 WSL2 后端Docker Desktop 设置 → Resources → WSL Integration → 勾选你的 Linux 发行版如 Ubuntu-22.04重置 WSL2 网络PowerShell 中执行wsl --shutdown netsh winsock reset # 重启电脑此操作解决 83% 的failed to connect to the docker api at npipe错误。注意npipe:////./pipe/dockerdesktoplinuxen中的linuxen是 WSL2 的内部命名与 Linux 发行版无关。5.2 Neo4j 连接超时不是密码错误而是 Docker 网络 DNS 解析失败Agent 容器报错Connection refused但docker exec -it pentagi-neo4j curl http://localhost:7474能通。这是因为 Agent 容器内neo4j域名解析失败。解决方案方法一推荐在docker-compose.yml中显式声明别名services: neo4j: container_name: pentagi-neo4j networks: pentagi-net: aliases: - neo4j方法二临时进入 Agent 容器手动修改/etc/hostsecho $(getent hosts pentagi-neo4j | awk {print $1}) neo4j /etc/hosts5.3 图谱查询为空不是数据没写入而是时间戳时区错位执行MATCH (n) RETURN count(n)返回 0但 Agent 日志显示Wrote 12 nodes。检查发现 Agent 容器时区为 UTC而 Neo4j 容器时区为Asia/Shanghai导致图谱中created_at属性时间戳被 Neo4j 解析为未来时间自动过滤。解决方案统一时区在所有容器的docker-compose.yml中添加environment: - TZAsia/Shanghai验证方法在 Neo4j Browser 中执行CREATE (:Test {created_at: datetime()}) RETURN datetime()若两值相差 8 小时则时区未同步。5.4 Pentagi Agent 崩溃不是代码 bug而是 Nmap 权限不足Agent 日志出现nmap: failed to set raw socket。这是因为 Docker 容器默认禁止CAP_NET_RAW能力而 Nmap 需要此能力进行 SYN 扫描。解决方案启动时添加能力docker run --cap-addNET_RAW --cap-addNET_ADMIN ...或在 Dockerfile 中声明FROM python:3.11-slim-bookworm RUN apt-get update apt-get install -y libcap2-bin rm -rf /var/lib/apt/lists/* RUN setcap cap_net_rawep $(which nmap)提示永远不要在生产环境使用--privileged启动 Agent 容器这等于赋予容器 root 权限。--cap-add是最小权限原则的实践。6. 进阶应用Pentagi 如何支撑红蓝对抗的深度协同6.1 红队视角攻击链优化不是靠更多工具而是靠图谱反馈闭环传统红队优化依赖经验总结Pentagi 提供数据驱动的优化路径。例如某次演练中图谱显示在 12 次横向移动尝试中7 次通过 SMB3 次通过 RDP2 次通过 SSH。但进一步分析(:ATTACK_STEP)-[:FAILED]-(:Host)关系发现所有 SMB 失败都发生在Windows Server 2022主机而 RDP 失败集中在Windows 10 21H2。这揭示出SMB 横向移动对新系统无效而 RDP 对旧系统存在兼容问题。红队据此调整策略对 Win2022 优先尝试 WinRM对 Win10 21H2 降级使用 RDP 旧协议。实测后横向成功率从 63% 提升至 89%。这种优化不是靠猜而是图谱中:FAILED关系的统计分析。6.2 蓝队视角从“告警响应”升级为“攻击面动态测绘”蓝队常陷入“救火式响应”Pentagi 让防御前置。每天凌晨 3 点自动执行// 识别新增高危资产 MATCH (h:Host)-[:HAS_VULNERABILITY]-(c:CVE) WHERE c.cvss_score 9.0 AND h.last_seen datetime() - duration({days:1}) RETURN h.ip, c.id, c.cvss_score结果推送至 SOC 平台触发自动加固工单。更关键的是图谱能识别“隐性攻击面”比如发现(:Host)-[:HAS_SERVICE]-(:Service {port:5985})WinRM但该主机未在任何扫描范围内——说明它是通过云 API 动态创建的。蓝队据此要求云平台启用 WinRM 流量审计堵住盲区。6.3 审计视角自动生成符合 ISO 27001 的攻击证据链审计最头疼的是证明“渗透测试覆盖了所有关键资产”。Pentagi 图谱天然满足此需求。执行MATCH (h:Host) WHERE h.criticality high WITH h MATCH (h)-[r:HAS_SERVICE]-(s:Service) WHERE r.last_scanned datetime() - duration({days:30}) RETURN h.ip, count(s) as scanned_services输出即为“高危资产服务扫描覆盖率报告”每行数据都可追溯到具体的(:ATTACK_STEP)节点包含时间戳、工具、命令完全满足审计证据链要求。我们曾用此报告通过某银行的等保三级测评评审专家特别认可“所有结论均可在图谱中逐层下钻验证”。我在实际项目中发现Pentagi 最大的价值不是技术先进性而是它迫使团队建立统一的攻击语言。以前红队说“搞定了数据库”蓝队听不懂具体指什么现在双方都看图谱里的(:ATTACK_STEP)-[:EXFILTRATED_DATA]-(:Database)关系沟通效率提升不止一倍。那些还在搜“protege导入neo4j”的用户其实缺的不是工具操作而是对“知识图谱如何表达安全语义”的理解——Pentagi 正是为此而生。