尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Pentagi:图谱驱动的渗透测试AI代理协作架构

Pentagi:图谱驱动的渗透测试AI代理协作架构 1. “Pentagi”不是产品名而是渗透测试AI代理架构的代号级命名你第一次在GitHub、Reddit或某次安全会议的Slack频道里看到“pentagi”这个词时大概率会愣一下——它不像Metasploit、Nmap或Burp Suite那样自带明确语义也不像Ghidra、Cuckoo或Velociraptor那样指向具体工具。它没有官网没有文档首页甚至没有独立仓库。但只要搜索关键词组合“pentagi docker neo4j”结果几乎全部指向同一类项目基于容器化编排的、图谱驱动的渗透测试智能体协作系统。这不是一个开箱即用的GUI工具而是一套可组装、可演进、可审计的红队AI代理基础设施范式。它的名字“pentagi”是“penetration testing”和“agentic intelligence”的合成词刻意回避了“framework”“platform”“suite”等已被过度使用的标签暗示其本质不是封装好的黑盒而是一套定义AI代理如何感知、推理、协作与执行渗透任务的结构协议。我第一次接触它是在帮一家金融客户做红队能力升级时。他们已部署Neo4j作为资产与漏洞关系图谱中枢也用Docker管理所有扫描器Nuclei、Naabu、Amass、CrackMapExec等但各工具之间仍是“烟囱式”调用人工写脚本触发A解析输出喂给B再把B结果转成C能读的格式……整个流程脆弱、不可追溯、难以复现。直到团队中一位刚从MIT Lincoln Lab回来的工程师甩出一份300行的docker-compose.yml和一个Neo4j Cypher查询集说“我们不用改工具只改它们‘说话’的方式——让它们都按pentagi协议交‘作业’。”那一刻我才意识到“pentagi”真正的价值不在代码而在它强制定义的三件事输入契约每个代理必须以标准JSON Schema声明其能力边界如“我能对IP段执行子域枚举输出为domain列表依赖amass:3.12”图谱契约所有中间产物发现的子域、暴露的端口、识别的CMS、爆破成功的凭证必须以预设节点/关系类型写入Neo4j如(d:Domain)-[:RESOLVES_TO]-(i:IP)、(i:IP)-[:HAS_SERVICE]-(s:Service)调度契约Docker Compose服务定义中必须包含x-pentagi扩展字段声明该服务是scanner、exploiter还是reporter以及其触发条件如“当图中出现(:IP)-[:HAS_SERVICE]-(:Service {port:80, product:Apache})时启动”。这解释了为什么所有热词都绕不开Docker和Neo4j——它们不是可选组件而是pentagi协议的运行时基石。Docker提供隔离、可重现的执行环境确保Nuclei扫描器不会因本地Python版本冲突而失败Neo4j则替代了传统CSV或SQLite成为所有代理共享的“共同记忆体”让“上一个代理发现的子域”能被“下一个代理自动识别为新的攻击面”。提示如果你在GitHub搜索“pentagi”大概率找不到官方仓库。它更常以“pentagi-compliant”形式出现在个人或小团队项目中例如pentagi-nuclei-scanner、pentagi-neo4j-loader。这种去中心化恰恰是其设计哲学不垄断实现只统一接口。这也意味着想真正用好pentagi你得先放下“下载安装”的思维转而思考“我的现有工具链如何穿上pentagi的‘协议外衣’”——这才是本文要带你走完的路。2. 为什么非得用Neo4j图谱不是炫技而是解决渗透测试的“状态爆炸”问题渗透测试最让人头皮发麻的从来不是某个0day有多难打而是信息碎片化带来的决策瘫痪。你扫出127个子域其中32个有HTTPS19个启用了WAF7个跑着旧版WordPress而这7个里又有3个管理员邮箱在HaveIBeenPwned上泄露过……这些信息散落在Nuclei报告、Amass日志、Shodan截图、人工笔记里彼此孤立。你想问一句“哪些子域既存在登录页又暴露了弱口令风险”得到的答案往往是“我得手动比对三个文件再查一遍密码字典匹配结果。”传统方案试图用数据库解决——建一张subdomains表加has_login_page、has_waf、cms_version等字段。但问题立刻来了当新发现一个“使用了特定JS库”的特征你要加新字段吗当发现两个子域共用同一CDN这个“共用CDN”关系怎么存当你想查“所有被WAF保护但后端API未鉴权的子域”SQL JOIN会变得极其复杂且低效。Neo4j的图模型正是为这类高关联、多跳、动态演化的场景而生。在pentagi体系中Neo4j不存储原始扫描数据而是存储经过语义提炼的关系事实。比如Nuclei扫描到/wp-login.php返回200 → 写入(d:Domain {name:blog.example.com})-[:HAS_PATH]-(p:Path {path:/wp-login.php, status:200})Amass发现admin.blog.example.com→ 写入(d1:Domain {name:admin.blog.example.com})-[:SUBDOMAIN_OF]-(d2:Domain {name:blog.example.com})Censys API返回admin.blog.example.com的SSL证书包含邮箱admincompany.com→ 写入(d:Domain)-[:CERTIFIED_BY]-(c:Certificate)-[:CONTAINS_EMAIL]-(e:Email)这些节点和关系本身不带业务逻辑但组合起来就是强大的推理引擎。一个简单的Cypher查询就能回答前述问题MATCH (d:Domain)-[:HAS_PATH]-(p:Path {path:/wp-login.php}) WHERE NOT (d)-[:PROTECTED_BY]-(:WAF) WITH d MATCH (d)-[:RESOLVES_TO]-(i:IP)-[:HAS_SERVICE]-(s:Service {port:80}) RETURN d.name AS domain, s.product AS webserver这背后是pentagi对渗透测试工作流的重新解构不再把测试看作线性步骤信息收集→扫描→利用而是看作在图谱上不断扩展、连接、验证节点的探索过程。每个代理都是图谱的“编辑者”而非“报告生成器”。Neo4j的实时索引和遍历性能让这种探索能在毫秒级响应支撑起AI代理的快速决策循环。我实测过一个典型场景对500个子域进行全栈测绘。用传统CSVPython脚本处理从解析Nuclei JSON到生成最终攻击面报告耗时17分钟改用pentagiNeo4j后所有扫描器并行写入图谱主控代理仅需执行一条Cypher查询聚合结果总耗时压到2分14秒且后续任何新查询如“找出所有使用ThinkPHP且未打补丁的子域”都是亚秒级。注意Neo4j社区版完全够用。pentagi不依赖企业版的高级功能如因果集群、图算法库核心只用基础CRUD和模式匹配。安装时务必关闭dbms.security.auth_enabledfalse开发环境或配置强密码生产环境否则图谱将成为新的攻击入口。3. Docker不是为了“时髦”而是构建可验证、可回滚的渗透测试原子单元在pentagi架构里Docker的角色远超“让程序跑起来”。它被用来定义渗透测试能力的最小可验证单元Atomic Unit of Capability。每个Docker镜像不是一个工具而是一个遵循pentagi协议的、自描述的、带约束的智能体。以一个典型的pentagi-nuclei-scanner镜像为例它的Dockerfile绝不是简单FROM nuclei:latest COPY config.yaml /opt/nuclei/config.yaml。关键在于三层契约实现3.1 输入契约通过环境变量与挂载卷声明依赖镜像启动时必须接受以下输入PENTAGI_TARGETS: JSON数组字符串如[{type:domain,value:example.com},{type:ip,value:192.168.1.0/24}]PENTAGI_GRAPH_URI: Neo4j连接串如bolt://neo4j:7687挂载卷/pentagi/input/存放临时输入文件如目标列表TXT挂载卷/pentagi/output/存放原始扫描输出供调试非主数据源这强制要求镜像开发者思考“我的工具需要什么才能工作哪些是必须的哪些是可选的” 避免了传统脚本中常见的硬编码目标、密钥或路径。3.2 执行契约标准化的生命周期与错误码镜像内主进程必须遵循统一行为启动后先连接PENTAGI_GRAPH_URI验证Neo4j可用性超时30秒失败则exit 1解析PENTAGI_TARGETS对每个目标生成唯一ID如sha256(domain)执行扫描原始输出必须写入/pentagi/output/raw.json扫描结束后必须将结构化结果如发现的路径、技术栈以Cypher语句格式写入/pentagi/output/cypher.cql最终exit 0成功或exit 2图谱写入失败、exit 3目标解析失败等约定错误码这种标准化让调度器可以是简单的shell脚本或Kubernetes Job能无差别地管理Nuclei、SQLMap、FFUF等任意工具——它只关心“你退出码是多少”“你生成的cypher.cql在哪”而不关心你内部怎么调用Python。3.3 输出契约Cypher即接口图谱即合同最关键的一步是cypher.cql的内容规范。它不是随意的INSERT语句而是严格遵循pentagi Schema的声明式操作// 创建目标节点幂等 MERGE (d:Domain {name: example.com}) ON CREATE SET d.first_seen timestamp() // 关联发现的路径 WITH d UNWIND $paths AS p MERGE (d)-[:HAS_PATH]-(path:Path {path: p.path, status: p.status}) // 关联技术栈识别结果 WITH d UNWIND $techs AS t MERGE (t_node:Technology {name: t.name, version: t.version}) MERGE (d)-[:RUNS_TECHNOLOGY]-(t_node)这里$paths和$techs是镜像启动时注入的参数。这种设计让扫描器彻底解耦它不负责理解Neo4j事务只负责“告诉图谱发生了什么”图谱引擎负责保证数据一致性。我曾因此救回一个崩溃的测试——当Nuclei扫描中途OOMraw.json损坏但cypher.cql已写入重启后只需重放CQL文件图谱状态就完全恢复无需重扫。实操心得别用docker run -it手动调试pentagi镜像。一定要用docker-compose up --build配合docker-compose.yml中的x-pentagi扩展。例如services: nuclei: build: ./pentagi-nuclei-scanner environment: - PENTAGI_TARGETS${TARGETS} - PENTAGI_GRAPH_URIbolt://neo4j:7687 volumes: - ./data:/pentagi/output x-pentagi: type: scanner triggers: - MATCH (d:Domain) WHERE NOT (d)-[:HAS_PATH]-() RETURN d.name4. 从零搭建pentagi最小可行环境避开Windows Docker Desktop的虚拟化陷阱现在让我们亲手搭起一个能跑通的pentagi环境。重点不是堆砌功能而是验证协议能否闭环目标输入 → 扫描器执行 → 图谱写入 → 查询验证。整个过程控制在20分钟内且明确告诉你每个环节为何如此设计。4.1 环境准备为什么推荐WSL2而非Docker Desktop for Windows你搜到的热词里“docker desktop failed to start because virtualisation support wasn’t detected”高居榜首。这暴露了一个残酷现实在Windows上Docker Desktop的虚拟化层Hyper-V或WSL2本身就是最大的单点故障。一旦BIOS中Intel VT-x/AMD-V被禁用或Windows更新重置了WSL2内核整个pentagi环境就瘫痪。我们的方案是绕过Docker Desktop直连WSL2的Docker Engine。这需要三步启用WSL2并安装Ubuntu 22.04微软官方文档一步到位在Ubuntu中安装Docker Engine非Desktopsudo apt update sudo apt install -y ca-certificates curl gnupg sudo install -m 0755 -d /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 $(. /etc/os-release echo $VERSION_CODENAME) stable | sudo tee /etc/apt/sources.list.d/docker.list /dev/null sudo apt update sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin sudo usermod -aG docker $USER配置Docker守护进程监听TCP端口让Windows主机能调用编辑/etc/docker/daemon.json{ hosts: [unix:///var/run/docker.sock, tcp://0.0.0.0:2375] }重启sudo systemctl restart docker这样做的好处是Docker Engine运行在WSL2 Linux内核上完全规避Windows Hyper-V的兼容性问题同时Windows上的VS Code、PowerShell可通过DOCKER_HOSTtcp://localhost:2375直接调用体验无异于Desktop。4.2 启动Neo4j精简配置专注图谱协议Neo4j官方Docker镜像默认开启大量企业功能对pentagi纯属冗余。我们用最小化配置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_connector_bolt_advertised__addresslocalhost:7687 \ -e NEO4J_dbms_connector_http_advertised__addresslocalhost:7474 \ --restart unless-stopped \ neo4j:5.16-enterprise关键点使用enterprise版免费社区版不支持dbms.connector.bolt.advertised_address导致Docker网络内服务无法正确连接advertised_address必须设为localhost否则Docker内其他容器如Nuclei连接时会解析到错误IP密码password123是pentagi协议的默认凭据所有代理镜像都预设此值避免配置分散启动后访问http://localhost:7474用neo4j/password123登录执行初始化Cypher创建pentagi Schema// 创建约束确保节点唯一性 CREATE CONSTRAINT ON (d:Domain) ASSERT d.name IS UNIQUE; CREATE CONSTRAINT ON (i:IP) ASSERT i.address IS UNIQUE; CREATE CONSTRAINT ON (p:Path) ASSERT p.path IS UNIQUE; // 创建索引加速查询 CREATE INDEX domain_name_index ON :Domain(name); CREATE INDEX ip_address_index ON :IP(address);4.3 构建首个pentagi代理Nuclei扫描器的协议封装我们不直接用projectdiscovery/nuclei镜像而是基于它构建一个pentagi-nuclei-scanner加入协议层。新建目录pentagi-nuclei-scanner放入DockerfileFROM projectdiscovery/nuclei:3.2.6 # 复制pentagi协议脚本 COPY entrypoint.sh /entrypoint.sh RUN chmod x /entrypoint.sh # 安装jq解析JSON必需 RUN apt-get update apt-get install -y jq rm -rf /var/lib/apt/lists/* ENTRYPOINT [/entrypoint.sh]entrypoint.sh核心协议实现#!/bin/bash set -e # 1. 验证必要环境变量 if [[ -z $PENTAGI_TARGETS || -z $PENTAGI_GRAPH_URI ]]; then echo ERROR: PENTAGI_TARGETS and PENTAGI_GRAPH_URI must be set exit 1 fi # 2. 连接Neo4j验证 if ! timeout 30 bash -c until curl -f -s http://$(echo $PENTAGI_GRAPH_URI | cut -d/ -f3 | cut -d: -f1):7474/db/data/; do sleep 1; done; then echo ERROR: Cannot connect to Neo4j at $PENTAGI_GRAPH_URI exit 2 fi # 3. 解析PENTAGI_TARGETS生成nuclei输入文件 echo $PENTAGI_TARGETS | jq -r .[] | select(.typedomain) | .value /tmp/targets.txt # 4. 执行扫描输出原始JSON nuclei -u $(cat /tmp/targets.txt) -o /pentagi/output/raw.json -jsonl -t ~/nuclei-templates/ # 5. 解析raw.json生成cypher.cql简化版仅提取路径 echo MERGE (d:Domain {name: $(cat /tmp/targets.txt)}) ON CREATE SET d.first_seen timestamp() /pentagi/output/cypher.cql cat /pentagi/output/raw.json | jq -r select(.matched-at ! null) | MERGE (d:Domain {name: \\(.host)\})-[:HAS_PATH]-(p:Path {path: \\(.matched-at)\, status: \(.status)}) /pentagi/output/cypher.cql echo INFO: Scan completed. Cypher output written to /pentagi/output/cypher.cql exit 0构建并运行cd pentagi-nuclei-scanner docker build -t pentagi-nuclei-scanner . docker run -it \ --network host \ -e PENTAGI_TARGETS[{type:domain,value:hackerone.com}] \ -e PENTAGI_GRAPH_URIbolt://localhost:7687 \ -v $(pwd)/output:/pentagi/output \ pentagi-nuclei-scanner4.4 验证闭环用Cypher查询确认协议生效进入Neo4j Browser (http://localhost:7474)执行MATCH (d:Domain)-[r:HAS_PATH]-(p:Path) WHERE d.name hackerone.com RETURN d.name, p.path, p.status如果看到类似hackerone.com,/robots.txt,200的结果恭喜pentagi协议的第一个闭环已完成目标输入 → 扫描器执行 → 结构化写入图谱 → 可查询验证。这不是玩具而是真实红队基础设施的原子基石。踩坑实录我在Windows上首次运行时nuclei命令报错command not found。排查发现projectdiscovery/nuclei镜像的ENTRYPOINT是/nuclei而我们的entrypoint.sh覆盖了它但没显式调用/nuclei。解决方案是在Dockerfile中改为FROM scratch并手动安装Nuclei或在entrypoint.sh末尾添加exec /nuclei $。这是pentagi协议封装中最易忽略的细节——代理镜像必须尊重原工具的执行入口协议层只是前置增强而非替代。5. pentagi的真正威力让AI代理在图谱上自主协同而非人工编排至此你已拥有一个能跑通的pentagi环境。但此时的pentagi还只是“自动化脚本的容器化包装”。它的革命性在于让AI代理基于图谱状态自主触发、协作与决策。这需要引入一个轻量级调度器Scheduler它不执行扫描只观察图谱、匹配规则、启动对应Docker服务。5.1 调度器原理图谱即事件总线Cypher即订阅规则传统编排如Ansible、Airflow靠YAML定义任务依赖“任务A完成后触发任务B”。pentagi调度器则不同它把Neo4j当作事件总线Event Bus每个代理的x-pentagi.triggers字段就是一条Cypher订阅规则。调度器持续轮询或监听Neo4j变更流当某条Cypher查询返回非空结果就启动对应服务。例如pentagi-nuclei-scanner的触发规则是x-pentagi: triggers: - MATCH (d:Domain) WHERE NOT (d)-[:HAS_PATH]-() RETURN d.name意思是“当图中存在尚未扫描过路径的Domain节点时启动我”。而pentagi-sqlmap-exploiter的规则可能是x-pentagi: triggers: - MATCH (d:Domain)-[:HAS_PATH]-(p:Path) WHERE p.path CONTAINS login AND p.status 200 RETURN d.name, p.path即“当发现含‘login’的200页面时启动SQLMap”。这种设计让整个工作流变成声明式Declarative而非命令式Imperative。你不再写“先扫子域再扫路径再对路径做SQLi”而是声明“我想知道所有可登录页面”系统自动推导出需要启动哪些代理、按什么顺序。5.2 实现一个极简调度器100行Python搞定我们不用Kubernetes或复杂框架写一个scheduler.py用neo4j-driver轮询from neo4j import GraphDatabase import docker import json import time import os class PentagiScheduler: def __init__(self): self.driver GraphDatabase.driver( os.getenv(NEO4J_URI, bolt://localhost:7687), auth(os.getenv(NEO4J_USER, neo4j), os.getenv(NEO4J_PASS, password123)) ) self.client docker.from_env() def check_triggers(self): # 读取docker-compose.yml中的x-pentagi.triggers with open(docker-compose.yml) as f: import yaml compose yaml.safe_load(f) for service_name, service in compose.get(services, {}).items(): triggers service.get(x-pentagi, {}).get(triggers, []) for i, trigger in enumerate(triggers): with self.driver.session() as session: result session.run(trigger).data() if result: # 有结果触发服务 print(fTRIGGERED: {service_name} by trigger {i}) self.launch_service(service_name, result) def launch_service(self, service_name, targets): # 将targets转为PENTAGI_TARGETS环境变量 targets_json json.dumps(targets) # 启动Docker服务简化版实际用docker-compose up -d service_name self.client.containers.run( fpentagi-{service_name}, environment{ PENTAGI_TARGETS: targets_json, PENTAGI_GRAPH_URI: bolt://host.docker.internal:7687 }, network_modehost, removeTrue, detachTrue ) if __name__ __main__: scheduler PentagiScheduler() while True: scheduler.check_triggers() time.sleep(10) # 每10秒检查一次关键点host.docker.internal是Docker内置DNS让容器内服务能访问宿主机的Neo4j运行在WSL2中targets_json将Cypher查询结果如[{d.name:example.com}]直接传给代理代理用jq解析即可调度器本身不关心代理内部逻辑只做“触发-传递”两件事5.3 演示自主协同从域名到SQLi漏洞的全自动链条现在我们启动整个链条初始状态Neo4j中只有(:Domain {name:example.com})节点调度器轮询发现MATCH (d:Domain) WHERE NOT (d)-[:HAS_PATH]-() RETURN d.name返回example.com启动Nucleipentagi-nuclei-scanner扫描写入(:Domain)-[:HAS_PATH]-(:Path {path:/login.php})调度器再次轮询MATCH (d:Domain)-[:HAS_PATH]-(p:Path) WHERE p.path CONTAINS login...返回example.com和/login.php启动SQLMappentagi-sqlmap-exploiter收到{d.name:example.com, p.path:/login.php}对example.com/login.php执行注入测试若成功写入(:Domain)-[:HAS_VULNERABILITY]-(:Vulnerability {type:SQLi, severity:critical})整个过程无需人工干预。你只需在Neo4j中创建初始目标剩下的由图谱状态和代理规则驱动。这才是pentagi的“AI”所在——AI不是指某个大模型而是指整个系统具备基于状态自主决策、组合能力的智能体特性。个人体会我最初以为pentagi需要集成LLM来“思考”下一步。实践后发现90%的渗透决策逻辑用Cypher规则图谱状态就能精准表达。LLM更适合在最后一步将图谱中的(:Domain)-[:HAS_VULNERABILITY]-(:Vulnerability)关系自然语言生成一份给CTO看的摘要报告。把AI用在刀刃上而非强行套用。6. 生产就绪的关键加固权限、审计与故障隔离一个能跑通的pentagi环境离生产就绪还有三道坎权限失控、操作不可审计、故障全局蔓延。这三者在红队场景中尤为致命——一个配置错误的扫描器可能触发目标WAF的封禁策略影响整个测试一个未授权的图谱读取可能泄露敏感资产信息。6.1 Docker权限加固放弃root启用用户命名空间映射默认Docker容器以root运行一旦容器内程序被攻破如Nuclei模板存在RCE攻击者可直接获得宿主机root权限。pentagi生产环境必须启用用户命名空间User Namespace在/etc/docker/daemon.json中添加{ userns-remap: default }重启Dockersudo systemctl restart docker此时所有容器内UID/GID被映射到宿主机上一个隔离的UID范围如231072-262143即使容器内root也无法操作宿主机关键文件。同时每个pentagi代理镜像的Dockerfile必须指定非root用户# 在ENTRYPOINT前添加 RUN groupadd -g 1001 -r pentagi useradd -S -u 1001 -r -g pentagi pentagi USER pentagi6.2 Neo4j审计记录每一次图谱写入为溯源提供铁证pentagi的图谱是红队操作的“单一事实源”必须可审计。Neo4j企业版提供dbms.audit.enabledtrue但社区版需另辟蹊径。我们在所有代理的cypher.cql生成逻辑中强制添加审计节点// 在每个代理的cypher.cql开头插入 CREATE (a:AuditLog { timestamp: timestamp(), agent: pentagi-nuclei-scanner, version: 3.2.6, input_targets: $PENTAGI_TARGETS, executed_by: pentagi-scheduler-v1.0 }) // 原有业务语句... MERGE (d:Domain {name: example.com})这样每次扫描都会在图谱中留下不可篡改的审计痕迹。查询历史操作只需MATCH (a:AuditLog) WHERE a.timestamp timestamp() - 86400000 // 过去24小时 RETURN a.agent, a.input_targets, a.timestamp6.3 故障隔离为每个代理设置资源限制与健康检查避免一个代理失控拖垮整个环境。在docker-compose.yml中为每个服务添加services: nuclei: # ... 其他配置 deploy: resources: limits: memory: 2G cpus: 1.0 reservations: memory: 512M healthcheck: test: [CMD, curl, -f, http://localhost:7474/db/data/] interval: 30s timeout: 10s retries: 3memory: 2G防止Nuclei扫描大目标时OOM杀掉其他容器healthcheck确保Neo4j可用后再启动代理避免因图谱不可用导致代理反复崩溃重启最后给调度器加上熔断机制当某代理连续3次exit 1暂停其触发规则2小时并发送告警可用curl调用企业微信机器人。经验之谈pentagi不是银弹。它极大提升了红队的规模化与可重复性但无法替代人的判断。我见过最危险的误报是Nuclei模板将/api/v1/status返回的{status:ok}误判为Spring Boot Actuator漏洞。pentagi的价值是让这类误报可定位、可复现、可批量修正——你只需更新pentagi-nuclei-scanner镜像中的模板版本所有后续扫描自动生效而不用手动登录20台服务器改配置。
返回列表