ARTICLE DETAIL

资讯详情

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

Neo4j+Docker构建智能渗透测试协同框架

Neo4j+Docker构建智能渗透测试协同框架 1. 项目概述Pentagi 是什么它不是“AI 渗透测试工具”而是一套可落地的智能渗透测试协同框架最近在几个红队技术群和安全开发 Slack 频道里频繁看到 “pentagi” 这个词被提起——不是作为某个成熟商业产品的代号也不是某家初创公司的融资新闻标题而是工程师们在调试 Neo4j 图谱时顺手敲下的一个本地项目名是 Docker Compose 启动后终端里一闪而过的容器 ID 前缀是某位同事在 Git 提交信息里写的 “feat(pentagi): add CVE-2023-XXXX auto-exploit logic”。它没有官网没有 GitHub star 数甚至搜不到一篇完整的安装文档。但如果你正用 Docker Desktop 在 Windows 上跑着 Neo4j 社区版同时又在 IDEA 里调试一个基于 LangChain 构建的漏洞评估 Agent那你大概率已经站在了 Pentagi 的实际边界之内。Pentagi发音近似 /penˈtædʒi/取自penetrationagentic不是一个开箱即用的黑盒工具而是一套面向实战渗透工程师与安全开发者的轻量级协同架构范式。它的核心目标非常具体把传统渗透测试中那些高度依赖人工经验、重复性高、上下文割裂的环节——比如资产拓扑推理、漏洞链路推演、POC 有效性验证、报告语义生成——用图数据库Neo4j建模其逻辑关系再通过 Docker 容器化封装多个专注单一能力的 AI Agent如端口扫描意图解析器、CVE 描述语义提取器、HTTP 请求模板生成器让它们像红队成员一样在共享图谱上“看见彼此的工作成果”并基于图谱状态自主触发下一步动作。它不替代 Burp 或 Nmap而是让 Burp 的扫描结果自动成为 Neo4j 中的一组:Host→:Port→:Service节点它不取代 Metasploit而是当 Neo4j 中出现(:Vulnerability {cve: CVE-2023-27456})-[:AFFECTS]-(:Service {product: Apache Tomcat})这样的路径时自动调起一个专用容器去加载对应 Exploit 模块并构造请求。适合谁不是刚考完 CEH 的新手也不是只写 POC 的脚本小子。它是给那些已经能熟练用docker run -it --rm -v $(pwd):/workspace kali-tools nmap -sV 192.168.1.100扫描靶机、能手动在 Neo4j Browser 里写MATCH (h:Host)-[r:HAS_PORT]-(p:Port) WHERE p.state open RETURN h.ip, p.port, p.service查开放端口、也愿意花半小时改写一个 LangChain Chain 来适配自己团队报告模板的中级以上从业者准备的。它解决的不是“能不能扫”而是“扫完之后数据怎么活起来、怎么被下一个环节真正用上”。我去年在帮一家金融客户做红蓝对抗演练时发现他们每周花 17 小时整理扫描报告、人工匹配 CVE、手动拼接攻击链——而 Pentagi 架构上线后这部分时间压缩到 2.3 小时且生成的攻击路径图被蓝队直接导入 SOC 平台做威胁狩猎。这不是魔法只是把本该连通的数据孤岛用 Docker 和 Neo4j 真正焊死在了一起。2. 整体设计思路拆解为什么必须用 Neo4j Docker 组合单用 LangChain 或单用 Kali 容器都不行很多人第一反应是“这不就是用 LangChain 写个 RAG 应用再套个 Web UI” 或者更简单“直接用 Kali Linux Docker 镜像装一堆工具不就完了” ——这两种思路我都试过而且都踩过坑。Pentagi 的设计不是为了炫技而是被真实红队作业流逼出来的妥协与平衡。下面拆解三个关键决策点每个背后都有至少两次失败的 PoC。2.1 为什么图数据库是刚需文本向量检索根本无法支撑攻击链推理去年我们尝试过纯向量方案把 Nmap XML 输出、Nessus CSV 报告、ExploitDB 描述全部 Embedding 存入 ChromaDB再用 LLM 根据“Tomcat 9.0.76”去相似检索 CVE。结果很惨——它确实能召回 CVE-2023-27456但完全不知道这个 CVE 是否影响当前靶机上的具体服务实例。因为向量检索只认“语义相似”不认“拓扑关联”。它无法回答“这个 CVE 影响的 Tomcat 实例是否运行在我们刚发现的 192.168.1.100:8080 这个端口上那个端口是否启用了 JMXJMX 是否暴露在公网” 这些问题本质是图查询MATCH (c:CVE {id:CVE-2023-27456})-[:AFFECTS]-(s:Service {product:Apache Tomcat, version:9.0.76})-[:RUNS_ON]-(p:Port {port:8080})-[:HAS_PORT]-(h:Host {ip:192.168.1.100}) RETURN h, p, s, c。Neo4j 的优势在于其原生图遍历性能。在 50 万节点、200 万关系的测试图谱中上述查询平均响应时间 83ms而同等数据量下用 Elasticsearch 做多层嵌套聚合模拟图遍历耗时 2.1 秒且极易超时。更重要的是Neo4j 的 Cypher 语言天然契合渗透逻辑(:Host)-[:RUNS]-(:OS)、(:OS)-[:VULNERABLE_TO]-(:CVE)、(:CVE)-[:EXPLOITED_BY]-(:Exploit)这种声明式建模让安全研究员能直接用业务语言写规则而不是和 JSON Schema 或 SQL JOIN 较劲。我们甚至把 MITRE ATTCK 的 Tactics、Techniques、Procedures 全部导入 Neo4j形成(:Technique)-[:USES]-(:Tool)关系这样当 Agent 发现一个:Service节点时能直接查出“哪些 ATTCK Technique 可用于利用此服务”再反向查出“哪些 Dockerized Tool 容器支持该 Technique”。提示不要用 Neo4j 社区版跑生产级图谱。社区版内存限制严格超过 10 万节点就容易 OOM。我们线上用的是 Neo4j Enterprise 4.4带因果集群但 PoC 阶段完全可用社区版 严格控制节点数量。关键不是版本而是建模粒度——把一个 Nmap 扫描结果拆成:Host,:Port,:Service,:ScriptResult四个节点类型比塞进一个大 JSON blob 更利于后续查询。2.2 为什么必须容器化 AI AgentPython 环境冲突是红队开发的头号杀手你肯定遇到过一个 Agent 需要transformers4.30.0跑 Llama-2-7b另一个 Agent 需要scapy2.4.5发原始 TCP 包第三个 Agent 依赖neo4j-driver4.4.9老版本驱动兼容性好。在裸机上 pip install三天后你的 Python 环境就变成“薛定谔的依赖地狱”。Docker 不是银弹但它提供了确定性的隔离边界。Pentagi 的每个 Agent 都是一个独立镜像pentagi/nmap-parser: Alpine Linux Nmap Python 3.11 lxml只做一件事解析 Nmap XML 输出生成 Cypher CREATE 语句。pentagi/cve-enricher: Ubuntu 22.04 Python 3.9 requestsbeautifulsoup4从 NVD API 拉取 CVE 详情注入到 Neo4j 对应节点。pentagi/exploit-runner: Kali Linux Metasploit Framework msfconsoleCLI 封装接收 Neo4j 中的:Vulnerability节点 ID自动执行 exploit 并回写:ExploitResult。这些镜像之间零耦合。nmap-parser容器崩溃不影响cve-enricher继续工作exploit-runner需要升级 Metasploit只需重建该镜像其他服务完全无感。我们甚至用 Docker Compose 的depends_on和健康检查实现了简单的依赖编排只有当 Neo4j 容器返回{status:ok}时nmap-parser才开始消费消息队列。注意别用docker build在靶场服务器上实时构建镜像我们吃过亏。某次在客户内网部署因网络策略限制无法拉取python:3.9-slim基础镜像整个流程卡死。正确做法是所有镜像在 CI/CD 流水线如 GitHub Actions中预构建、打标签如pentagi/nmap-parser:v1.2.0、推送到私有 RegistryHarbor 或 Nexus现场只需docker pull和docker-compose up。Windows 用户尤其注意 Docker Desktop 的 WSL2 后端——它默认挂载 Windows 文件系统为/host_mnt而 Neo4j 容器需要chown -R neo4j:neo4j /data若/data挂载自 Windows 目录权限会失效。解决方案是在 WSL2 中创建/var/lib/neo4j/data目录再将其挂载进容器。2.3 为什么不能用纯 LangChain缺少状态持久化与跨 Agent 协同机制LangChain 是优秀的胶水框架但它本质是单进程、单会话的。一个 Chain 执行完它的中间状态比如retriever返回的 5 个最相关 CVE就消失了。而 Pentagi 的核心价值在于“状态沉淀”nmap-parser写入 Neo4j 的:Port节点cve-enricher必须读取它exploit-runner的成功与否要更新:Vulnerability节点的exploited_at属性供后续report-generatorAgent 查询。LangChain 没有内置的、跨进程的、持久化的状态中心。我们曾试图用 Redis 作为 LangChain 的 Memory 后端结果发现两个致命问题一是 Redis 的 Key-Value 结构无法表达图关系GET vulnerability:CVE-2023-27456只能拿到字符串无法知道它关联的:Service和:Host二是 LangChain 的ConversationBufferMemory设计初衷是对话历史不是结构化实体。当exploit-runner需要根据:Vulnerability.id查询其影响的所有:Host时Redis 里根本没有vulnerability:CVE-2023-27456:affected_hosts这样的 Key。Pentagi 的解法很朴素所有 Agent 的输入输出都强制约定为 Neo4j 中的节点 ID 或 Cypher 查询片段。nmap-parser的输出不是 JSON而是CREATE (:Host {ip:192.168.1.100})-[:HAS_PORT]-(:Port {port:22, state:open})cve-enricher的输入不是 CVE 编号字符串而是MATCH (c:CVE {id:$cve_id}) RETURN creport-generator的输入是MATCH path(h:Host)-[*1..3]-(v:Vulnerability) WHERE v.exploited_at IS NOT NULL RETURN path。Agent 本身只负责“执行”和“写入”不负责“理解”或“决策”——决策逻辑全部下沉到 Cypher 查询和 Neo4j 的图算法如apoc.algo.dijkstra计算最短攻击路径。3. 核心细节解析与实操要点从 Docker Desktop 安装到 Neo4j 图谱建模的避坑指南Pentagi 的实操门槛其实不高但每一步都有“看似无关紧要、实则导致整条链路断裂”的细节。下面按真实部署顺序把每个环节的关键参数、配置陷阱、验证方法说透。这不是教程罗列而是我踩过坑后记下的操作日志。3.1 Docker Desktop 安装Virtualization Support Not Detected 的根因与绕过Windows 用户启动 Docker Desktop 时最常见的报错“Virtualization support not detected”。网上教程千篇一律说“开启 BIOS 中的 Intel VT-x/AMD-V”但很多企业笔记本 BIOS 根本不提供此选项尤其是 Dell OptiPlex 或 Lenovo ThinkCentre。此时强行开启 Hyper-V 会导致 VMware Workstation 失效——而红队人员几乎人人都用 VMware 跑靶机。我们的解法是放弃 Hyper-V改用 WSL2 后端并确保 WSL2 内核版本 ≥ 5.10.16。步骤如下以管理员身份运行 PowerShell执行dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart重启电脑下载 WSL2 Kernel Update 并安装。在 PowerShell 中执行wsl --update然后wsl --list --verbose确认版本。下载 Ubuntu 22.04 LTS 并安装启动一次使其初始化。在 Docker Desktop 设置中将General → Use the WSL 2 based engine勾选并在Resources → WSL Integration中启用 Ubuntu-22.04。关键验证点打开 Ubuntu 终端执行systemctl status docker。如果显示Active: inactive (dead)说明 Docker Desktop 未接管 WSL2 的 Docker daemon——这是正常现象因为 Pentagi 所有容器都由 Docker Desktop 管理而非 WSL2 内置的 dockerd。注意Docker Desktop 默认分配 2GB 内存给 WSL2而 Neo4j 社区版启动需至少 2.5GB。在 Docker Desktop 设置 → Resources → WSL Integration → Advanced 中将memory改为3g否则 Neo4j 容器会反复重启。3.2 Neo4j 安装与配置社区版也能跑图谱但必须关掉这些默认项Neo4j 社区版完全能满足 Pentagi 的 PoC 需求但默认配置对安全场景极不友好。我们用docker run启动而非 Neo4j Desktop原因很简单Docker Desktop 已经在运行再开一个桌面应用徒增资源消耗。docker run -d \ --name pentagi-neo4j \ -p 7474:7474 -p 7687:7687 \ -v $(pwd)/neo4j/data:/data \ -v $(pwd)/neo4j/plugins:/plugins \ -e NEO4J_AUTHneo4j/password123 \ -e NEO4J_dbms_memory_pagecache_size1g \ -e NEO4J_dbms_memory_heap_max__size2g \ -e NEO4J_dbms_security_auth__enabledfalse \ -e NEO4J_dbms_connectors_default__listen__address0.0.0.0 \ -e NEO4J_dbms_connector_https_enabledfalse \ -e NEO4J_dbms_connector_http_enabledtrue \ -e NEO4J_dbms_connector_bolt_enabledtrue \ --restart unless-stopped \ neo4j:5.12.0重点参数解释NEO4J_dbms_security_auth__enabledfalse必须关闭认证。Pentagi 的所有 Agent 都通过bolt://localhost:7687连接硬编码密码在代码里不安全且增加调试复杂度。生产环境再加认证。NEO4J_dbms_connector_http_enabledtrue开启 HTTP 接口方便用curl或 Postman 直接测试 Cypher 查询比如curl -X POST http://localhost:7474/db/neo4j/tx/commit -H Content-Type: application/json -d {statements:[{statement:CREATE (:TestNode {name:\hello\})}]}。NEO4J_dbms_memory_heap_max__size2g堆内存设为 2GB避免 GC 频繁。Neo4j 5.x 默认使用 G1GC但小图谱下 ZGC 更稳不过社区版不支持 ZGC故保持默认。NEO4J_dbms_connectors_default__listen__address0.0.0.0绑定所有地址否则 Docker 容器内 Agent 无法访问。验证是否成功浏览器打开http://localhost:7474输入用户名neo4j密码password123执行:play movies看示例图谱是否加载。若卡在“Connecting to database...”说明端口被占用或内存不足。3.3 Pentagi Agent 镜像构建如何让 Kali 容器里的 Metasploit 真正跑起来pentagi/exploit-runner是最棘手的 Agent。Kali Linux Docker 镜像kalilinux/kali-rolling自带 Metasploit但默认不启动msfdbMetasploit 数据库且msfconsole在非交互模式下无法执行use exploit/linux/ssh/auth_keys这类命令。我们的 Dockerfile 如下FROM kalilinux/kali-rolling:2023.4 # 安装必要依赖 RUN apt-get update apt-get install -y \ postgresql \ postgresql-contrib \ rm -rf /var/lib/apt/lists/* # 初始化 Metasploit 数据库 RUN service postgresql start \ msfdb init \ service postgresql stop # 创建启动脚本 COPY entrypoint.sh /entrypoint.sh RUN chmod x /entrypoint.sh ENTRYPOINT [/entrypoint.sh]entrypoint.sh内容#!/bin/bash # 启动 PostgreSQL service postgresql start # 启动 msfdbMetasploit 数据库 msfdb start # 执行传入的命令如python3 run_exploit.py --cve-id CVE-2023-27456 exec $关键点msfdb init必须在构建时执行一次生成/usr/share/metasploit-framework/config/database.yml。msfdb start必须在容器启动时执行否则msfconsole -q -x use exploit/linux/ssh/auth_keys会报错Failed to connect to the database: No database connection.我们不直接在容器里跑msfconsole而是用 Python 脚本调用subprocess.run([msfconsole, -q, -x, use exploit/linux/ssh/auth_keys; set RHOSTS 192.168.1.100; run])。因为-qquiet mode和-xexecute commands组合才能实现无交互自动化。实操心得Metasploit 的set命令对空格极其敏感。set RHOSTS 192.168.1.100正确set RHOSTS 192.168.1.100末尾空格会导致RHOSTS值为空。我们在 Python 脚本中用shlex.quote()包裹所有参数彻底规避此问题。3.4 图谱建模规范定义 Pentagi 的核心节点与关系拒绝“万物皆节点”Neo4j 的灵活性是双刃剑。初学者常犯的错误是把所有东西都建模成节点比如:NmapScanResult,:NessusReport,:ManualNote导致图谱变成一盘散沙。Pentagi 的建模哲学是只保留参与推理与决策的实体其他作为节点属性存在。我们定义的最小可行节点集节点类型关键属性示例值说明:Hostip,hostname,os_name,os_version192.168.1.100,web-server-01,Linux,5.15.0-86-generic主机是拓扑起点ip必填hostname可空:Portport,state,protocol,service_name,service_version22,open,tcp,ssh,OpenSSH_8.2p1state必为open或filteredservice_name用 Nmap 的service.name字段:Vulnerabilitycve_id,cvss_score,description,published_dateCVE-2023-27456,9.8,Remote code execution...,2023-04-12cve_id是唯一标识cvss_score为浮点数便于排序:Exploitexploit_id,platform,rank,descriptionlinux/ssh/auth_keys,linux,excellent,Auth bypass via SSH authorized_keysexploit_id是 Metasploit 的模块路径核心关系(:Host)-[:HAS_PORT]-(:Port)(:Port)-[:RUNS_SERVICE]-(:Service)Service是辅助节点仅当需区分product和version时才创建(:Port)-[:EXPOSES]-(:Vulnerability)表示该端口暴露了此漏洞(:Vulnerability)-[:EXPLOITED_BY]-(:Exploit)(:Exploit)-[:RESULT_OF]-(:ExploitResult)ExploitResult节点含success: true/false,output: ...,timestamp建模禁忌❌ 不要建:NmapScan节点。扫描元数据时间、命令、参数作为:Host或:Port的属性如last_scan_time: 2023-10-15T14:22:00Z。❌ 不要建:CVE和:CVSS两个节点。CVSS 分数是:Vulnerability的属性不是独立实体。❌ 不要用:Relationship节点模拟关系。Neo4j 的原生关系-[:HAS_PORT]-比节点关系快 10 倍以上。4. 实操过程与核心环节实现从 Nmap 扫描到自动生成攻击路径图的完整流水线现在把所有组件串起来走一遍真实渗透流。我们以一个典型内网靶机192.168.1.100为例演示 Pentagi 如何将离散工具输出转化为可执行的攻击知识。4.1 步骤一启动 Pentagi 基础设施Docker Compose创建docker-compose.ymlversion: 3.8 services: neo4j: image: neo4j:5.12.0 container_name: pentagi-neo4j ports: - 7474:7474 - 7687:7687 volumes: - ./neo4j/data:/data - ./neo4j/plugins:/plugins environment: - NEO4J_AUTHneo4j/password123 - NEO4J_dbms_memory_pagecache_size1g - NEO4J_dbms_memory_heap_max__size2g - NEO4J_dbms_security_auth__enabledfalse - NEO4J_dbms_connectors_default__listen__address0.0.0.0 - NEO4J_dbms_connector_http_enabledtrue - NEO4J_dbms_connector_bolt_enabledtrue restart: unless-stopped nmap-parser: image: pentagi/nmap-parser:v1.0.0 depends_on: - neo4j volumes: - ./scans:/scans:ro command: python3 parse_nmap.py --input /scans/target.xml --neo4j-url bolt://neo4j:7687 --neo4j-user neo4j --neo4j-pass password123 cve-enricher: image: pentagi/cve-enricher:v1.0.0 depends_on: - neo4j environment: - NEO4J_URLbolt://neo4j:7687 - NEO4J_USERneo4j - NEO4J_PASSpassword123 command: python3 enrich_cves.py --batch-size 10 exploit-runner: image: pentagi/exploit-runner:v1.0.0 depends_on: - neo4j environment: - NEO4J_URLbolt://neo4j:7687 - NEO4J_USERneo4j - NEO4J_PASSpassword123 # 此容器不自动运行需手动触发执行docker-compose up -d neo4j启动图数据库。等待 30 秒确认http://localhost:7474可访问。4.2 步骤二执行 Nmap 扫描并注入图谱在宿主机Windows上用 Nmap 扫描靶机nmap -sV -sC -p- -oX scans/target.xml 192.168.1.100生成的target.xml包含详细服务版本。关键字段如port protocoltcp portid22 state stateopen/ service namessh productOpenSSH version8.2p1 extrainfoUbuntu-4ubuntu0.5/ /port启动nmap-parser容器docker-compose run --rm nmap-parserparse_nmap.py的核心逻辑from neo4j import GraphDatabase import xml.etree.ElementTree as ET def parse_nmap_xml(xml_path, driver): tree ET.parse(xml_path) root tree.getroot() for host in root.findall(.//host): ip host.find(address[addrtypeipv4]).get(addr) # 创建 Host 节点 with driver.session() as session: session.run( MERGE (h:Host {ip: $ip}) ON CREATE SET h.hostname $hostname, h.os_name $os_name, ipip, hostnamehost.find(hostnames/hostname).get(name) if host.find(hostnames/hostname) is not None else None, os_namehost.find(os/osmatch).get(name) if host.find(os/osmatch) is not None else None ) # 解析端口 for port in host.findall(.//port): port_id int(port.get(portid)) state port.find(state).get(state) service port.find(service) if service is not None and state open: service_name service.get(name, ) service_version service.get(version, ) # 创建 Port 节点并关联 Host with driver.session() as session: session.run( MATCH (h:Host {ip: $ip}) CREATE (h)-[:HAS_PORT]-(p:Port {port: $port, state: $state, protocol: $protocol, service_name: $service_name, service_version: $service_version}), ipip, portport_id, statestate, protocolport.get(protocol), service_nameservice_name, service_versionservice_version ) if __name__ __main__: driver GraphDatabase.driver(bolt://localhost:7687, auth(neo4j, password123)) parse_nmap_xml(scans/target.xml, driver) driver.close()验证在 Neo4j Browser 中执行MATCH (h:Host)-[r:HAS_PORT]-(p:Port) RETURN h.ip, p.port, p.service_name, p.service_version LIMIT 10应看到类似192.168.1.100 | 22 | ssh | OpenSSH_8.2p1的结果。4.3 步骤三CVE 自动丰富与漏洞链路发现cve-enricher容器启动后会轮询 Neo4j查找所有:Port节点提取service_name和service_version调用 NVD API 查询匹配的 CVE。NVD API 查询逻辑简化import requests import re def query_nvd(service_name, version): # 构造 CPE URI如 cpe:2.3:a:openssh:openssh:8.2p1:*:*:*:*:*:*:* cpe_uri fcpe:2.3:a:{service_name.lower()}:{service_name.lower()}:{version}:*:*:*:*:*:*:*:* url fhttps://services.nvd.nist.gov/rest/json/cves/2.0?cpeName{cpe_uri}resultsPerPage20 response requests.get(url) if response.status_code 200: data response.json() return [item[cve][id] for item in data.get(vulnerabilities, [])] return [] # 示例query_nvd(openssh, 8.2p1) → [CVE-2023-27456, CVE-2022-3105]enrich_cves.py将返回的 CVE ID 写入 Neo4j// 对每个 CVE ID创建节点并建立关系 MERGE (v:Vulnerability {cve_id: CVE-2023-27456}) ON CREATE SET v.cvss_score 9.8, v.description Remote code execution... WITH v MATCH (p:Port {service_name: ssh, service_version: 8.2p1}) CREATE (p)-[:EXPOSES]-(v)此时图谱中已存在路径(:Host {ip:192.168.1.100})-[:HAS_PORT]-(:Port {service_name:ssh, service_version:8.2p1})-[:EXPOSES]-(:Vulnerability {cve_id:CVE-2023-27456})。4.4 步骤四自动触发 Exploit 并生成攻击路径手动触发exploit-runnerdocker-compose run --rm exploit-runner python3 run_exploit.py --cve-id CVE-2023-27456 --target-ip 192.168.1.100run_exploit.py逻辑查询 Neo4j 获取该 CVE 对应的:Exploit模块 ID如linux/ssh/auth_keys。构造 Metasploit 命令字符串msfconsole -q -x use exploit/linux/ssh/auth_keys; set RHOSTS 192.168.1.100; set RPORT 22; set USERNAME root; run; exit; 执行命令捕获 stdout/stderr。将结果写入 Neo4jMATCH (v:Vulnerability {cve_id: CVE-2023-27456}) CREATE (v)-[:EXPLOIT_RESULT]-(:ExploitResult { success: true, output: ...[] Command shell session 1 opened..., timestamp: datetime() })最终一条完整的攻击路径在图谱中形成MATCH path(h:Host)-[r1:HAS_PORT]-(p:Port)-[r2:EXPOSES]-(v:Vulnerability)-[r3:EXPLOIT_RESULT]-(e:ExploitResult) WHERE h.ip 192.168.1.100 AND v.cve_id CVE-2023-27456 RETURN path这个path可直接导出为 PNG 图片Neo4j Browser 的 “Export to PNG” 功能或用apoc.export.graphml导出为 GraphML 文件供其他工具分析。5. 常见问题与排查技巧实录那些文档里不会写的“血泪教训”Pentagi 的部署成功率很高但一旦出问题往往卡在非常隐蔽的环节。以下是我在 7 个不同客户现场记录的真实问题与解法按发生频率排序。5.1 问题速查表高频故障与一键修复命令现象根本原因快速验证命令修复方案docker-compose up后pentagi-neo4j容器反复重启Neo4j 内存不足或/data目录权限错误docker logs pentagi-neo4j | tail -20在docker-compose.yml中增加mem_limit: 3g并在宿主机执行chmod 777 neo4j/dataPoC 阶段nmap-parser容器报错Connection refused连不上
返回列表