Web 渗透测试
授权Web应用渗透测试——侦察、漏洞分析、基于证据的利用以及专业报告。采用香农的“无利用,不报告”方法论,并对范围、授权和辅助客户端信息泄漏设置了严格的防护措施。针对您拥有或获得书面授权进行测试的在线运行应用程序进行主动测试。
技能元数据
| 来源 | 可选 — 使用 hermes skills install official/security/web-pentest 安装 |
| 路径 | optional-skills/security/web-pentest |
| 平台 | linux, macos |
以下是 Hermes 在触发此技能时加载的完整技能定义。这是智能体在技能激活时看到的说明。
Web 应用程序渗透测试
针对运行中的 Web 应用程序的阶段性渗透测试工作流程。改编自 Shannon 的流水线(Keygraph,AGPL — 仅采用概念,未借用代码)。围绕三条规则构建:
- 无漏洞利用,无报告 — 每个发现都需要可重现的证据。
- 范围受限 — 每个主动请求都针对操作员预先声明的目标。超出范围的主机将被拒绝。
- 穷尽绕过后再排除误报 — 一个被“阻止”的有效载荷并不等于安全,在尝试完绕过方法集之前不能下此结论。
⚠️ 严格防护栏 — 每次参与前必读
违反任何一条将使本次参与无效,并可能构成非法行为。
-
授权关卡。 在会话中进行第一次主动扫描之前,您必须以书面形式向用户确认他们拥有目标的所有权或已获得书面测试授权。将确认信息记录在
engagement/authorization.md中(参见模板)。没有确认 → 禁止主动扫描。使用curl读取公开页面是可以的;发送有效载荷则不行。 -
范围允许列表。 维护
engagement/scope.txt— 每行一个主机名或 CIDR。每个nmap、curl、whatweb、浏览器导航或携带有效载荷的请求都必须针对范围内的条目。如果目标将您重定向到范围外(3xx 到其他主机、HTML 中的链接),停止并在继续之前与用户确认。 -
无正式文件不得操作生产系统。 如果用户没有明确告诉您“是的,生产环境在范围内,并且我有书面批准”,则假定不在范围内。默认目标是预发布环境、本地 Docker、专用测试实例。
-
云元数据默认禁止访问。 除非参与明确将 SSRF 到元数据作为目标并且您控制着目标,否则不要探测
169.254.169.254、metadata.google.internal、100.100.100.200、[fd00:ec2::254]或类似地址。智能体的浏览器工具可以从您自己的基础设施内部访问这些地址 — 请勿使用。 -
破坏性有效载荷需要批准。 执行 DROP/DELETE 的 SQLi 有效载荷、写入文件系统的 SSTI、使用
rm/shutdown/mkfs的命令注入、任何超出单个测试行的修改操作 → 请先申请。approval.py系统会捕获一些情况;但不要仅依赖它。 -
辅助客户端泄漏风险(Hermes 特有)。 此技能生成的会话包含大量 SQLi/XSS/RCE 有效载荷、捕获的凭据、JWT 令牌。Hermes 的压缩和标题生成路径通过辅助客户端(通常是主模型)重放历史记录。您写入对话的任何敏感信息都可能在下一次压缩时离开本机。 缓解措施:
- 在将捕获的令牌/凭据记录到任何消息之前,将其编辑为仅保留最后 6 个字符。完整值应保存到
engagement/evidence/文件中,绝不进入聊天历史。 - 如果参与是敏感的,请在
~/.hermes/config.yaml中为该会话设置auxiliary.title_generation.enabled: false。
- 在将捕获的令牌/凭据记录到任何消息之前,将其编辑为仅保留最后 6 个字符。完整值应保存到
-
自行限速。 对单个主机的默认主动请求间隔为 200 毫秒。
recon-scan.sh脚本会强制执行此规则。未经操作员批准,请勿绕过它。 -
报告的权威性。 此技能生成的是安全评估报告,而非“通过”证明。即使运行干净,结论也是“在时间 T 内,使用方法 Y,在范围 X 内未发现可利用的问题” — 而非“应用程序是安全的”。请在报告中反映这种语言。
阶段 0:参与设置
在任何扫描发生之前,创建参与目录和授权确认。
ENGAGEMENT=engagement-$(date +%Y%m%d-%H%M%S)
mkdir -p "$ENGAGEMENT"/{evidence,findings,reports}
cd "$ENGAGEMENT"
-
向用户提问(逐字):
“请确认:(a) 目标 URL 是 [X],(b) 您拥有此应用程序或已获得书面测试授权,(c) 本次参与从现在开始可能持续长达 [N] 小时。回复‘authorized’以继续。”
-
等待明确的
authorized回复。 任何其他回答都意味着停止。 -
记录授权到
engagement/authorization.md,使用templates/authorization.md中的模板。包括:- 目标 URL 和 IP
- 授权依据(所有权 / 来自 $name 的书面授权)
- 参与时间窗口
- 范围外项目(生产环境、第三方服务等)
- 操作员姓名(驱动本次会话的用户)
-
构建 scope.txt:
localhost127.0.0.1staging.example.com192.168.1.0/24 # 仅限内部实验室,需操作员同意 -
阅读
references/scope-enforcement.md,然后再发出第一个主动请求 — 该文档包含您在每个命令/URL 发出前应用的主机提取规则。
阶段 1:预侦察(代码分析,可选)
如果没有源代码访问权限(黑盒参与),则跳过。
如果您有应用程序源代码的读取权限:
- 绘制架构图 — 框架、路由、中间件堆栈
- 盘点接收器 — 每个
execute(、os.system(、eval(、模板渲染、文件读/写、重定向目标 - 映射认证 — 会话 Cookie 与 JWT、OAuth 流程、密码重置、特权端点
- 识别信任边界 — 什么是需要认证的,什么不是,什么来自
request.* - 反向污点追踪从每个接收器到请求源。发现适当的清理(参数化查询、允许列表、
shlex.quote、知名转义器)时提前终止。
输出:evidence/pre-recon.md — 架构图、接收器清单、疑似漏洞代码路径。
这是离线工作。不向目标发送任何流量。
阶段 2:侦察(在线,只读)
映射攻击面。所有请求都是对公开页面的 GET 请求,尚未携带有效载荷。仍受范围限制。
-
验证范围。 解析每个目标主机名 → IP。确认 IP 在范围内(避免“DNS 指向意外位置”的陷阱)。
-
网络表面(仅当范围允许端口扫描时):
nmap -sT -T3 --top-ports 100 -oN evidence/nmap.txt $TARGET使用
-T3(默认),而非-T4/-T5。更隐蔽,避免在共享环境中触发 IDS/IPS。 -
技术指纹:
whatweb -v $TARGET_URL > evidence/whatweb.txtcurl -sIk $TARGET_URL > evidence/headers.txt -
端点发现:
- 使用浏览器工具(
browser_navigate、browser_get_images、跟踪链接)爬取应用程序。 - 检查
robots.txt、sitemap.xml、.well-known/*。 - 使用浏览器工具的开发者工具网络面板捕获 XHR/fetch 调用。
- 使用浏览器工具(
-
认证面: 识别登录、注册、密码重置、会话 Cookie 名称、令牌格式。不要发送凭据 — 仅观察。
-
与预侦察关联(如果有源代码)。对于
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 配合以下聚焦的子智能体(尽可能并行):
| 类别 | 目标 | 参考 |
|---|---|---|
injection | SQLi、命令注入、路径遍历、SSTI、LFI/RFI、反序列化 | references/vuln-taxonomy.md(槽类型) |
xss | 反射型、存储型、基于 DOM | references/vuln-taxonomy.md(渲染上下文) |
auth | 登录绕过、JWT 混淆、会话固定、OAuth 漏洞 | references/exploitation-techniques.md |
authz | IDOR、垂直/水平权限提升、业务逻辑 | references/exploitation-techniques.md |
ssrf | 内部可达性、元数据、协议走私 | 除非明确授权,否则跳过元数据 |
infra | 配置错误、信息泄露、默认凭据、暴露的管理界面 | references/exploitation-techniques.md |
每个队列条目包含:id、漏洞类别、来源(如果已知则为文件:行)、端点、参数、槽类型、疑似防御、判定(identified / partial / confirmed / critical)、见证有效载荷、置信度(0-1)、备注。
分析阶段不发送恶意有效载荷 — 它们仅被暂存。漏洞利用阶段才实际触发它们。
阶段 4:漏洞利用(基于证据,有条件)
仅当分析队列中有可操作的条目(identified 或 partial)时,才为该类别运行子智能体。
对于每个候选项:
- 发送前检查 — 主机在范围内?授权关卡已通过?破坏性有效载荷已获批准?
- 发送见证有效载荷 — 最小化证明。SQLi:
' AND 1=1--然后' AND 1=2--。XSS:一个无害的标记,如<svg/onload=console.log("HERMES-PENTEST-XSS")>。在存储型 XSS 中绝不使用alert(1)— 它会在共享环境中对其他用户触发。 - 验证见证触发 — 对于盲注,使用 sleep 探测(
SLEEP(5))并计时响应。对于 SSRF,使用您自己控制的测试者回调主机(对于敏感参与,请勿使用 webhook.site 等公共服务 — 数据渗出路径)。 - 提升级别:
- L1 已识别 — 模式匹配,无行为变化
- L2 部分 — 到达接收器,但存在防御
- L3 已确认 — 有效载荷以可观察的方式改变了应用行为
- L4 严重 — 数据已提取、代码已执行、权限已提升
- 穷尽绕过后再分类为误报。 对于每个被阻止的候选项:至少尝试
references/bypass-techniques.md中针对该类别的绕过方法集。仅当方法集穷尽后,您才可以写入verdict: false_positive。 - 为每个 L3/L4 记录证据:
- 完整请求(方法、URL、头部、正文)
- 响应(状态码、头部、相关正文摘录)
- 复现命令(curl 单行命令)
- 影响声明
输出:findings/exploitation-evidence.md
在证据文件中进行脱敏处理:
- 任何捕获的凭据/令牌 → 在聊天中仅保留最后 6 个字符;完整值保存到
findings/secrets-vault.md(已添加到 .gitignore)。 - 其他用户的 PII → 进行脱敏。
- 您的测试凭据 → 可以保留。
第5阶段:报告
使用 templates/pentest-report.md 生成最终报告。章节包括:
- 执行摘要
- 参与范围(来自
engagement/scope.txt) - 授权(来自
engagement/authorization.md) - 发现(仅限L3/L4级别——需要证据)。每个发现包括:
- 标题、严重性(CVSS 3.1)、CWE
- 受影响的端点
- 证据(请求 + 响应摘录)
- 复现步骤
- 影响
- 修复建议
- 未利用的候选项(L1/L2,并注明阻止利用的原因)
- 范围外的观察
- 方法论/使用的工具
- 限制及未测试内容
严重性策略: 仅对L3/L4级使用CVSS。L1/L2级为“待验证的候选项”——不要对未验证的发现分配CVSS分数。
何时停止
- 用户撤回授权。
- 一个候选发现明显影响生产数据,并且您未获得破坏性测试的批准——停止并询问。
- 目标开始返回503/429错误风暴——暂停,与操作员重新商议。
- 您发现合同范围之外的内容(例如,在测试一个不相关的端点时发现一个暴露的客户数据库)。停止,记录,向操作员报告。未经明确批准,不要进行横向移动——这种横向移动正是使渗透测试变得非法的行为。
本技能未涵盖的内容
- 超出端口扫描的网络层渗透测试(无Metasploit、Cobalt Strike、AD攻击、网络协议模糊测试)。
- 逆向工程/二进制分析(参见问题#383)。
- 仅限源代码的静态分析(参见问题#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— 按漏洞类型分类的发现队列模式scripts/recon-scan.sh— 限速的nmap+whatweb+headers包装脚本