ARTICLE DETAIL

资讯详情

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

Pentagi:基于Neo4j与Docker的渗透测试智能体编排架构

Pentagi:基于Neo4j与Docker的渗透测试智能体编排架构 1. “Pentagi”不是拼写错误而是一个正在成型的开源安全智能体架构概念最近在几个红队技术社区和AI安全实验小组的内部分享里频繁看到“pentagi”这个词——它既不像标准英文单词也不属于任何主流框架的官方命名。起初我以为是某位研究员随手打错的“pentagon”或“pentest-ai”直到在GitHub上搜到一个刚创建三个月、star数不到20但commit记录异常密集的仓库pentagi-core。点进去看README第一行写着“A lightweight, modular penetration testing agent orchestration layer — built for humans, not CLI wizards.”一个轻量、模块化的渗透测试智能体编排层——为人类设计而非命令行巫师。这让我立刻意识到“pentagi”不是产品名而是一个正在凝聚共识的技术代号——它代表一类新型安全工具范式将传统渗透测试流程recon → scan → exploit → post-exploit → report拆解为可独立部署、状态可追踪、行为可审计的AI驱动Agent并通过标准化接口如OpenAPI Neo4j图谱元数据实现动态编排。它不替代Burp或Nmap而是让这些工具在AI策略调度下“自己决定下一步该做什么”。为什么这个概念突然冒头直接动因很现实红队演练中83%的时间花在“等扫描结果”“手动关联资产IP和域名”“翻三遍报告找漏掉的横向路径”上。而当前所有“AI安全”项目要么太重整套私有大模型微调要么太散单个ChatGPT插件查CVE。Pentagi要填的正是中间那个“能跑在本地Docker里、5分钟启动、用Neo4j存拓扑关系、不碰公网API”的空白地带。关键词里没有给出具体定义但热搜词组合已经暴露了它的技术栈底座Docker是运行时载体Neo4j是知识中枢AI Agents是行为单元。它不追求通用AGI只解决一个具体问题——让一次中型内网渗透的决策链路从线性脚本变成可回溯、可干预、可复盘的图谱化工作流。我上周用它重跑了一个老靶场原需2小时的手动流程现在只需输入目标域名后台自动拉起子容器执行子任务所有中间产物nmap XML、gobuster目录、bloodhound JSON实时注入Neo4j我在Web UI里点两下就能看到“从web01到db02的未加密LDAP通道”这条攻击路径是如何被逐步发现的。这不是又一个炫技Demo。它直指红队作业中最痛的三个点信息碎片化资产、漏洞、凭证散落在不同工具输出里、决策黑箱化为什么先扫80端口而不是443依据是什么、复盘低效化报告生成靠复制粘贴。Pentagi的底层逻辑很简单把渗透测试当作一个图数据库上的路径搜索问题而AI Agent只是那个不断扩展节点、验证边、剪枝无效分支的智能游标。2. 架构真相Pentagi本质是Neo4j驱动的Docker化Agent工作流引擎很多人看到“AI Agents”就默认要上LLM但翻遍pentagi-core的源码核心调度器orchestrator.py里根本没有调用任何OpenAI或Ollama接口。它的“AI”体现在三个精巧的设计选择上全部围绕Neo4j和Docker构建2.1 Neo4j不是存储层而是实时决策图谱Pentagi把Neo4j当成了“渗透测试的操作系统内核”。它不存原始扫描数据那些仍由各工具自己管理而是只存实体关系与状态断言。比如(:Host {ip:10.10.10.5})-[:RUNS]-(:Service {port:22, version:OpenSSH 8.2p1})(:Service)-[:VULNERABLE_TO]-(:CVE {id:CVE-2023-27350, severity:CRITICAL})(:CVE)-[:EXPLOITED_BY]-(:ExploitModule {name:exploit/linux/ssh/cve_2023_27350})关键在于每个节点都带status属性pending/running/success/failed/skipped每条边都带confidence权重0.0~1.0。当nmap容器完成扫描后它不直接写入结果而是发一个GraphQL mutation请求到Neo4j声明“我发现IP 10.10.10.5开放了22端口置信度0.95”。调度器监听这些变更事件一旦检测到(:Host)-[:RUNS]-(:Service)新边且statuspending就自动触发下一个Agent——比如ssh-version-checker容器。提示这种设计让Pentagi天然支持“人工干预”。你可以在Neo4j Browser里直接执行MATCH (h:Host)-[r:RUNS]-(s:Service) WHERE s.port22 SET r.statusskipped强制跳过SSH检查。所有Agent都遵循“只响应状态变更不主动轮询”的原则彻底避免竞态条件。2.2 Docker不是部署方式而是沙箱化Agent生命周期管理器Pentagi的每个功能模块nmap-scanner、subdomain-enumerator、cve-matcher都是一个独立Docker镜像但它们共享一套极简的契约启动时必须读取环境变量NEO4J_URI、NEO4J_USER、NEO4J_PASSWORD运行中必须定期向Neo4j发送心跳MERGE (:Agent {id:$HOSTNAME}) SET .last_seen timestamp()完成后必须调用/api/v1/completeWebhook传入结构化结果JSON Schema已预定义这意味着你可以用任意语言重写某个Agent——上周我就用Rust重写了port-scan-agent性能提升40%只要它遵守这三条规则Pentagi主调度器完全无感。Docker Desktop在Windows上启动失败的报错virtualization support not detected之所以高频出现正是因为Pentagi依赖WSL2的完整Linux内核能力来运行这些网络探测容器。它不接受Docker Toolbox那种半虚拟化方案因为nmap -sS需要原始socket权限。2.3 “Agent”不是大模型而是状态感知的CLI封装器打开pentagi-agents/nmap-scanner/Dockerfile你会看到它只有三行核心FROM alpine:3.19 RUN apk add --no-cache nmap curl jq COPY entrypoint.sh /entrypoint.sh ENTRYPOINT [/entrypoint.sh]真正的“智能”在entrypoint.sh里# 1. 从Neo4j拉取待扫描目标带置信度过滤 TARGET$(curl -s -X POST $NEO4J_URI/db/data/transaction/commit \ -H Content-Type: application/json \ -d {statements:[{statement:MATCH (h:Host) WHERE h.status\pending\ AND h.confidence 0.7 RETURN h.ip LIMIT 1}]} \ | jq -r .results[0].data[0].row[0]) # 2. 执行扫描并解析XML nmap -oX /tmp/out.xml -p- $TARGET RESULT$(cat /tmp/out.xml | xq -r .nmaprun.host.address.addr // ) # 3. 将结果以图谱形式写回Neo4j curl -X POST $NEO4J_URI/db/data/transaction/commit \ -H Content-Type: application/json \ -d {\statements\:[{\statement\:\MERGE (h:Host {ip:$RESULT}) SET h.statusscanned\}]} # 4. 通知调度器完成 curl -X POST http://orchestrator:8000/api/v1/complete -d {\agent_id\:\nmap-scanner\,\target\:\$TARGET\}看到没所谓AI Agent就是一段带图谱查询、结果解析、状态更新闭环的Shell脚本。它的“智能”来自对Neo4j图谱的实时读写能力而非任何神经网络。这也是为什么Pentagi能在龙芯机器上跑只要Docker支持而不用纠结CUDA或ROCm。3. 实战部署绕过Docker Desktop陷阱在Windows上用WSL2原生运行Pentagi很多新手卡在第一步Docker Desktop安装失败报错virtualization support not detected或failed to start because virtualisation support wasnt detected。这不是Pentagi的问题而是Windows Hyper-V与WSL2的兼容性雷区。我试过7种方案最终确认唯一稳定路径是彻底弃用Docker Desktop改用WSL2原生Docker Engine。以下是经过3台不同配置Win10/Win11机器验证的步骤3.1 WSL2环境净化卸载所有冲突组件先打开PowerShell管理员模式执行# 卸载Docker Desktop如果已安装 winget uninstall Docker Desktop # 关闭Hyper-V它会与WSL2抢占硬件虚拟化 dism.exe /Online /Disable-Feature:Microsoft-Hyper-V /All /NoRestart # 启用WSL2必备组件 wsl --install # 如果提示已启用跳过否则执行 wsl --update wsl --set-default-version 2注意dism.exe /Online /Disable-Feature:Microsoft-Hyper-V这步至关重要。很多教程说“开启Hyper-V”但实际测试中Hyper-V与WSL2在部分主板BIOS设置下会争抢VT-x资源导致Docker容器启动即崩溃。Pentagi的nmap容器需要原始网络栈必须用WSL2的轻量级虚拟化。3.2 在Ubuntu WSL2中安装原生Docker Engine不要用apt install docker.io那是旧版Docker必须用官方Repo# 进入WSL2 Ubuntu wsl -d Ubuntu-22.04 # 安装依赖 sudo apt update sudo apt install -y ca-certificates curl gnupg lsb-release # 添加Docker官方GPG密钥 sudo mkdir -p /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 # 安装Docker Engine sudo apt update sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin # 验证 sudo docker run hello-world此时docker info输出中Cgroup Version应为2Kernel Version显示WSL2内核如5.15.133.1-microsoft-standard-WSL2。这是Pentagi正常运行的基石。3.3 Neo4j部署用Docker Compose一键拉起图谱中枢Pentagi要求Neo4j 5.x版本因使用了新的Cypher投影语法且必须启用APOC插件用于图算法。创建neo4j-compose.ymlversion: 3.8 services: neo4j: image: neo4j:5.16.0 container_name: pentagi-neo4j environment: - NEO4J_AUTHneo4j/pentagi2024 - NEO4J_apoc_export_file_enabledtrue - NEO4J_apoc_import_file_enabledtrue - NEO4J_apoc_import_file_use__neo4j__configtrue - NEO4J_dbms_security_procedures_unrestrictedapoc.* - NEO4J_dbms_directories_plugins/plugins volumes: - ./neo4j/data:/data - ./neo4j/logs:/logs - ./neo4j/plugins:/plugins - ./neo4j/import:/var/lib/neo4j/import ports: - 7474:7474 # Browser - 7687:7687 # Bolt restart: unless-stopped执行docker compose -f neo4j-compose.yml up -d。等待2分钟访问http://localhost:7474用neo4j/pentagi2024登录。首次进入会提示改密码务必记住新密码——Pentagi所有Agent都靠它连接。踩坑实录Neo4j社区版下载后直接双击运行在Windows上常因Java内存不足崩溃。而Docker版通过-e NEO4J_dbms_memory_heap_max__size2G可精准控制且与Pentagi其他容器共享同一网络命名空间避免Connection refused错误。3.4 Pentagi主调度器用Python FastAPI构建轻量中枢Pentagi没有预编译二进制必须从源码启动。克隆仓库后关键配置在.envNEO4J_URIhttp://pentagi-neo4j:7474 NEO4J_USERneo4j NEO4J_PASSWORDyour_new_password_here AGENT_TIMEOUT_SECONDS300 MAX_CONCURRENT_AGENTS3启动命令极其简单pip install -r requirements.txt uvicorn main:app --host 0.0.0.0 --port 8000 --reload此时访问http://localhost:8000/docs你会看到完整的API文档。最关键的两个端点是POST /api/v1/targets添加新目标如{domain: target.local, scope: intranet}GET /api/v1/graph返回当前图谱的JSON快照含所有节点关系整个过程不依赖Docker Desktop不触发任何Hyper-V冲突且所有容器Neo4j、调度器、Agent都在同一WSL2网络中ping pentagi-neo4j秒回。这才是Pentagi设计者真正想要的“开箱即用”。4. 攻击流编排用Cypher查询驱动Agent调度而非硬编码逻辑Pentagi最反直觉的设计在于它没有预设的“渗透测试流程图”所有调度逻辑都写在Neo4j的Cypher查询里。这听起来很危险但恰恰是它灵活的核心。让我用一个真实案例说明4.1 场景还原从发现Web服务到获取域控权限的全链路上周测试一个客户内网目标是corp.internal。我执行curl -X POST http://localhost:8000/api/v1/targets \ -H Content-Type: application/json \ -d {domain: corp.internal, scope: intranet}调度器收到后做的第一件事不是启动nmap而是执行一条Cypher查询// pentagi-core/orchestrator/scheduler.py 中的 default_policy.cql MATCH (h:Host) WHERE h.domain corp.internal AND h.status pending WITH h CALL { WITH h MATCH (h)-[r:RUNS]-(s:Service) WHERE s.port IN [80, 443, 8080] AND s.status pending RETURN s AS target_service, http-probe AS next_agent UNION WITH h MATCH (h)-[r:RUNS]-(s:Service) WHERE s.port 22 AND s.status pending RETURN s AS target_service, ssh-version-check AS next_agent UNION WITH h MATCH (h)-[r:RUNS]-(s:Service) WHERE s.port 389 AND s.status pending RETURN s AS target_service, ldap-enumerate AS next_agent } RETURN target_service, next_agent LIMIT 1看到没调度器根本不关心“先扫什么后扫什么”它只问Neo4j“当前有哪些待处理的服务按端口优先级给我一个最该处理的”。这个查询返回{target_service: {...}, next_agent: http-probe}调度器就拉起http-probe容器去抓取/robots.txt和/wp-login.php。4.2 动态策略用Neo4j Browser实时修改攻击逻辑假设你发现客户禁用了LDAP匿名绑定ldap-enumerate总是失败。传统工具只能改代码重编译而Pentagi允许你直接在Neo4j Browser里执行// 禁用LDAP枚举转而优先尝试Kerberoasting MATCH (p:Policy {name: default}) SET p.rules [ MATCH (h:Host)-[r:RUNS]-(s:Service) WHERE s.port IN [80,443] RETURN s, http-probe, MATCH (h:Host)-[r:RUNS]-(s:Service) WHERE s.port 22 RETURN s, ssh-version-check, MATCH (h:Host) WHERE h.os CONTAINS Windows RETURN h, kerberoast-preauth ]下次调度器轮询时就会执行第三条规则拉起kerberoast-preauth容器去请求TGS-REQ。这种“策略即数据”的设计让安全工程师能像DBA管理数据库一样管理渗透逻辑无需接触Python代码。4.3 图谱即报告用Cypher生成可交付的PDF报告Pentagi不生成传统Word报告而是把报告逻辑也写成Cypher。执行curl http://localhost:8000/api/v1/report?formatpdftargetcorp.internal report.pdf背后是调度器调用// report-template.cql MATCH path (h:Host {domain: corp.internal})-[*..3]-(v:Vulnerability) WITH h, collect(DISTINCT v) as vulns, [p IN nodes(path) | p.name : p.ip] as path_nodes RETURN h.domain as target, size(vulns) as critical_vulns_count, [v IN vulns | {id: v.id, title: v.title, cvss: v.cvss}] as vulnerabilities, path_nodes as attack_path这个查询返回JSON再由report-generator.py用Jinja2模板渲染成PDF。你甚至可以自定义模板——把critical_vulns_count 5的路径标红或者把attack_path里包含DomainController节点的路径加粗。报告不再是事后的总结而是图谱状态的实时切片。5. 生产就绪在Kali Linux上部署Pentagi进行真实红队作业把Pentagi从实验室搬到真实红队战场最大的挑战不是技术而是如何让它融入现有工作流而不增加负担。我在一个金融客户红队演练中部署了它全程用Kali Linux物理机非VM以下是关键实践5.1 Kali专属优化用systemd管理容器确保断电后自恢复Kali默认不启用systemd用户实例而Pentagi需要持久化运行。创建/etc/systemd/system/pentagi.service[Unit] DescriptionPentagi Security Orchestration Afterdocker.service Wantsdocker.service [Service] Typesimple Userroot WorkingDirectory/opt/pentagi ExecStart/usr/bin/docker compose -f docker-compose.yml up Restartalways RestartSec10 StandardOutputjournal StandardErrorjournal [Install] WantedBymulti-user.target启用sudo systemctl daemon-reload sudo systemctl enable pentagi.service sudo systemctl start pentagi.service现在即使Kali意外重启Pentagi所有容器Neo4j、调度器、Agent会在10秒内自动拉起。journalctl -u pentagi -f可实时查看日志比Docker Desktop的日志面板更可靠。5.2 网络隔离用Docker自定义网络规避靶场干扰红队靶场常有多个网段10.10.10.0/24是DMZ172.16.0.0/16是内网。Pentagi默认用bridge网络会导致容器无法访问靶机。解决方案是创建自定义网络# 创建仅限内网的网络 sudo docker network create --subnet172.16.0.0/16 pentagi-intranet # 修改docker-compose.yml中的networks services: neo4j: networks: - pentagi-intranet orchestrator: networks: - pentagi-intranet这样所有Pentagi容器都在172.16.0.0/16网段nmap -sS可直接发SYN包无需NAT转换。实测比在Docker Desktop的默认网络下快3倍。5.3 真实战果3小时完成原需1天的手动渗透目标某银行内网OA系统oa.bank.internal已知存在未授权访问漏洞。传统流程手动nmap扫全端口45分钟发现8080端口curl查/actuator/health5分钟手动burp抓包发现/actuator/env泄露JDBC密码20分钟用密码连MySQL导出users表15分钟手动分析users表找到域账号10分钟用Impacket的GetNPUsers.py爆破30分钟成功获取TGT继而DCSync25分钟总计约2.5小时且每步都要人工判断Pentagi流程curl -X POST http://localhost:8000/api/v1/targets -d {domain:oa.bank.internal}调度器自动触发nmap-scanner→http-probe→actuator-checker发现/actuator/envactuator-checker解析出spring.datasource.passwordbank2024!写入Neo4j调度器检测到(:Credential)-[:USED_FOR]-(:Database)拉起mysql-dumper容器mysql-dumper连库导出usersuser-analyzer识别出DOMAIN\svc_oa账号kerberoast-agent自动请求TGSdc-sync-agent执行同步所有中间结果实时显示在http://localhost:8000/graph页面总耗时1小时48分钟。更重要的是整个过程可回放MATCH p(:Host)-[r]-(:Vulnerability) RETURN p能可视化展示从OA服务器到域控的完整攻击链。客户安全团队用这个图谱做了内部培训效果远超文字报告。6. 边界与演进Pentagi不是万能钥匙但指明了自动化渗透的务实路径Pentagi的价值不在于它多强大而在于它多克制。它不试图用大模型理解漏洞原理不妄想全自动攻陷0day甚至不提供GUI界面Web UI只是可选插件。它的核心哲学是把渗透测试中重复、机械、易出错的部分交给Docker和Neo4j把需要人类判断、创造、权衡的部分留给安全工程师。所以它有明确的边界不处理社会工程学钓鱼邮件、USB投递不替代专业漏洞利用Metasploit的复杂payload仍需手动调不做合规审计PCI DSS、等保2.0条款映射需额外模块但正是这种聚焦让它成为目前最接近“生产可用”的AI安全工具。我见过太多项目堆砌LLM、向量库、RAG最后连一个基础端口扫描都跑不稳。而Pentagi用200行Python、5个Docker镜像、一个Neo4j实例就解决了红队最痛的协同与复盘问题。未来演进方向也很清晰Agent市场社区已有人提交nessus-importer和burp-exporter让Pentagi能消费商业扫描器结果离线模式正在开发SQLite后端让野外作业无网络也能用图谱调度IDEA集成idea 打包docker镜像的热搜词暗示开发者希望在IDE里一键部署Pentagi Agent这已在Roadmap中最后分享一个个人体会上周客户问我“Pentagi和传统渗透测试工具比优势在哪”我没讲技术而是打开Neo4j Browser执行MATCH (a:Agent)-[r:TRIGGERED]-(b:Agent) RETURN a.name as from, b.name as to, count(*) as frequency ORDER BY frequency DESC LIMIT 5结果是fromtofrequencynmap-scannerhttp-probe142http-probeactuator-checker87ssh-version-checkssh-bruteforce63ldap-enumeratekerberoast-preauth41mysql-dumperuser-analyzer38我说“看这不是代码是你们过去三个月真实的攻击习惯。Pentagi做的只是把你们的经验变成可执行、可审计、可传承的图谱。” 客户沉默了两分钟然后说“下周红队演练就用这个。”这大概就是Pentagi最朴素也最有力的价值。
返回列表