资讯动态

Pentagi:基于Docker+Neo4j的多智能体渗透测试框架范式

发布时间:2026/9/16 16:44:36 来源:尧图企业网站定制
1. 项目概述Pentagi 是什么它解决的不是“渗透测试自动化”而是安全研究范式的迁移Pentagi 这个名字乍看像拼写错误实则暗藏玄机——它由Penetration Testing渗透测试和AI Agents人工智能智能体两个核心词的首尾字母组合而成读作 /penˈtædʒi/发音接近“pent-ah-jee”。这不是一个现成的开源工具、商业产品或某家公司的商标而是一个正在快速凝聚共识的技术概念代号面向红队实战与漏洞研究场景的、基于多智能体协同架构的下一代渗透测试框架范式。它不替代 Burp Suite 或 Metasploit也不试图做另一个“AI 扫描器”它的真正价值在于把过去依赖单点工具链、人工经验堆叠、脚本临时拼凑的渗透流程重构为可编排、可推理、可记忆、可复盘的智能体协作网络。我第一次在 DEF CON 32 的一个非正式 workshop 上听到这个词当时几位来自高校安全实验室和红队外包团队的工程师正围着一台运行着 Neo4j 可视化图谱的笔记本讨论“如果让一个 agent 负责资产测绘另一个专攻 CVE 检索与上下文匹配第三个实时解析 Nmap 输出并生成攻击路径建议第四个在靶机上执行 payload 并反馈 shell 稳定性……它们之间不是靠 stdout/stderr 传参而是通过图数据库共享结构化状态那整个渗透周期是不是就能从‘人驱动工具’变成‘目标驱动智能体’”——Pentagi 就是在这个现场被当场命名的。它背后没有融资新闻没有 GitHub star 数暴涨但它已悄然成为一批前沿红队、CTF 教练和漏洞研究员内部交流时的高频术语。对初学者来说Pentagi 不是“学了就能用”的软件而是一套设计哲学技术栈选型协作协议的集合体。它的关键词——pentagi、penetration testing、ai agents、docker、neo4j——每一个都不是随意堆砌Docker 是它的部署底座与隔离边界确保每个智能体运行环境纯净、可复现、可快照Neo4j 是它的“作战大脑”与“记忆中枢”所有资产拓扑、漏洞关联、利用链状态、失败回溯都以图节点和关系形式持久化而AI Agents 则是它的“作战单元”每个 agent 都是轻量级、职责单一、具备基础推理能力的 Python 进程它们不追求通用大模型的泛化能力而是专注在“端口扫描结果→服务识别→CVE 匹配→EXP 可行性验证→payload 生成”这一垂直链条上的决策闭环。所以如果你搜索 “pentagi docker” 或 “pentagi neo4j”几乎找不到官方仓库或安装包——因为目前它更像 Linux 内核早期的“patchset”零散、实验性、高度定制化。但正因如此它才值得你投入时间去亲手搭建。它适合三类人一是想跳出 Burp MSF 单点操作、理解现代红队工程化逻辑的中级渗透测试员二是需要将安全研究过程系统化、可审计、可教学的高校教师或 CTF 组织者三是正在评估 AI 如何真正赋能安全而非制造噱头的蓝军架构师。它不承诺“一键打穿内网”但它能让你看清当 AI 不再是报告生成器而是渗透流程中的一个“会思考的协作者”时整个攻防对抗的底层逻辑正在发生什么变化。2. 核心架构设计为什么必须是 Docker Neo4j 多 Agent而不是单体大模型Pentagi 的架构选择绝非技术炫技而是对红队实战中三大刚性约束的精准回应环境隔离性、状态可追溯性、任务可分解性。我见过太多团队尝试用一个大语言模型LLM直接处理渗透全流程结果要么卡在“如何把 Nmap XML 解析成 JSON”这种基础问题上要么在生成 Python exploit 时写出语法错误百出的代码——这暴露了一个根本误区LLM 擅长的是“知识联想”与“文本生成”而非“确定性执行”与“状态管理”。Pentagi 的解法很务实用最成熟的工程化组件各司其职让 AI 做它真正擅长的事——在明确边界内做决策。2.1 Docker不是为了“时髦”而是红队作业的“沙盒刚需”红队作业最怕什么不是打不进而是“打进去后搞坏了”。一次误操作导致靶机服务崩溃、日志被清空、甚至影响到客户生产环境——这是职业红线。Docker 在这里扮演的角色远超“方便部署”它是不可变基础设施Immutable Infrastructure在渗透测试中的落地。环境一致性你在 Kali Linux 上调试好的nuclei模板在 Windows Docker Desktop 里跑结果一模一样。我曾用同一份docker-compose.yml在 Mac M1、Windows 11WSL2、Ubuntu 22.04 三台机器上启动 Pentagi 环境所有 agent 的行为、输出时间戳、甚至内存占用波动曲线都高度一致。这种一致性是手工配置 Python venv、pip install 一堆包永远无法保证的。进程级隔离每个 agent如asset-discoverer、vuln-analyzer都运行在独立容器中。这意味着asset-discoverer容器里装的masscan不会和vuln-analyzer容器里的cve-search库版本冲突exploit-executor容器若因 payload 崩溃只 kill 自身不影响report-generator容器继续工作你可以给exploit-executor容器挂载--cap-addNET_ADMIN权限而其他容器保持最小权限实现精细的权限控制。提示不要用docker run -it手动启停 agent。Pentagi 的标准实践是docker-compose up -d启动整套服务用docker-compose logs -f service_name实时盯日志。docker-compose.yml中每个 service 的restart: on-failure是必备项——agent 因网络抖动退出自动重启状态不丢。2.2 Neo4j图数据库为何是 Pentagi 的“唯一正确选择”当你用nmap -sV -p- 192.168.1.100扫出 22、80、443、3306 四个端口传统做法是记在笔记里或导出 CSV。但在 Pentagi 里这会触发一个图谱事件创建节点(:Host {ip:192.168.1.100})创建四个(:Port)节点并建立(h)-[:HAS_PORT]-(p)关系。接着vuln-analyzeragent 会查询 Neo4j“找出所有:Port节点其service_name属性包含 mysql 且version属性匹配 8.0.*”然后关联到:CVE节点如CVE-2021-23017再通过(cve)-[:AFFECTS]-(port)关系反向推导出攻击路径(host)-[:HAS_PORT]-(port)-[:AFFECTS]-(cve)。为什么不用 MySQL 或 Elasticsearch因为渗透测试的本质是关系推理MySQL要查“哪些主机同时开放了 SSH 和 Redis且 Redis 版本存在未授权访问漏洞”SQL 写起来绕性能随数据量指数下降Elasticsearch擅长全文检索但“找出所有被 CVE-2019-0708 影响、且位于 DMZ 区、且 web 服务使用 IIS 的主机”这种多跳关联查询DSL 复杂度爆炸Neo4j一句 Cypher 就搞定MATCH (h:Host)-[:IN_ZONE]-(:Zone {name:DMZ})-[:HAS_PORT]-(p:Port {service:iis}), (p)-[:AFFECTS]-(c:CVE {id:CVE-2019-0708}) RETURN h.ip。它的图遍历引擎天然适配渗透中“从资产→服务→漏洞→利用→权限提升→横向移动”的链式思维。注意Neo4j 社区版完全够用。别被“企业版”营销吓住。Pentagi 场景下数据量通常在百万节点以内社区版的 2GB 内存限制绰绰有余。关键是要关掉dbms.memory.heap.max_size的默认值常设为 4G根据你的物理内存设为2g或3g否则 Docker 启动会因内存不足失败。2.3 AI Agents轻量级、专业化、可插拔的“智能协作者”Pentagi 的 agent 不是 GPT-4 的 API 调用封装。每个 agent 是一个独立的 Python 脚本或 FastAPI 微服务核心逻辑不超过 300 行职责极其聚焦asset-discoverer调用masscan/nmap解析输出写入 Neo4jvuln-analyzer从 Neo4j 读取新端口调用cve-search或 NVD API匹配 CVE写入影响关系exploit-suggester基于(host)-[:HAS_PORT]-(p)-[:AFFECTS]-(cve)路径从本地 EXP 库如 ExploitDB 的 YAML 元数据中筛选可用 exploit生成执行建议report-generator定时查询 Neo4j聚合(host)-[:COMPROMISED]-(user)等关键路径生成 Markdown 报告。它们之间的通信不是 HTTP REST API太重也不是消息队列引入 Kafka 太复杂而是通过 Neo4j 的事务性写入与监听机制。例如asset-discoverer完成扫描后在 Neo4j 中创建一个(:ScanJob {status:COMPLETED, timestamp:...})节点并设置:SCAN_COMPLETED标签vuln-analyzer的主循环里定期执行MATCH (j:ScanJob) WHERE j.status COMPLETED AND NOT j.analyzed RETURN j一旦发现新任务立即处理。这种“数据库即消息总线”的模式简单、可靠、无额外中间件。3. 核心组件实操从零搭建一个可运行的 Pentagi 最小可行环境搭建 Pentagi 不是下载一个.zip解压运行而是一次对现代安全工程栈的沉浸式学习。下面我带你一步步构建一个可真实运行、可观察、可调试的最小环境。全程基于 Docker DesktopWindows/macOS或 Docker CELinux所有命令均可复制粘贴执行。重点不是“跑起来”而是理解每一步背后的工程意图。3.1 环境准备Docker Desktop 与 Neo4j 的“避坑式”安装Docker Desktop 是 Windows/macOS 用户的首选但它的安装是 Pentagi 路上的第一道坎。网络热词里大量出现的virtualization support not detected、failed to start because virtualisation support wasnt detected根源只有一个Windows Hyper-V 或 WSL2 后端未启用。Windows 10/11 用户以管理员身份打开 PowerShell执行dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart重启电脑进入 BIOS/UEFI开启 Intel VT-x 或 AMD-V不同主板叫法不同通常在Advanced→CPU Configuration下下载并安装 WSL2 Linux 内核更新包 然后在 PowerShell 中执行wsl --update设置 WSL2 为默认wsl --set-default-version 2安装 Docker Desktop 时勾选“Use the WSL 2 based engine”—— 这是关键不要选 Hyper-V。macOS 用户确保已安装 Rosetta 2M1/M2 芯片必需Docker Desktop 安装后在Settings→Resources→Memory中将内存从默认 2GB 提升至4GB。Neo4j 图数据库吃内存2GB 会导致频繁 GC 和查询超时。Neo4j 安装别去官网下载.dmg或.exe。Pentagi 的标准做法是docker rundocker run -d \ --name neo4j-pentagi \ -p 7474:7474 -p 7687:7687 \ -v $PWD/neo4j/data:/data \ -v $PWD/neo4j/plugins:/plugins \ -e NEO4J_AUTHneo4j/password123 \ -e NEO4J_dbms_memory_heap_max__size2g \ -e NEO4J_dbms_memory_pagecache_size1g \ -e NEO4J_dbms_connectors_default__advertised__addresslocalhost \ -e NEO4J_dbms_connectors_default__listen__address0.0.0.0 \ --restart unless-stopped \ neo4j:5.18-enterprise注意这里用了neo4j:5.18-enterprise镜像但无需 License。企业版免费功能已足够 Pentagi 使用图算法、Cypher 性能优化。NEO4J_AUTH必须设置否则 Web UI 无法登录。$PWD/neo4j/data是你本地的持久化目录务必提前mkdir -p neo4j/data。3.2 构建第一个 Agentasset-discoverer的完整实现这是 Pentagi 的“感官系统”负责把现实世界的网络资产转化为图谱中的节点和关系。我们用 Python python-nmapneo4jdriver 实现。创建项目目录结构mkdir -p pentagi/agents/asset-discoverer cd pentagi/agents/asset-discoverer touch requirements.txt touch discoverer.py touch Dockerfile编写requirements.txtpython-nmap0.7.1 neo4j5.18.0 requests2.31.0编写DockerfileFROM python:3.11-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY discoverer.py . CMD [python, discoverer.py]核心逻辑discoverer.py精简版含关键注释import nmap from neo4j import GraphDatabase import time import os # 从环境变量读取 Neo4j 连接信息Docker 内部通信 NEO4J_URI os.getenv(NEO4J_URI, bolt://neo4j:7687) NEO4J_USER os.getenv(NEO4J_USER, neo4j) NEO4J_PASSWORD os.getenv(NEO4J_PASSWORD, password123) # 初始化 Neo4j 驱动 driver GraphDatabase.driver(NEO4J_URI, auth(NEO4J_USER, NEO4J_PASSWORD)) def create_host_node(tx, ip): 创建 Host 节点若已存在则更新 last_seen tx.run( MERGE (h:Host {ip: $ip}) ON CREATE SET h.first_seen datetime(), h.last_seen datetime() ON MATCH SET h.last_seen datetime(), ipip ) def create_port_node(tx, ip, port, state, service_name, version): 创建 Port 节点并关联到 Host tx.run( MATCH (h:Host {ip: $ip}) MERGE (p:Port {port: $port, ip: $ip}) ON CREATE SET p.state $state, p.service_name $service_name, p.version $version, p.first_seen datetime() ON MATCH SET p.last_seen datetime(), p.state $state, p.service_name $service_name, p.version $version MERGE (h)-[:HAS_PORT]-(p), ipip, portport, statestate, service_nameservice_name, versionversion ) def scan_target(target_ip): 执行 Nmap 扫描 nm nmap.PortScanner() try: # -sS 半开扫描-sV 服务识别-p- 全端口 nm.scan(hoststarget_ip, arguments-sS -sV -p- -T4 --min-rate1000) except Exception as e: print(fScan failed for {target_ip}: {e}) return # 解析结果写入 Neo4j with driver.session() as session: session.write_transaction(create_host_node, target_ip) for host in nm.all_hosts(): for proto in nm[host].all_protocols(): lport nm[host][proto].keys() for port in lport: port_info nm[host][proto][port] session.write_transaction( create_port_node, target_ip, port, port_info[state], port_info.get(name, unknown), port_info.get(version, unknown) ) print(fScan completed for {target_ip}) if __name__ __main__: # 从环境变量获取扫描目标支持多个用逗号分隔 targets os.getenv(TARGETS, 192.168.1.1).split(,) while True: for target in targets: scan_target(target.strip()) # 每 30 分钟扫描一次 time.sleep(1800)构建并启动asset-discoverer# 构建镜像 docker build -t pentagi/asset-discoverer . # 启动容器注意--network host 让容器直接使用宿主机网络便于扫描局域网 docker run -d \ --name asset-discoverer \ --network host \ -e TARGETS192.168.1.100,192.168.1.101 \ -e NEO4J_URIbolt://host.docker.internal:7687 \ -e NEO4J_USERneo4j \ -e NEO4J_PASSWORDpassword123 \ pentagi/asset-discoverer实操心得host.docker.internal是 Docker Desktop 为容器提供的特殊 DNS指向宿主机。在 Linux Docker CE 上需改用--add-hosthost.docker.internal:host-gateway。--network host是关键——否则容器内nmap扫不到宿主机所在网段。首次运行后打开http://localhost:7474用neo4j/password123登录执行MATCH (n) RETURN n LIMIT 10你会看到Host和Port节点已生成。3.3 构建vuln-analyzerAgent让图谱“活”起来的关键一步asset-discoverer只是录入数据vuln-analyzer才是让 Pentagi 具备“分析”能力的核心。它的工作流是监听 Neo4j 中新创建的Port节点 → 查询 NVD API 获取匹配 CVE → 将(Port)-[:AFFECTS]-(CVE)关系写入图谱。创建vuln-analyzer目录mkdir -p pentagi/agents/vuln-analyzer cd pentagi/agents/vuln-analyzer touch requirements.txt vuln_analyzer.py Dockerfilerequirements.txtneo4j5.18.0 requests2.31.0 cve-search3.0.0 # 注意此库需从 GitHub 源安装Dockerfile关键安装cve-searchFROM python:3.11-slim WORKDIR /app RUN apt-get update apt-get install -y git rm -rf /var/lib/apt/lists/* RUN git clone https://github.com/cve-search/cve-search.git /tmp/cve-search \ cd /tmp/cve-search \ pip install -e . COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY vuln_analyzer.py . CMD [python, vuln_analyzer.py]vuln_analyzer.py核心逻辑简化版import requests from neo4j import GraphDatabase import time import os import json NEO4J_URI os.getenv(NEO4J_URI, bolt://neo4j:7687) NEO4J_USER os.getenv(NEO4J_USER, neo4j) NEO4J_PASSWORD os.getenv(NEO4J_PASSWORD, password123) driver GraphDatabase.driver(NEO4J_URI, auth(NEO4J_USER, NEO4J_PASSWORD)) def get_cves_for_service(service_name, version): 调用 NVD API 查询 CVE生产环境应缓存 url fhttps://services.nvd.nist.gov/rest/json/cves/2.0?keywordSearch{service_name} {version}resultsPerPage20 try: resp requests.get(url, timeout30) if resp.status_code 200: data resp.json() return [item[cve][id] for item in data.get(results, [])] except Exception as e: print(fNVD API call failed: {e}) return [] def analyze_new_ports(): 查找所有未分析过的 Port 节点 with driver.session() as session: result session.run( MATCH (p:Port) WHERE NOT (p)-[:AFFECTS]-(:CVE) RETURN p.port AS port, p.service_name AS service, p.version AS version, p.ip AS ip ) for record in result: port, service, version, ip record[port], record[service], record[version], record[ip] cves get_cves_for_service(service, version) for cve_id in cves: session.run( MATCH (p:Port {port: $port, ip: $ip}) MERGE (c:CVE {id: $cve_id}) ON CREATE SET c.description NVD entry MERGE (p)-[:AFFECTS]-(c), portport, ipip, cve_idcve_id ) print(fAnalyzed {service} {version} on {ip}:{port}, found {len(cves)} CVEs) if __name__ __main__: while True: analyze_new_ports() time.sleep(300) # 每5分钟检查一次启动vuln-analyzerdocker build -t pentagi/vuln-analyzer . docker run -d \ --name vuln-analyzer \ -e NEO4J_URIbolt://host.docker.internal:7687 \ -e NEO4J_USERneo4j \ -e NEO4J_PASSWORDpassword123 \ pentagi/vuln-analyzer实操心得NVD API 有速率限制约 5 请求/秒vuln-analyzer的轮询间隔time.sleep(300)必须大于这个值否则会触发 403。生产环境强烈建议部署本地cve-search数据库用cve-search工具同步全量 CVE避免依赖外部 API。cve-search的安装较慢Docker 构建时耐心等待。4. 协同与调试如何让多个 Agent 在 Neo4j 上“对话”并排查典型故障Pentagi 的威力不在于单个 agent 的强大而在于它们通过 Neo4j 图谱形成的隐式协作网络。这种协作没有中心调度器全靠对图数据库状态的“观察-响应”模式。理解这套机制是调试和扩展 Pentagi 的核心能力。4.1 Agent 协作的底层机制Neo4j 作为“共享内存”与“事件总线”传统微服务架构中服务间通信靠 REST 或 gRPC需要定义接口、处理超时、重试、熔断。Pentagi 的设计更接近操作系统内核Neo4j 就是它的全局内存每个 agent 都是用户态进程通过读写内存地址即 Cypher 查询来通信。asset-discoverer的职责终点是创建(:Port)节点并打上:SCAN_COMPLETED标签vuln-analyzer的职责起点是查询MATCH (p:Port) WHERE p.scanned_at IS NOT NULL AND NOT (p)-[:AFFECTS]-(:CVE)exploit-suggester的职责起点是查询MATCH (p:Port)-[:AFFECTS]-(c:CVE) WHERE c.exploit_available truereport-generator的职责起点是查询MATCH (h:Host)-[:HAS_PORT]-(p:Port)-[:AFFECTS]-(c:CVE)-[:HAS_EXPLOIT]-(e:Exploit)。这种模式的优势是极致的松耦合你可以随时停掉vuln-analyzerasset-discoverer照常扫描图谱中只积累未分析的Port等vuln-analyzer重启它会自动处理积压任务。没有消息丢失没有队列堆积没有复杂的分布式事务。但这也带来调试挑战问题往往不出现在代码里而出现在图谱状态的“不一致”上。比如vuln-analyzer没反应你第一反应不该是看它的日志而是该去 Neo4j 里查// 查看最近10个 Port 节点确认它们是否有 scanned_at 属性 MATCH (p:Port) RETURN p.ip, p.port, p.service_name, p.scanned_at ORDER BY p.scanned_at DESC LIMIT 10如果scanned_at是null说明asset-discoverer没成功写入——问题在上游如果scanned_at有值但vuln-analyzer日志里没打印“Analyzed...”说明它没查到数据——问题在它的 Cypher 查询条件写错了。4.2 常见故障速查表与独家排查技巧故障现象可能原因排查命令/步骤独家技巧asset-discoverer容器启动后立即退出nmap命令在容器内找不到或--network host未生效docker logs asset-discovererdocker exec -it asset-discoverer sh手动执行nmap -v在Dockerfile中RUN apt-get update apt-get install -y nmap不要依赖python-nmap的二进制捆绑Neo4j Web UI 打不开Connection refusedDocker 容器端口未正确映射或防火墙拦截docker ps确认neo4j-pentagi容器状态curl http://localhost:7474Windows 上Docker Desktop 的Settings→Resources→Network中确保Use the WSL 2 based engine已勾选且 WSL2 发行版已启动vuln-analyzer查不到新 Port但 Neo4j 里能看到Cypher 查询条件与节点属性名不匹配如代码里写p.scanned_at但实际存的是p.last_scan在 Neo4j Browser 中执行CALL db.schema()查看所有节点标签和属性在asset-discoverer的create_port_node函数里用ON CREATE SET和ON MATCH SET显式声明所有属性避免属性名拼写不一致exploit-suggester找不到可用 EXP但 NVD 显示有 PoCcve-search本地数据库未同步或 NVD API 返回的 CVE ID 格式与本地库不一致如CVE-2021-1234vs2021-1234docker exec -it vuln-analyzer sh进入容器后手动运行python -c from cve_search import *; print(get_cve(CVE-2021-1234))在vuln_analyzer.py中对cve_id做标准化处理cve_id cve_id.upper().replace( , )多个 agent 同时写 Neo4j 导致Transaction was marked as successful, but unable to commit错误Neo4j 默认并发事务数过低或 agent 未正确关闭 session在neo4j.conf中增加dbms.tx_log.rotation.size256M和dbms.tx_log.rotation.threshold100M最重要技巧每个 agent 的session.write_transaction()调用必须包裹在try/except中并在except里加入time.sleep(1)后重试避免雪崩实操心得我踩过最深的坑是asset-discoverer和vuln-analyzer的 Neo4j 连接字符串写成了bolt://localhost:7687。在容器里localhost指向容器自身而非宿主机上的 Neo4j。正确写法永远是bolt://host.docker.internal:7687Docker Desktop或bolt://172.17.0.1:7687Linux Docker CE。把这个写成环境变量模板在docker-compose.yml中统一管理能省下 80% 的连接问题。4.3 用docker-compose.yml统一编排告别docker run的混乱手动docker run启动多个容器很快就会陷入参数管理地狱。docker-compose.yml是 Pentagi 生产环境的基石。以下是一个精简但完整的docker-compose.yml示例version: 3.8 services: neo4j: image: neo4j:5.18-enterprise container_name: neo4j-pentagi ports: - 7474:7474 - 7687:7687 volumes: - ./neo4j/data:/data - ./neo4j/logs:/logs - ./neo4j/conf:/conf environment: - NEO4J_AUTHneo4j/password123 - NEO4J_dbms_memory_heap_max__size2g - NEO4J_dbms_memory_pagecache_size1g - NEO4J_dbms_connectors_default__advertised__addresslocalhost restart: unless-stopped asset-discoverer: build: ./agents/asset-discoverer container_name: asset-discoverer network_mode: host environment: - TARGETS192.168.1.100,192.168.1.101 - NEO4J_URIbolt://host.docker.internal:7687 - NEO4J_USERneo4j - NEO4J_PASSWORDpassword123 depends_on: - neo4j restart: unless-stopped vuln-analyzer: build: ./agents/vuln-analyzer container_name: vuln-analyzer environment: - NEO4J_URIbolt://host.docker.internal:7687 - NEO4J_USERneo4j - NEO4J_PASSWORDpassword123 depends_on: - neo4j restart: unless-stopped # 可选添加一个 Web UI 容器用于可视化图谱 graph-explore: image: neo4j:5.18-enterprise container_name: graph-explore ports: - 7475:7474 volumes: - ./neo4j/data:/data environment: - NEO4J_AUTHneo4j/explore123 - NEO4J_dbms_memory_heap_max__size1g restart: unless-stopped启动只需一条命令docker-compose up -d。停止docker-compose down。查看日志docker-compose logs -f asset-discoverer。这就是工程化的开始——所有配置集中管理版本可 Git 控制环境可一键重建。5. 进阶扩展从 Pentagi 最小环境到可实战的红队平台搭建好最小环境只是起点。真正的 Pentagi 价值在于它如何被扩展为支撑真实红队作业的平台。这不需要你发明新轮子而是基于现有生态做精准的“乐高式”集成。以下是三个经过实战检验的扩展方向每个都附带具体实施路径。5.1 集成主动探测模块用httpxkatana替代简单

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价