渗透测试的交付物不只是一份漏洞报告,还包括一个与测试前一致的运行环境。项目进入收尾阶段时,真正容易出问题的往往不是已经写进报告的漏洞,而是测试过程中留下的临时账号、上传的探针文件、为便利而放宽的访问策略,以及这些东西在授权结束后仍长期生效。本文面向执行测试的渗透测试人员,以及负责验收的蓝队与运维安全负责人,说明如何把环境收口做成可核验、可回退、可追责的流程。
适用范围与前置条件如下:测试已获得书面授权与明确的规则约定(ROE),收口动作在约定时间窗内执行,涉及生产环境的变更走变更审批并指定回滚点,至少两人复核,一人操作一人核对清单。开始收口前必须先确认一件事:测试期间产生的所有变更都已被记录。如果测试阶段没有维护变更清单,收口阶段就要先补做一次全量盘点,而不是直接开始删除。

收口的目标、范围与变更清单
收口的目标可以拆成三条可验证的结论:授权范围外的访问路径已关闭;测试期间新增的账号、文件、策略已全部撤销或还原;上述动作均有日志与证据支撑。范围应覆盖测试实际触达的全部层面,包括主机账号与应用账号、API 密钥与令牌、云上身份与委托关系、网络放行规则、上传的文件与数据库记录、计划任务与自启动项、测试期间临时搭建的隧道或监听。
变更清单建议在测试第一天就开始记录,字段至少包含:变更时间、资产标识、变更类型(新增/修改/删除)、变更前状态、变更后状态、执行人、回滚方法、关联的测试用例编号。收口阶段把这张表当作对账底稿,逐项打勾并附证据路径,比凭记忆回忆“当时好像改过什么”可靠得多。
需要提前确认的两个边界:一是测试中若使用过客户提供的真实数据,按规范要求在授权取消后销毁相关机密资料,销毁动作本身也要留痕;二是收口不等于修复,收口只负责还原环境,漏洞修复与复测属于另一条线,两者不要混在一次变更里,否则出问题时无法区分是清理引入还是修复引入。
先取证再动手:证据冻结的顺序
清理动作具有破坏性,一旦删错,审计线索也随之消失。因此顺序必须是先取证、再变更、最后验证。
取证阶段至少完成三件事。第一,导出测试期间的完整操作日志,包括堡垒机会话、云审计事件、WAF 与代理访问日志、目标主机与应用日志,导出时记录时间范围与时区,避免后续比对时出现八小时偏差。第二,对上传或落地的 PoC 文件做哈希清单,删除前保存路径、大小、修改时间与 SHA-256 值。第三,对修改过的配置项保存变更后的当前值,作为“已还原”的对照基线。
# 示例:对测试目录生成哈希清单后再删除,目标与路径均为占位
find /var/www/html/uploads -type f -newermt '<TEST_START>'
-printf '%TY-%Tm-%TdT%TH:%TM:%TS %s %pn' > /evidence/poc-files.list
sha256sum $(awk '{print $3}' /evidence/poc-files.list) >> /evidence/poc-files.sha256这里使用 -newermt 而非全目录列举,是为了把范围限定在测试时间窗内,避免把业务正常上传的文件一并算进清理对象。执行前务必人工核对清单内容,发现疑似业务文件时立即停止并联系资产负责人确认,不要“先删了再说”。
测试凭证与账号的吊销
凭证是收口优先级最高的一项,因为它是攻击者最直接的复用入口。需要覆盖的类型包括:本地系统账号与域账号、应用后台测试账号、数据库账号、API Key 与访问令牌、SSH 公钥、云 IAM 用户与角色、OAuth 应用授权与刷新令牌、CI/CD 流水线令牌、临时签发的证书。
吊销顺序建议是“先断会话、再禁登录、后删实体”。直接删除账号会让该账号的历史操作记录失去主体关联,审计时难以回溯;先禁用再观察一段时间,等日志确认无异常活动后再删除,是更稳妥的做法。删除云上身份前,先确认没有其他服务以该身份运行,避免误伤业务。
# 示例:撤销令牌后的阴性验证,期望返回 401 或 403
curl -sS -o /dev/null -w '%{http_code}n'
-H 'Authorization: Bearer <REVOKED_TOKEN>'
https://api.example.internal/v1/whoami
# 示例:验证测试期间投放的 SSH 公钥已移除,期望 Permission denied
ssh -i ./pt_key -o BatchMode=yes -o ConnectTimeout=5 ops@host.example.internal true除了删除动作本身,还要检查是否存在“删除后仍可用的旁路”:已登录的长会话、记住我的持久 Cookie、刷新令牌未吊销、私钥已下发到测试机但未回收、密码已写入测试报告附件。会话类凭证的失效往往需要服务端主动踢出,仅改密码并不足够。
PoC 残留清理的具体对象
残留清理最容易漏,因为测试人员通常记得自己上传了什么,却记不全为验证漏洞顺手改了什么。下面这份对象清单可以直接当作逐项核对表使用。
| 类别 | 典型对象 | 清理方式 | 验证方法 |
|---|---|---|---|
| 落地文件 | WebShell、测试脚本、压缩包、临时证书 | 哈希留证后删除 | 目录遍历与文件完整性比对 |
| 数据库 | 测试账号、测试数据行、被修改的配置表 | 按主键精确删除或按备份还原 | 按条件查询应为 0 条 |
| 计划任务 | cron、systemd timer、Windows 计划任务 | 删除任务并重载服务 | 列举任务列表确认不存在 |
| 服务与自启 | 临时监听端口、反连后门、启动项、注册表键 | 停服务、禁用自启、删除键值 | 端口扫描与自启项列举 |
| 网络通道 | 隧道、代理、端口转发规则 | 关闭进程并清理规则 | 从外部复测连接应失败 |
| 配置改动 | 应用配置、权限位、sudoers、日志级别 | 按变更前快照还原 | 与基线配置比对 |
| 内容注入 | 测试用的页面、评论、公告、邮件模板 | 删除并清理缓存 | 前台访问确认 404 或恢复原状 |
清理完成后做一次差异比对,比逐条回忆更有效:拿测试前的基线快照与当前状态做 diff,差异项要么在变更清单里有对应记录并已还原,要么就是漏项。配置文件、权限位、计划任务列表、开放端口这四类差异尤其值得逐条看。
访问策略与云上委托的回退
为便于测试而临时放宽的策略,是收口阶段风险最高的遗留项,因为它不占用账号、不落地文件,却直接扩大了暴露面。常见的有:安全组与网络 ACL 放行测试机 IP、WAF 加白、CDN 回源豁免、堡垒机加开直连、VPN 账号延期、云上跨账号角色委托、对象存储桶策略放宽、OAuth 应用授予高权限范围。
回退顺序与授权顺序相反:先收回权限,再清理实体,最后删除账号。以云上跨账号委托为例,先解除信任策略中的测试账号主体,再删除临时角色,最后清理测试账号本身;如果反过来先删账号,角色可能变成无主但仍可被其他主体代入的状态。
回退时保留“回退前快照”和“回退后快照”两份策略文本,并在报告中给出两者的差异行。仅写一句“已恢复原策略”无法被验收,尤其当策略经过多轮临时调整时,只有差异比对才能证明恢复到了正确版本。
回退验证:用阴性测试证明权限确实收回
验证的核心思路是阴性测试:以测试期间可用的路径重新尝试,期望失败。只验证“业务正常”是不够的,业务正常只能说明没有误伤,不能说明攻击面已关闭。
建议按下面四类验证逐项执行,并把结果写入验收表。
第一类是凭证失效验证。用已吊销的令牌、已删除的账号、已移除的密钥分别发起一次最小请求,记录返回码与错误信息。期望结果是认证失败,而不是业务错误或超时;如果返回 500,说明吊销动作可能引入了异常,需要回退排查。
第二类是网络路径验证。从测试期间使用过的源地址重新连接被放行的端口与服务,期望被拒绝或超时。注意要从同一源发起,换一个网络环境测试会得出误导性结论。
第三类是权限边界验证。测试期间通过提权或越权触达的资源,重新以原账号访问一次,期望被拒绝。这类验证要控制频率,避免触发告警风暴影响正常监控。
第四类是配置一致性验证。将关键配置文件、策略文本、计划任务列表与测试前基线做比对,差异应为空或仅为预期内的业务变更。
| 验证项 | 方法 | 通过标准 | 证据留存 |
|---|---|---|---|
| 测试账号已失效 | 用原凭证登录一次 | 认证失败,无会话建立 | 请求与响应截图、日志事件 ID |
| API 令牌已吊销 | 携带旧令牌请求接口 | 401/403 | 响应码记录 |
| 安全组已回收 | 从原测试源连接端口 | 拒绝或超时 | 连接结果与策略快照 |
| PoC 文件已清除 | 目录列举与哈希比对 | 清单内文件均不存在 | 删除前后哈希清单 |
| 计划任务已移除 | 列举任务与自启项 | 无测试相关条目 | 列举输出 |
| 云角色委托已解除 | 尝试代入角色 | 拒绝 | 错误码与信任策略文本 |
审计日志核验:确认收口动作本身也被记录
收口做完不等于闭环,还要能用日志证明这段时间发生了什么。核验分两个方向:一是确认测试期间的行为都被记录且可追溯,二是确认收口动作本身留下了痕迹。
时间窗要覆盖三段:测试开始前一段时间(作为基线)、测试全过程、收口完成后的一段观察期。观察期的意义在于捕捉延迟生效的残留,比如某个定时任务在收口后第二天才触发。云上环境可借助云审计服务的检索能力,按用户账号、客户端 IP、操作类型组合筛选,多数平台支持包含、等于、不等于等匹配方式,检索时把测试账号与测试源 IP 作为主要条件。
核验时重点看四类事件:测试账号在收口后是否仍有活动;被删除的文件或策略是否被重建;权限变更是否由预期内的人员执行;清理操作本身是否有对应记录。如果发现收口后仍有该账号的成功登录,说明吊销不完整,需要回到凭证环节重新排查,此时不要继续删除更多对象,先定位残留入口。
日志留存方面,按授权约定与合规要求确定保留周期,导出为不可篡改的归档格式并计算校验值,随报告一并交付。日志中的敏感字段(口令、令牌、个人数据)在交付前做脱敏处理,但脱敏不能破坏事件关联所需的时间戳、主体标识与源地址。微软的渗透测试规则说明中明确了即便有授权也不允许的测试类型,并指出 ROE 才是权威依据,这类边界条款同样应在收口报告中引用一次,说明本次测试未触及禁止项。

收口报告与验收签字
收口报告不需要写成长篇,但字段要齐。建议包含:授权与实际测试时间窗、资产清单与变更清单完成率、每类残留的清理数量与证据路径、策略回退前后的差异、阴性验证结果表、日志留存位置与保留周期、遗留问题与责任方、双人复核签字。
验收时最容易产生争议的是“无法验证”的项,比如某个测试账号由第三方系统托管、日志保留期不足、某条策略无历史版本可回退。这类项不要含糊带过,应单独列出并注明确认人与后续跟进时间,否则它会在下一次审计时重新变成问题。
最后提醒两个停止条件。第一,清理过程中发现疑似业务正在使用的对象,立即停止并升级确认,不要凭测试记录判断归属。第二,阴性验证出现非预期成功时,停止后续清理动作,先定位原因,因为此时继续删除可能破坏现场,让残留入口更难被发现。收口的价值不在于动作做完,而在于每一步都能被下一个人复核。
- CI/CD
- it2021
- it2021.com
- 微软
- 渗透测试





重庆 重庆 1F
变更清单从第一天就开始记,这个习惯确实能省很多事后对账的麻烦