---
name: dwy-pentest
description: "白帽渗透测试：对指定服务器执行全面安全评估。触发条件：用户说'渗透测试'、'pentest'、'安全测试'、'漏洞扫描'、'安全审计' 时。"
---

# 白帽渗透测试

对指定目标执行全面安全评估，发现漏洞后报警提示，不执行破坏性操作。

**脚本目录：** `~/.claude/skills/dwy-pentest/scripts/`（以下简称 `{scripts}`）

## 流程总览

```
输入目标 → 环境准备 → 信息收集 → 端口扫描 → 漏洞扫描 → Web 测试 → SSL 审计 → 认证测试 → 漏洞验证 → 报告生成 → 安全告警
```

**共 10 步，不可跳步，不可调换顺序。**

---

## 第 0 步：获取目标

向用户询问测试目标，支持以下格式：
- IP 地址：`192.168.1.100`
- 域名：`example.com`
- URL：`https://example.com:8443`
- IP:端口：`10.0.0.1:8080`

```
请输入要测试的目标（IP/域名/URL）：
```

收到目标后：
1. 确认目标格式有效
2. 如果是私网/本地地址，提示用户确认
3. 创建输出目录：`{项目根目录}/.pentest-results/{YYYYMMDD-HHmmss}/`
4. 将输出目录路径记为 `{output}`，后续所有步骤引用此路径

---

## 第 1 步：环境准备

检查并安装所需工具：

```bash
bash {scripts}/setup_tools.sh
```

如果脚本 Python 依赖未安装：

```bash
cd {scripts} && uv sync
```

**工具清单（必需 + 可选）：**

| 工具 | 必需 | 用途 | 不可用时的降级 |
|------|------|------|--------------|
| nmap | 是 | 端口扫描 + NSE 漏洞脚本 | 无法降级，必须安装 |
| nuclei | 否 | 模板驱动漏洞扫描 | 仅用 nmap NSE |
| testssl.sh | 否 | SSL/TLS 审计 | 用 Python ssl 模块 |
| gobuster | 否 | 目录枚举 | 用 ffuf 或内置路径列表 |
| sqlmap | 否 | SQL 注入检测 | 用基础 HTTP 探针 |
| hydra | 否 | 凭据暴力测试 | 跳过认证测试 |
| ffuf | 否 | Web fuzzer（gobuster 备选） | 用内置路径列表 |
| whatweb | 否 | 技术栈指纹 | 用 HTTP 头分析 |

**nmap 是唯一强依赖**，其余工具脚本内置降级方案。

缺少可选工具时，向用户报告缺失项和影响，然后继续执行。

---

## 第 2 步：信息收集（3 Agent 并行）

**在同一条消息中**派出 3 个 Agent 并行执行：

### Agent-Recon-DNS
```
目标：对 {target} 执行 DNS 和 WHOIS 信息收集
上下文：渗透测试第 2 步，需要获取目标的 IP 地址、DNS 记录、注册信息
范围：仅执行 DNS 查询和 WHOIS，不发送任何攻击流量
规范：使用 {scripts} 目录下的脚本
产出：执行命令并返回结果摘要

执行：
cd {scripts} && uv run pentest_recon.py --target {target} --mode dns --output-dir {output}
```

### Agent-Recon-Tech
```
目标：识别 {target} 的技术栈和 Web 指纹
上下文：渗透测试第 2 步，需要知道目标运行什么软件和版本
范围：HTTP 请求 + whatweb 指纹，不发送攻击 payload
规范：使用 {scripts} 目录下的脚本
产出：执行命令并返回结果摘要

执行：
cd {scripts} && uv run pentest_recon.py --target {target} --mode tech --output-dir {output}
```

### Agent-Recon-OSINT
```
目标：搜索 {target} 相关的已知漏洞和安全事件
上下文：渗透测试第 2 步，需要了解目标是否有已知的安全问题
范围：仅使用 WebSearch 搜索公开信息
产出：返回搜索结果摘要，包含 CVE 编号和关键发现

使用 WebSearch 搜索以下关键词（分多次搜索）：
1. "{target}" CVE vulnerability
2. "{target}" security breach
3. "{target}" 使用的技术栈（从 Agent-Recon-Tech 结果获取）的最新 CVE
```

**等待所有 Agent 完成后**，汇总信息收集结果，向用户报告发现：
- 解析到的 IP 地址
- 技术栈和版本信息
- 发现的敏感文件
- 公开的安全信息

---

## 第 3 步：端口扫描

依赖第 2 步的 DNS 结果确认真实 IP。脚本内部 TCP / UDP 并发执行,版本探测与 OS 指纹识别也并发。

```bash
cd {scripts} && uv run pentest_scan.py --target {target} --output-dir {output}
```

扫描完成后，提取关键信息供后续步骤使用：
- `open_ports`：所有开放端口列表
- `http_ports`：HTTP 服务端口（用于 Web 测试）
- `ssl_ports`：SSL/TLS 端口（用于 SSL 审计）
- `ssh_port`：SSH 端口（用于认证测试）
- `ftp_port`：FTP 端口（用于认证测试）

向用户报告端口扫描结果。

---

## 第 4 步：漏洞扫描 + Web 枚举 + SSL（最多 5 Agent 并行）

根据第 3 步发现的服务，**在同一条消息中**派出 Agent：

### Agent-Vuln-Nuclei（始终执行）
```
目标：对 {target} 执行 Nuclei 漏洞模板扫描
上下文：渗透测试第 4 步，基于端口扫描发现的服务进行漏洞匹配
范围：使用 nuclei 官方模板库，限速 50 req/s
规范：使用 {scripts} 目录下的脚本
产出：执行命令并返回发现的漏洞列表

执行：
cd {scripts} && uv run pentest_vuln.py --target {target} --mode nuclei --output-dir {output}
```

### Agent-Vuln-NSE（始终执行）
```
目标：对 {target} 的开放端口执行 Nmap 漏洞脚本扫描
上下文：渗透测试第 4 步，使用 nmap 内置 NSE 漏洞检测脚本
范围：仅 --script vuln，不执行 exploit 脚本
产出：执行命令并返回发现的漏洞列表

执行：
cd {scripts} && uv run pentest_vuln.py --target {target} --mode nse --ports {open_ports} --output-dir {output}
```

### Agent-Web-Dir（仅 HTTP 端口存在时）
```
目标：对 {target} 的 Web 服务执行目录枚举
上下文：渗透测试第 4 步，发现隐藏路径和敏感文件
范围：目录枚举，不修改任何数据
产出：执行命令并返回发现的路径列表

执行：
cd {scripts} && uv run pentest_web.py --target {web_url} --mode dir --output-dir {output}
```

### Agent-SSL（仅 SSL/TLS 端口存在时）
```
目标：对 {target} 执行 SSL/TLS 安全审计
上下文：渗透测试第 4 步，检查证书和加密配置
范围：SSL/TLS 握手分析，不攻击
产出：执行命令并返回 SSL 审计结果

执行：
cd {scripts} && uv run pentest_ssl.py --target {target} --port {ssl_port} --output-dir {output}
```

### Agent-CVE-Research（始终执行）
```
目标：搜索第 3 步发现的服务版本对应的 CVE
上下文：渗透测试第 4 步，端口扫描已发现以下服务和版本：{services_versions}
范围：WebSearch 搜索公开 CVE 数据库
产出：返回每个服务的已知 CVE 列表和利用条件

对每个 {service} {version} 组合，使用 WebSearch 搜索：
1. "{service} {version}" CVE exploit
2. 在搜索结果中重点关注 CVSS >= 7.0 的高危漏洞
```

---

## 第 5 步：Web 深度测试（2 Agent 并行）

**仅当第 4 步 Agent-Web-Dir 发现了 Web 路径时执行。**

### Agent-Web-SQLi
```
目标：对 {target} 的 Web 应用进行 SQL 注入探测
上下文：渗透测试第 5 步，目录枚举已发现以下路径：{discovered_paths}
范围：仅检测注入点，禁止数据提取（sqlmap --technique=BEU, 无 --dump）
规范：使用 {scripts} 目录下的脚本
产出：执行命令并返回发现的注入点

执行：
cd {scripts} && uv run pentest_web.py --target {web_url} --mode sqli --output-dir {output}
```

### Agent-Web-XSS
```
目标：对 {target} 的 Web 应用进行 XSS 反射探测
上下文：渗透测试第 5 步，使用无害探针检测反射点
范围：发送无害标记 <dwy-xss-test>，不执行真实 XSS payload
规范：使用 {scripts} 目录下的脚本
产出：执行命令并返回发现的 XSS 反射点

执行：
cd {scripts} && uv run pentest_web.py --target {web_url} --mode xss --output-dir {output}
```

---

## 第 6 步：认证测试

脚本内部 SSH / FTP / HTTP 三个服务并发执行,FTP 的匿名探测与 hydra 弱密码并发,HTTP 的登录路径探测与默认凭据尝试也都是异步并发。

**执行前向用户确认：**

```
认证测试将尝试常见弱密码（最多 20 组），可能触发目标的安全防护。
发现的服务：SSH({ssh_port}), FTP({ftp_port}), HTTP({http_ports})
是否执行？(y/n)
```

用户同意后：

```bash
cd {scripts} && uv run pentest_auth.py --target {target} --output-dir {output} --services ssh,ftp,http
```

用户拒绝 → 跳过此步。

---

## 第 7 步：漏洞验证与利用评估

读取 `{output}` 下所有 JSON 结果，对 Critical 和 High 级别的漏洞进行验证：

1. 分析每个高危漏洞的详细信息
2. 使用 WebSearch 搜索该漏洞的公开 PoC 和利用方式
3. 评估是否可实际利用获取服务器控制权
4. **仅做到验证漏洞确实存在为止**，不执行实际利用

对每个高危漏洞输出评估结论：
- **已确认可利用** — 有成熟 PoC，理论上可获取 shell/控制权
- **可能可利用** — CVE 存在但需要特定条件
- **信息泄露** — 不直接导致控制权获取但构成风险

**如果发现可获取控制权的漏洞，立即告警：**

```
=============================================================
  !! 安全告警 — 可获取服务器控制权 !!
=============================================================

漏洞: {vuln_title} (CVE-XXXX-XXXX)
CVSS: {score}
评估: 存在公开 PoC，攻击者可利用此漏洞获取服务器控制权

!! 此处仅做告警，未执行实际利用 !!

建议立即修复。
=============================================================
```

---

## 第 8 步：报告生成

```bash
cd {scripts} && uv run pentest_report.py --input-dir {output} --output {output}/report.md
```

报告包含：基本信息、执行摘要、目标概况、漏洞详情、SSL 审计、修复优先级、免责声明。

---

## 第 9 步：安全告警与总结

向用户展示最终结果：

1. **按严重性分级展示所有发现**（Critical → High → Medium → Low）
2. **给出修复优先级建议**
3. **告知报告位置**：`{output}/report.md`
4. **如果发现 Critical 级漏洞**，强烈建议立即修复并重新测试

---

## 安全保障

### 脚本内置的安全限制

- `executor.py` 仅允许执行 8 个预定义工具命令（白名单）
- `executor.py` 拦截危险参数（`--os-shell`, `--dump-all`, `--file-write` 等）
- 所有命令 `shell=False`，参数列表传入，防止命令注入
- 单次扫描最大超时 300 秒
- 认证测试每服务最多 20 次尝试
- sqlmap 禁止 Stacked Queries（`--technique=BEU`）
- hydra 找到第一个弱密码即停止（`-f`）

### 禁止事项

- **禁止**在未经用户同意的目标上执行任何扫描
- **禁止**执行任何 exploit（Metasploit、手写 exploit、PoC 执行）
- **禁止**在目标服务器上植入代码、webshell、后门
- **禁止**提取目标数据库中的实际数据
- **禁止**进行 DoS/DDoS 测试
- **禁止**修改目标系统的任何配置或文件
- **禁止**使用社会工程学手段
- **禁止**绕过脚本的安全限制（SAFETY_LIMITS）
- **禁止**将发现的漏洞详情（PoC/exploit 细节）输出给用户以外的人

### 降级策略

工具不可用时，脚本自动降级：
- nuclei 不可用 → 仅用 nmap NSE 扫描
- gobuster/ffuf 不可用 → 用内置常见路径列表 + httpx 探测
- sqlmap 不可用 → 用基础 HTTP SQL 错误探针
- testssl.sh 不可用 → 用 Python ssl 模块基础检测
- hydra 不可用 → 跳过暴力认证测试
- whatweb 不可用 → 用 HTTP 头分析识别技术栈
