跳到主要内容

Web 渗透测试

经授权的 Web 应用程序渗透测试——包括侦察、漏洞分析、基于证据的利用以及专业报告编制。采用 Shannon 的“无利用,无报告”(No Exploit, No Report)方法论,并针对范围、授权和辅助客户端(aux-client)泄露设置了严格的护栏。仅对您拥有或已获得书面授权测试的运行中应用程序进行主动测试。

技能元数据

来源可选 — 使用 hermes skills install official/security/web-pentest 安装
路径optional-skills/security/web-pentest
平台linux, macos

参考:完整 SKILL.md

信息

以下是触发此技能时 Hermes 加载的完整技能定义。当技能处于活动状态时,代理将这些内容视为指令。

Web 应用程序渗透测试

针对运行中的 Web 应用程序的分阶段渗透测试工作流。改编自 Shannon 的流水线(Keygraph,AGPL 许可——仅借鉴概念,未借用代码)。围绕以下三条规则构建:

  1. 无利用,无报告——每个发现都需要可复现的证据。
  2. 范围受限——每个主动请求必须针对操作员预先声明的目标。拒绝超出范围的主机。
  3. 在排除误报之前先穷尽绕过方法——在尝试完绕过集合之前,“被拦截”的有效负载并不代表安全无恙。

⚠️ 严格护栏——每次参与前必读

违反任何一条都将导致本次参与无效,并可能构成非法行为。

  1. 授权关口。 在会话中进行首次主动扫描之前,您必须以书面形式与用户确认,他们拥有目标的所有权或拥有测试目标的书面授权。将确认记录在 engagement/authorization.md 中(参见模板)。无确认 → 无主动扫描。使用 curl 读取公共页面是可以的;发送有效负载则不行。

  2. 范围允许列表。 维护 engagement/scope.txt ——每行一个主机名或 CIDR。每个 nmapcurlwhatweb、浏览器导航或携带有效负载的请求必须针对范围列表中的条目。如果目标将您重定向到范围外(3xx 重定向到其他主机,或 HTML 中的链接),请停止并在跟随之前与用户确认。

  3. 无书面批准不测试生产系统。 如果用户未明确告知“是的,生产环境在范围内,且我有书面签字批准”,则默认假设不在范围内。默认目标应为预发布环境(staging)、本地 Docker 容器或专用测试实例。

  4. 默认禁止探测云元数据。 除非参与范围明确将 SSRF 至元数据作为目标,目标在您控制之下,否则不要探测 169.254.169.254metadata.google.internal100.100.100.200[fd00:ec2::254] 或等效地址。代理的浏览器工具可以从您的基础设施内部访问这些地址——请勿这样做。

  5. 破坏性有效负载需批准。 会导致 DROP/DELETE 的 SQL 注入有效负载、文件系统写入型 SSTI、包含 rm/shutdown/mkfs 的命令注入、任何超出单行测试数据的变更操作 → 先询问approval.py 系统会捕获部分情况;但不要仅依赖它。

  6. 辅助客户端泄露风险(Hermes 特有)。 此技能生成的会话中包含大量 SQLi/XSS/RCE 有效负载、捕获的凭据、JWT 令牌。Hermes 的压缩和标题生成路径会通过辅助客户端(通常是主模型)重放历史记录。您写入对话的任何敏感信息都可能在下次压缩时离开本地环境。缓解措施:

    • 在任何消息中记录捕获的令牌/凭据之前,将其脱敏为最后 6 个字符。完整值应存入 engagement/evidence/ 文件,绝不要放入聊天历史。
    • 如果参与涉及敏感信息,请在会话期间于 ~/.hermes/config.yaml 中设置 auxiliary.title_generation.enabled: false
  7. 自我速率限制。 针对任何单个主机的主动请求之间默认间隔 200ms。recon-scan.sh 脚本会强制执行此限制。未经操作员批准,不要绕过此限制。

  8. 报告的权威性。 此技能生成的是安全评估报告,而非“通过”证明。即使是干净的运行结果,也应表述为“在时间 T 内使用方法 Y 在范围 X 中未发现可利用问题”,而非“应用程序是安全的”。报告中应反映这种措辞。


阶段 0:参与设置

在进行任何扫描之前,创建参与目录和授权确认文件。

ENGAGEMENT=engagement-$(date +%Y%m%d-%H%M%S)
mkdir -p "$ENGAGEMENT"/{evidence,findings,reports}
cd "$ENGAGEMENT"
  1. 向用户询问(逐字如下):

    “确认:(a) 目标 URL 为 [X],(b) 您拥有此应用程序的所有权或拥有测试它的书面授权,以及 (c) 本次参与从现在起最多运行 [N] 小时。回复 'authorized' 以继续。”

  2. 等待明确的 authorized 响应。 任何其他回答均意味着停止

  3. 记录授权engagement/authorization.md,使用 templates/authorization.md 中的模板。包括:

    • 目标 URL 和 IP
    • 授权依据(所有权 / 来自 $name 的书面授权)
    • 参与时间窗口
    • 范围外项目(生产环境、第三方服务等)
    • 操作员姓名(驱动此会话的用户)
  4. 构建 scope.txt:

    localhost
    127.0.0.1
    staging.example.com
    192.168.1.0/24 # internal lab only, with operator OK
  5. 在发出第一个活动请求之前,阅读 references/scope-enforcement.md —— 该文档包含你在每个命令/URL 发出之前必须应用的主机提取规则。


阶段 1:预侦察(代码分析,可选)

如果没有源代码访问权限(黑盒参与),请跳过此阶段。

如果你拥有应用程序源代码的读取权限:

  1. 映射架构 —— 框架、路由、中间件栈
  2. 清点汇点(sinks) —— 每个 execute(os.system(eval(、模板渲染、文件读/写、重定向目标
  3. 映射认证机制 —— Session Cookie 与 JWT、OAuth 流程、密码重置、特权端点
  4. 识别信任边界 —— 哪些是已认证的,哪些不是,哪些来自 request.*
  5. 从每个汇点进行反向污点追踪至请求源。当发现适当的 sanitization(参数化查询、允许列表、shlex.quote、知名的转义器)时早期终止。

输出:evidence/pre-recon.md —— 架构图、汇点清单、疑似漏洞代码路径。

这是离线工作。不向目标发送任何流量。


阶段 2:侦察(实时,只读)

映射攻击面。所有请求均为公共页面的 GET 请求,尚不包含 payload。仍然受范围限制。

  1. 验证范围。 解析每个目标主机名 → IP。确认 IP 在范围内(避免“DNS 指向意外位置”的陷阱)。

  2. 网络表面(仅在范围允许端口扫描时执行):

    nmap -sT -T3 --top-ports 100 -oN evidence/nmap.txt $TARGET

    使用 -T3(默认),而非 -T4/-T5。更隐蔽,避免在共享环境中触发 IDS/IPS。

  3. 技术指纹识别:

    whatweb -v $TARGET_URL > evidence/whatweb.txt
    curl -sIk $TARGET_URL > evidence/headers.txt
  4. 端点发现:

    • 使用浏览器工具爬取应用(browser_navigatebrowser_get_images,跟随链接)。
    • 检查 robots.txtsitemap.xml.well-known/*
    • 通过浏览器工具的开发者工具网络面板捕获 XHR/fetch 调用。
  5. 认证表面: 识别登录、注册、密码重置、Session Cookie 名称、令牌格式。切勿在此时发送凭据——仅观察。

  6. 与预侦察关联(如果你有源代码)。对于 evidence/pre-recon.md 中的每个发现,标记实时表面是否确认其可访问。

输出:evidence/recon.md —— 端点、技术、认证模型、输入向量。


阶段 3:漏洞分析

每个漏洞类别使用一个 delegate_task。每个代理读取 evidence/recon.md(如果存在则加上 evidence/pre-recon.md),并使用 templates/exploitation-queue.json 生成 findings/<class>-queue.json

使用 delegate_task 配合以下专注的子代理(尽可能并行):

类别目标参考
injectionSQL 注入、命令注入、路径遍历、SSTI、LFI/RFI、反序列化references/vuln-taxonomy.md(槽位类型)
xss反射型、存储型、基于 DOM 的 XSSreferences/vuln-taxonomy.md(渲染上下文)
auth登录绕过、JWT 混淆、会话固定、OAuth 缺陷references/exploitation-techniques.md
authzIDOR、垂直/水平越权、业务逻辑漏洞references/exploitation-techniques.md
ssrf内部可达性、元数据、协议走私除非明确授权,否则跳过元数据
infra配置错误、信息泄露、默认凭据、暴露的管理界面references/exploitation-techniques.md

每个队列条目包含:id、漏洞类别、来源(如果已知则为 file:line)、端点、参数、槽位类型、疑似防御措施、判定结果(identified / partial / confirmed / critical)、见证 payload、置信度(0-1)、备注。

分析阶段尚未发送恶意 payload——它们只是被暂存。利用阶段才会实际发送它们。


阶段 4:利用(基于证明,有条件)

仅在分析队列中存在可操作条目(identifiedpartial)的类别中运行子代理。

对于每个候选者:

  1. 发送前检查 — 主机是否在范围内?是否满足认证关卡?如果是破坏性操作,载荷(payload)是否已获批准?
  2. 发送验证载荷 — 最小化证明。SQL 注入:先发送 ' AND 1=1--,再发送 ' AND 1=2--。XSS:使用无害标记,如 <svg/onload=console.log("HERMES-PENTEST-XSS")>。在存储型 XSS 中切勿使用 alert(1) — 它会在共享环境中对其他用户触发。
  3. 验证验证载荷是否触发 — 对于盲注,使用睡眠探测(SLEEP(5))并对响应计时。对于 SSRF,使用由测试者控制的、你自己拥有的回调主机(在敏感参与项目中,不要使用 webhook.site 等公共服务 — 以免泄露路径)。
  4. 提升等级:
    • L1 已识别 — 模式匹配,但无行为变化
    • L2 部分 — 到达 sink 点,但有防御措施
    • L3 已确认 — 载荷以可观察的方式改变了应用行为
    • L4 严重 — 数据被提取、代码被执行或权限被提升
  5. 在归类为误报(FP)之前穷尽绕过尝试。 对于每个被阻断的候选项:至少尝试 references/bypass-techniques.md 中针对该类列出的绕过集合。只有在穷尽该集合后,才能写入 verdict: false_positive
  6. 记录证据 针对每个 L3/L4:
    • 完整请求(方法、URL、头信息、正文)
    • 响应(状态码、头信息、相关正文摘录)
    • 复现命令(curl 单行命令)
    • 影响陈述

输出:findings/exploitation-evidence.md

在证据文件中脱敏:

  • 任何捕获的凭据/令牌 → 聊天中仅保留最后 6 个字符;完整值存入 findings/secrets-vault.md(已在 .gitignore 中)。
  • 其他用户的个人身份信息(PII)→ 脱敏。
  • 你的测试凭据 → 可以保留。

阶段 5:报告

使用 templates/pentest-report.md 生成最终报告。章节包括:

  1. 执行摘要
  2. 参与项目范围(来自 engagement/scope.txt
  3. 授权(来自 engagement/authorization.md
  4. 发现项(仅限 L3/L4 — 需要证明)。每个发现项包含:
    • 标题、严重程度(CVSS 3.1)、CWE
    • 受影响的端点
    • 证明(请求 + 响应摘录)
    • 复现步骤
    • 影响
    • 修复建议
  5. 未利用的候选项(L1/L2,附注说明是什么阻断了它们)
  6. 范围外的观察结果
  7. 方法论 / 使用的工具
  8. 局限性以及未测试的内容

严重程度策略: 仅对 L3/L4 使用 CVSS。L1/L2 为“待验证候选项” — 不要为未验证的发现项分配 CVSS。


何时停止

  • 用户撤销授权。
  • 候选发现项明显影响生产数据,且你没有获得破坏性测试的批准 — 停止并询问。
  • 目标开始返回大量的 503/429 错误 — 退避,并与操作员重新协调。
  • 你发现了合同范围之外的东西(例如,在测试不相关的端点时发现了一个暴露的客户数据库)。停止、记录、向操作员报告。未经明确批准不得横向移动(pivot)— 这种横向移动会使渗透测试变得非法。

此技能不包含的内容

  • 超出端口扫描的网络层渗透测试(不使用 Metasploit、Cobalt Strike、AD 攻击、网络协议模糊测试)。
  • 逆向工程 / 二进制分析(参见 issue #383)。
  • 仅基于源代码的静态分析(参见 issue #382)。
  • 主动社会工程学 / 网络钓鱼。
  • 针对操作员未预先授权系统的任何操作。

如果参与项目需要上述任何内容,请升级至专业渗透测试人员。此技能是对专业渗透测试的补充,而非替代。


延伸阅读

  • references/scope-enforcement.md — 如何限定每个活动请求的范围
  • references/vuln-taxonomy.md — 槽位类型、渲染上下文、OWASP 映射
  • references/exploitation-techniques.md — 每类载荷模式
  • references/bypass-techniques.md — 常见的 WAF/过滤器绕过技术
  • templates/authorization.md — 参与项目授权模板
  • templates/pentest-report.md — 最终报告模板
  • templates/exploitation-queue.json — 每类发现项队列 schema
  • scripts/recon-scan.sh — 速率限制的 nmap+whatweb+headers 包装脚本