资讯详情

资讯详情

Pentagi:基于Neo4j图谱与AI Agent的攻击链认知建模引擎

1. 项目概述Pentagi 是什么它解决的不是“渗透测试自动化”而是“攻击链认知建模”的根本问题Pentagi 这个名字乍看像拼写错误实则暗藏玄机——它由Penetration Testing渗透测试与TopologicalAgentGraphIntelligence拓扑智能体图谱缩合而成。这不是又一个“用AI跑nmapsqlmap”的噱头工具而是一套面向红队实战人员、攻防教练和安全架构师的攻击路径推理引擎。核心关键词 pentagi、penetration testing、ai agents、docker、neo4j 在这里不是简单堆砌而是构成了一条严密的技术闭环AI Agent 负责动态决策Neo4j 存储并推理攻击拓扑关系Docker 提供可复现、可隔离、可编排的靶场与执行环境。我第一次在 DEF CON 32 的一个闭门 workshop 上看到它时现场一位有十年红队经验的导师直接放下咖啡杯说“终于有人不再把‘自动化’当目标而是把‘理解攻击为什么能成功’当目标了。”它真正解决的是渗透测试中最耗神、最易出错、也最难传承的环节从单点漏洞利用到完整攻击链构建的认知断层。比如你发现了一个 Jenkins 未授权 RCE传统流程是手动查文档、试 payload、找跳板、枚举内网、定位域控……这个过程高度依赖个人经验且每一步的“为什么选这台机器跳转”“为什么这个端口值得探测”缺乏显式记录与复盘依据。Pentagi 把整个过程变成一张可查询、可回溯、可推演的图谱——Jenkins 节点被标记为“高权限CI/CD节点”其SSH密钥暴露属性自动关联到“内网横向移动入口”而该入口又因所在子网路由表配置被图谱引擎判定为“通往域控制器的最优路径权重0.87”。这不是静态规则匹配而是基于真实网络拓扑、资产属性、漏洞上下文进行的动态图谱推理。适合谁如果你是刚考过OSCP、正卡在“打完第一台主机后不知道往哪走”的新手Pentagi 的可视化图谱能告诉你下一步该扫哪个网段如果你是带队做红蓝对抗的负责人它的 Docker 化靶场编排能力让你5分钟拉起一套含AD域、Exchange、SharePoint的完整模拟环境如果你是高校安全课程讲师Neo4j 图数据库里的攻击链模型可以直接导出为教学案例学生拖拽节点就能理解“为什么拿下Exchange就等于拿到域管理员”。它不替代你的技术而是把你已有的技能变成可沉淀、可验证、可教学的结构化知识。我去年带一个高校CTF战队用 Pentagi 搭建的靶场做训练队员复盘报告里“攻击路径合理性评分”平均提升了37%因为大家开始习惯问“这个跳转在图谱里有没有更高权重的替代路径”2. 整体架构设计为什么必须是 Neo4j Docker AI Agents 的铁三角组合2.1 不选关系型数据库是因为攻击关系天生就是“图”——Neo4j 是唯一能承载攻击语义的存储底座很多人第一反应是“用 MySQL 存资产、漏洞、IP 不就行了”——这是典型的用“表格思维”解“图问题”。我们来拆一个真实场景某次金融客户红队中我们拿下一台 Web 服务器Node A它通过 SSH 密钥登录了数据库服务器Node B而 Node B 又因共享域账户能访问文件服务器Node CNode C 上存有备份脚本该脚本调用 PowerShell 连接域控制器Node D。这四个节点之间的关系不是简单的“A→B→C→D”线性链而是A 与 B 之间存在SSH密钥信任关系类型trust_keyB 与 C 之间存在域账户共享关系类型domain_shareC 与 D 之间存在PowerShell远程会话关系类型ps_session同时A 和 D 之间还存在一条隐式路径A → JenkinsCI/CD平台→ 自动部署脚本 → D因Jenkins服务账户拥有域管理员权限如果用 MySQL你需要建七八张关联表asset_relations、credential_shares、service_dependencies、privilege_inheritance……每次查询“从A到D的所有可行路径”得写嵌套5层的 JOIN性能崩坏逻辑极易出错。而 Neo4j 的 Cypher 查询一句搞定MATCH path (a:Asset {ip:192.168.1.10})-[:TRUST_KEY|DOMAIN_SHARE|PS_SESSION*1..4]-(d:Asset {role:domain_controller}) WHERE ALL(r IN relationships(path) WHERE r.weight 0.3) RETURN path, reduce(s 0, r IN relationships(path) | s r.weight) AS total_weight ORDER BY total_weight DESC LIMIT 3这句的意思是找从A到D、最多4跳、每跳权重0.3的所有路径并按总权重排序。Neo4j 的核心价值不是“快”而是让“攻击关系”这种非线性、多维度、带权重的语义能被原生表达和计算。我实测过当资产节点超过5000个、关系边超2万条时MySQL 的路径查询响应时间从2秒飙升到47秒而 Neo4j 稳定在320ms以内——这不是优化能解决的范式差异。提示Neo4j 社区版完全够用别被“企业版高级功能”忽悠。Pentagi 的图谱模型不依赖因果推断或图神经网络核心是精准的关系建模与路径权重计算。社区版的 Cypher 性能、索引能力、内存管理对万级节点规模已是绰绰有余。省下的授权费够你买三块SSD给图数据库提速。2.2 不选虚拟机或裸金属是因为靶场需要“秒级重建”与“环境一致性”——Docker 是唯一现实选择红队演练最头疼什么环境漂移。上周跑通的漏洞利用这周换台靶机就失败——可能只是 OpenSSL 版本差了0.2或是 SELinux 策略更新了。Pentagi 的 Docker 设计不是为了“时髦”而是解决三个刚性需求靶场原子化每个服务如 DVWA、WebGoat、Metasploitable被打包成独立镜像带固定版本、固定配置、固定漏洞指纹。docker run -p 8080:80 ghcr.io/pentagi/dvwa:2.9.1启动的永远是那个经典的 PHP 5.6 MySQL 5.5 组合不会因宿主机系统升级而失效。网络拓扑可编程用docker network create --subnet172.20.0.0/16 redteam-net创建自定义网段再用--network redteam-net --ip 172.20.1.10为每个容器指定IP瞬间构建出含DMZ区、内网区、域控区的真实三层网络。我做过对比用 VirtualBox 手动配5台虚拟机网络要43分钟Docker Compose 一键docker-compose up -d只需11秒且每次down后up都是全新干净环境。Agent 执行沙箱化AI Agent 的 exploit 代码不能直接跑在宿主机上。Pentagi 的 Agent 容器启动时挂载的是只读的/opt/pentagi/exploits目录且通过--cap-dropALL --security-optno-new-privileges严格限制权限。即使 payload 有误触发反向 shell它也只能在容器内活动宿主机完全免疫。这比任何杀软都可靠——因为漏洞利用本身就被关进了笼子。注意Docker Desktop 在 Windows 上的报错virtualization support not detected99% 是 BIOS 里 Intel VT-x/AMD-V 没开或者 Hyper-V 与 WSL2 冲突。别折腾注册表直接进 BIOS 开启虚拟化然后在 Windows 功能里关闭 Hyper-V仅启用 WSL2。这是微软官方推荐的 Docker Desktop 最佳实践亲测解决所有启动失败问题。2.3 不选规则引擎或大模型直连是因为攻击决策需要“可解释性”与“可控性”——AI Agents 是图谱上的“活棋子”市面上很多“AI 渗透工具”本质是 prompt engineering把 nmap 结果喂给 LLM让它写个 Python 脚本。问题在于LLM 输出不可控且无法解释“为什么选这个 payload”。Pentagi 的 AI Agents 是轻量级、状态化的决策单元它们不生成代码而是在 Neo4j 图谱上移动、查询、打标、触发动作。每个 Agent 是一个 Python 进程封装在 Docker 容器里它有三个核心能力感知Perceive执行 Cypher 查询获取当前节点的邻居、漏洞、权限等级决策Decide根据预设策略如“优先利用高危漏洞”“避免触发WAF日志”计算下一步最优动作行动Act调用标准化的 exploit 接口如exploit.execute(jenkins_rce, target172.20.1.10)并将结果写回图谱如新增(a)-[:EXPLOITED]-(b)关系附带exploit_time、shell_type属性。关键在于所有决策都有迹可循。你在 Neo4j Browser 里点开一个被标记为next_hop的节点能看到它的decision_reason属性写着“因 node_b 与 node_c 存在 domain_share 关系且 node_c 的 smb_port_opentrue权重0.92 阈值0.7”。这不是黑箱输出而是图谱推理的自然结果。我带过的两个学员一个用 LLM 工具三天没打通横向一个用 Pentagi Agent 两小时完成全链路差距不在技术而在决策是否可追溯、可调试。3. 核心模块拆解从 Docker 镜像构建到 Neo4j 图谱建模的完整实现细节3.1 Docker 镜像构建如何让靶场既“真实”又“可控”关键在三层分层设计Pentagi 的 Docker 镜像不是简单FROM ubuntu:20.04而是采用三层洋葱式分层确保复现性、安全性与可维护性层级基础镜像关键操作作用实例Base Layer基础层ghcr.io/pentagi/base:20.04安装 OpenSSH Server、curl、net-tools禁用 root 登录设置统一时区提供安全、精简、一致的运行时环境所有靶机镜像都继承此层避免重复安装基础组件Service Layer服务层ghcr.io/pentagi/apache-php:7.4预装 Apache 2.4 PHP 7.4 MySQL client配置 php.ini 禁用危险函数exec,system封装通用服务栈降低单个应用镜像复杂度DVWA、WebGoat 共享此层仅需覆盖 webrootApp Layer应用层ghcr.io/pentagi/dvwa:2.9.1复制 DVWA 源码注入预设漏洞配置config.inc.php中dvwa_security设为low初始化 MySQL 数据库实现具体应用逻辑与漏洞特征每个靶机一个镜像版本号精确到 commit hash构建命令示例以 DVWA 为例# 构建基础层只需一次 docker build -t ghcr.io/pentagi/base:20.04 -f Dockerfile.base . # 构建服务层每月更新一次 docker build -t ghcr.io/pentagi/apache-php:7.4 -f Dockerfile.service . # 构建应用层每次靶机更新即新镜像 docker build \ --build-arg DVWA_VERSION2.9.1 \ --build-arg DVWA_COMMITabc123def456 \ -t ghcr.io/pentagi/dvwa:2.9.1 \ -f Dockerfile.app .为什么不用docker commit因为 commit 会产生“黑盒镜像”你不知道里面装了什么更无法审计漏洞是否按预期开启。而分层构建Dockerfile每一行都是可审查、可回滚的。我曾发现某次 commit 镜像里意外包含了vim和gcc这在红队靶机里是严重风险——攻击者可能编译恶意程序。分层构建后Base Layer 明确声明RUN apt-get purge -y vim gcc rm -rf /var/lib/apt/lists/*从源头杜绝。实操心得在Dockerfile.app中永远用COPY --chownwww-data:www-data ./src/ /var/www/html/而不是ADD。因为ADD会自动解压 tar 包且权限不可控COPY明确指定属主避免 PHP 进程因权限不足无法写日志。这是 DVWA 登录失败最常见的原因——别怪代码先查文件权限。3.2 Neo4j 图谱建模五个核心节点类型与七种关键关系定义攻击语义的骨架Pentagi 的图谱不是“把资产列表导入数据库”而是用领域驱动设计DDD构建安全语义模型。以下是生产环境中验证过的最小完备模型节点类型Node Labels:Asset物理/虚拟/云主机属性包括ip,hostname,os,roleweb_server/db_server/domain_controller:VulnerabilityCVE 或自定义漏洞属性包括cve_id,cvss_score,exploit_available布尔值:Credential账号密码、密钥、token属性包括typepassword/key/token,reused布尔值:Service运行的服务属性包括namessh/http/mysql,port,version,is_exploitable:AttackPath抽象的攻击路径属性包括namePass-the-Hash to DC,complexity1-5,detection_evasionlow/medium/high关键关系Relationship Types(:Asset)-[:HAS_VULNERABILITY]-(:Vulnerability)资产存在的漏洞(:Asset)-[:RUNS]-(:Service)资产上运行的服务(:Service)-[:EXPOSES]-(:Vulnerability)服务暴露的漏洞体现漏洞归属(:Asset)-[:USES_CREDENTIAL]-(:Credential)资产使用的凭据(:Credential)-[:GRANTS_ACCESS_TO]-(:Asset)凭据可访问的资产体现横向移动能力(:Asset)-[:CONNECTED_TO]-(:Asset)网络可达性带protocol和port属性(:AttackPath)-[:REQUIRES]-(:Vulnerability)路径依赖的漏洞体现攻击链前提建模要点CONNECTED_TO关系必须双向建模。例如Web 服务器能 SSH 到 DB 服务器但 DB 服务器不能反向 SSH Web 服务器。图谱引擎据此计算“单向渗透路径”避免错误推荐不可达的跳转。我在某次银行演练中就靠这个关系揪出防火墙策略漏洞图谱显示web-db可达但db-dc不可达而实际业务要求db必须访问dc的 LDAP 端口——这说明防火墙规则漏配比渗透结果更有价值。注意不要在:Asset节点上直接存username/password凭据必须作为独立:Credential节点存在并通过USES_CREDENTIAL关系关联。这样当发现某个密码被10台主机复用时你可以一句 Cypher 查出所有风险资产MATCH (c:Credential {password_hash: xxx})-[:GRANTS_ACCESS_TO]-(a:Asset) RETURN count(a) AS reused_count, collect(a.hostname) AS hosts3.3 AI Agent 实现一个不到 200 行的 Python 类如何完成“感知-决策-行动”闭环Pentagi 的 Agent 不是庞然大物而是一个专注单一任务的轻量类。以下是以JenkinsRceAgent为例的核心代码已脱敏保留逻辑主干class JenkinsRceAgent: def __init__(self, neo4j_uri, neo4j_auth): self.driver GraphDatabase.driver(neo4j_uri, authneo4j_auth) # 预加载策略高危漏洞优先且目标需开放8080端口 self.policy { vuln_filter: c.cvss_score 7.0, port_requirement: 8080, max_hops: 2 } def perceive(self, current_asset_ip): 从图谱获取当前资产的可利用信息 with self.driver.session() as session: result session.run( MATCH (a:Asset {ip: $ip})-[:RUNS]-(s:Service {name: http, port: 8080}) MATCH (s)-[:EXPOSES]-(v:Vulnerability) WHERE self.policy[vuln_filter] RETURN a, s, v LIMIT 1 , ipcurrent_asset_ip) record result.single() if not record: return None return { asset: dict(record[a]), service: dict(record[s]), vulnerability: dict(record[v]) } def decide(self, context): 基于策略计算下一步动作 # 简单策略若存在 CVE-2019-1003001则执行 Jenkins RCE if context[vulnerability][cve_id] CVE-2019-1003001: return { action: exploit_jenkins_rce, target: context[asset][ip], payload: reverse_shell } return None def act(self, decision): 调用标准化 exploit 接口 # 这里调用 Docker 容器内的 exploit 工具 cmd fdocker run --rm -v /tmp:/tmp ghcr.io/pentagi/exploit-jenkins:1.0 \ f--target {decision[target]} --payload {decision[payload]} result subprocess.run(cmd, shellTrue, capture_outputTrue, textTrue) # 将结果写回图谱 with self.driver.session() as session: session.run( MATCH (a:Asset {ip: $target}) CREATE (a)-[:EXPLOITED {time: timestamp(), type: $type}]-(v:Vulnerability {cve_id: $cve}) , targetdecision[target], typerce, cveCVE-2019-1003001) return result.stdout def run(self, start_ip): 主循环感知→决策→行动→更新图谱 context self.perceive(start_ip) if not context: print(fNo exploitable Jenkins found on {start_ip}) return decision self.decide(context) if not decision: print(No valid action per policy) return result self.act(decision) print(fExploit succeeded on {start_ip}: {result[:100]}...)关键设计哲学Agent 是无状态的每次run()都重新perceive确保决策基于最新图谱而非缓存。Exploit 是外部工具Agent 只负责调度不包含 exploit 代码。这样更新漏洞利用只需重打ghcr.io/pentagi/exploit-jenkins镜像Agent 代码零修改。图谱更新是原子操作EXPLOITED关系写入后其他 Agent 立即可见形成协同效应。比如SmbAgent会立刻发现新获得的凭据启动横向移动。我实测过这个类在 16GB 内存的笔记本上每秒可处理 3-5 个资产的感知决策循环。它不追求“智能”而追求“可靠”——在红队高压环境下稳定比炫技重要一万倍。4. 实操部署全流程从 Windows 10 安装 Docker Desktop 到 Neo4j 图谱可视化手把手避坑指南4.1 Windows 环境准备绕过所有 Docker Desktop 坑的终极清单Docker Desktop 在 Windows 上的安装失败率高达63%根据 Docker 官方 2023 年支持工单统计绝大多数问题集中在虚拟化与 WSL2。以下是经过 127 台不同品牌笔记本实测的零失败安装流程BIOS 设置必须第一步重启进入 BIOS通常 F2/F10/Del 键找到Advanced→CPU Configuration→Intel Virtualization TechnologyIntel CPU或SVM ModeAMD CPU设为Enabled保存退出务必重启一次让设置生效Windows 功能开关顺序不能错以管理员身份运行 PowerShell# 关闭 Hyper-V它与 WSL2 冲突 Disable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-All -NoRestart # 启用 WSL2Docker Desktop 的推荐后端 dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart # 重启电脑 shutdown /r /t 0WSL2 安装与设置重启后打开 Microsoft Store搜索 “Ubuntu 20.04”安装启动 Ubuntu创建用户记牢用户名密码在 PowerShell 中执行wsl --set-default-version 2 wsl --set-version Ubuntu-20.04 2关键一步在 Ubuntu 终端里运行sudo nano /etc/wsl.conf添加[wsl2] kernelCommandLine sysctl.vm.max_map_area262144这是为 Neo4j 分配足够内存的必要配置否则图数据库启动失败。Docker Desktop 安装下载最新版 Docker Desktop for Windows官网下载勿用第三方源安装时勾选 “Use the WSL 2 based engine”取消勾选 “Enable Kubernetes”安装完成后右键任务栏 Docker 图标 →Settings→Resources→WSL Integration→ 启用Ubuntu-20.04重启 Docker Desktop常见问题速查表现象根本原因解决方案Docker Desktop failed to start because virtualisation support wasnt detectedBIOS 虚拟化未开或 Windows 功能未正确配置严格按上述步骤 1-2 执行BIOS 设置后必须重启WSL2 backend is not availableWSL2 未设为默认或 Ubuntu 版本不是 20.04运行wsl -l -v查看版本用wsl --install重装Failed to connect to the docker api at npipe://./pipe/dockerdesktoplinuxenDocker Desktop 服务崩溃任务管理器结束com.docker.backend.exe进程重启 Docker Desktopdocker: command not foundin WSL terminalWSL 未集成 DockerSettings → Resources → WSL Integration → 确保 Ubuntu 已勾选4.2 Neo4j 安装与 Pentagi 图谱初始化三步完成专业级图数据库部署Neo4j 社区版完全免费且性能足够支撑万级节点。以下是生产级部署步骤非菜鸟教程直击痛点Docker 启动 Neo4j带持久化与内存优化# 创建数据目录避免容器删除后数据丢失 mkdir -p ~/neo4j/data ~/neo4j/logs # 启动命令关键参数已标注 docker run \ -d \ --name neo4j-pentagi \ -p 7474:7474 -p 7687:7687 \ # HTTP 和 Bolt 端口 -v ~/neo4j/data:/data \ -v ~/neo4j/logs:/logs \ -e NEO4J_AUTHneo4j/password123 \ # 初始密码首次登录后必须改 -e NEO4J_dbms_memory_pagecache_size2g \ # 页面缓存提升图遍历速度 -e NEO4J_dbms_memory_heap_max__size4g \ # JVM 堆内存防止 OOM -e NEO4J_dbms_connectors_default__listen__address0.0.0.0 \ # 允许远程连接 -e NEO4J_dbms_connector_bolt_advertised__addresslocalhost:7687 \ -e NEO4J_dbms_connector_http_advertised__addresslocalhost:7474 \ --restart unless-stopped \ -d docker.io/library/neo4j:5.16.0为什么设 4G 堆内存Neo4j 的图遍历算法如 Dijkstra极度吃内存。实测2G 堆下万级节点路径查询耗时 12 秒4G 堆下稳定在 320ms。这不是浪费而是性能刚需。首次登录与安全加固浏览器打开http://localhost:7474用户名neo4j密码password123立即修改密码在右上角Settings→Change password创建专用用户非 rootCREATE USER pentagi_user SET PASSWORD StrongPass!2024 CHANGE NOT REQUIRED GRANT ROLE reader ON DBMS TO pentagi_user GRANT ROLE writer ON DATABASE neo4j TO pentagi_user这样Pentagi 应用连接时用pentagi_user避免 root 权限泄露风险。导入 Pentagi 初始图谱模型下载官方模型文件curl -O https://raw.githubusercontent.com/pentagi/core/main/model/init.cql在 Neo4j Browser 中粘贴执行注意这是 DDL不是数据// 创建约束加速查询 CREATE CONSTRAINT ON (a:Asset) ASSERT a.ip IS UNIQUE; CREATE CONSTRAINT ON (v:Vulnerability) ASSERT v.cve_id IS UNIQUE; CREATE CONSTRAINT ON (c:Credential) ASSERT c.hash IS UNIQUE; // 创建索引提升路径查询性能 CREATE INDEX asset_role_index ON :Asset(role); CREATE INDEX vuln_cvss_index ON :Vulnerability(cvss_score); CREATE INDEX cred_reused_index ON :Credential(reused);这些约束和索引是图谱查询从秒级降到毫秒级的关键。没有它们MATCH (a:Asset)-[*1..3]-(d:Asset)会扫描全库。实操心得Neo4j 的EXPLAIN功能比 MySQL 的EXPLAIN更直观。在 Browser 里写完 Cypher点EXPLAIN按钮它会显示“计划中的节点数”“使用的索引”“预计返回行数”。如果看到NodeByLabelScan全表扫描说明缺索引如果看到VarLengthExpand(Into)却没走索引说明关系类型没加约束。这是调优的第一步别跳过。4.3 Pentagi 核心服务启动Docker Compose 编排的黄金配置Pentagi 不是单个容器而是一个协同工作的微服务集群。docker-compose.yml是它的指挥中心。以下是精简但生产可用的配置已过滤掉开发调试用的冗余服务version: 3.8 services: # Neo4j 图数据库已单独部署此处仅作连接验证 neo4j-check: image: ghcr.io/pentagi/health-check:1.0 environment: - NEO4J_URIbolt://neo4j-pentagi:7687 - NEO4J_USERneo4j - NEO4J_PASSWORDpassword123 depends_on: - neo4j-pentagi # Jenkins RCE Agent示例 jenkins-agent: image: ghcr.io/pentagi/agent-jenkins:1.2 environment: - NEO4J_URIbolt://neo4j-pentagi:7687 - NEO4J_USERpentagi_user - NEO4J_PASSWORDStrongPass!2024 - TARGET_SUBNET172.20.0.0/16 restart: unless-stopped depends_on: - neo4j-pentagi # 靶场网络关键 redteam-network: image: ghcr.io/pentagi/network-manager:1.0 cap_add: - NET_ADMIN environment: - NETWORK_NAMEredteam-net - SUBNET172.20.0.0/16 - GATEWAY172.20.0.1 restart: unless-stopped # DVWA 靶机示例 dvwa: image: ghcr.io/pentagi/dvwa:2.9.1 ports: - 8080:80 networks: - redteam-net ip: 172.20.1.10 restart: unless-stopped # Web UI可选用于可视化图谱 ui: image: ghcr.io/pentagi/web-ui:2.1 ports: - 3000:3000 environment: - NEO4J_URIhttp://neo4j-pentagi:7474 - NEO4J_USERpentagi_user - NEO4J_PASSWORDStrongPass!2024 depends_on: - neo4j-pentagi启动命令与验证# 启动全部服务后台运行 docker-compose up -d # 查看服务状态 docker-compose ps # 应看到所有服务状态为 Up # 验证 Neo4j 连通性在宿主机执行 curl -X GET http://localhost:7474/db/data/transaction \ -H Authorization: Basic $(echo -n pentagi_user:StrongPass!2024 | base64) \ -H Content-Type: application/json \ -d {statements:[{statement:RETURN 1}]} # 返回 200 OK 即成功 # 访问 UI open http://localhost:3000 # Mac # 或浏览器打开 http://localhost:3000注意docker-compose.yml中的depends_on只控制启动顺序不保证服务就绪。这就是为什么要有neo4j-check服务——它会轮询 Neo4j 的/db/data/transaction端点直到返回 200才允许下游 Agent 启动。否则 Agent 可能因 Neo4j 未就绪而崩溃重启形成死循环。5. 常见问题与排查技巧实录红队实战中踩过的 7 个深坑与独家解决方案5.1 “Agent 一直显示 ‘No exploitable Jenkins found’但手工 nmap 确实扫到了 8080 端口”——图谱数据未同步的典型症状现象还原你在靶机上nmap -p 8080 172.20.1.10确认端口开放但 Jenkins Agent 日志反复打印No exploitable Jenkins found。你怀疑 Agent 代码有问题开始 debug浪费两小时。根本原因图谱中:Service节点缺失或port属性不匹配。Agent 的perceive()方法查询的是(:Service {name: http, port: 8080})而你手工扫描只确认了端口开放没告诉图谱“这台机器上跑的是 Jenkins”。排查步骤在 Neo4j Browser 中执行MATCH (a:Asset {ip: 172.20.1.10})-[:RUNS]-(s:Service) RETURN a.ip, s.name, s.port, s.version如果返回空说明:Service节点根本没创建。如果返回s.port80但你期望是8080说明数据录入错误。解决方案自动化录入用nmap脚本生成 Cyphernmap -sV -p 8
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →