mmarting/unwaf
GitHub: mmarting/unwaf
一款用于被动发现WAF/CDN背后真实源站IP的Go工具,整合多种发现方法并通过加权评分验证候选IP。
Stars: 175 | Forks: 21
# Unwaf
[](https://go.dev/)
[](https://www.gnu.org/licenses/gpl-3.0)
Unwaf 是一个 Go 工具,旨在利用**被动技术**帮助识别 WAF 绕过方法。它通过结合多种发现方法,并通过 HTML 相似度比较、SSL 证书指纹识别和 HTTP header 分析来验证候选 IP,从而自动化发现 WAF/CDN 背后真实源 IP 的过程。
Unwaf 自动化了我在这篇 LinkedIn 帖子中解释的步骤:[Passive WAF bypassing](https://www.linkedin.com/posts/martinmarting_bugbounty-bugbountytips-pentesting-activity-7217385665729093632-oZEP)
**当前版本:3.0.0** — 版本历史请参阅 [CHANGELOG.md](CHANGELOG.md)。
## 目录
- [工作原理](#how-it-works)
- [发现方法](#discovery-methods)
- [验证方法](#verification-methods)
- [安装](#installation)
- [使用方法](#usage)
- [选项](#options)
- [示例](#examples)
- [配置](#configuration)
- [作者](#author)
- [许可证](#license)
## 工作原理
1. **动态 WAF CIDRs** — 获取实时 Cloudflare IP 范围,并与硬编码的 WAF/CDN 范围(包括 IPv6)结合。
2. **WAF 确认** — 解析域名当前的 A 记录,检查它们是否位于已知的 WAF/CDN 范围内,并通过 HTTP headers 进行指纹识别。
3. **Favicon Hashing** — 获取 favicon.ico 并生成 MD5、SHA256 和 MMH3 (Shodan) 哈希值。
4. **IP 发现** — 运行所有启用的方法(最多 15 个来源)以收集候选源 IP。
5. **过滤** — 丢弃属于已知 WAF/CDN 范围的 IP 以及与域名当前 DNS 解析结果匹配的 IP。
6. **端口扫描** — 并发检查候选 IP 的 8 个常用 Web 端口,并显示进度条。
7. **源站验证** — 对于每个 Web 服务器:
- 获取 HTML(直接 IP + Host-header 注入)并与参考页面进行比较
- 比较 TLS 端口上的 SSL 证书指纹
- 比较 HTTP 响应 headers
- 计算总体得分(60% HTML + 25% 证书 + 15% headers ± 状态)
8. **邻居扫描**(可选)— 将确认的绕过 IP 扩展到 /24 子网并扫描邻居 IP。
9. **ASN 查询** — 识别确认绕过 IP 的 ASN 和组织。
10. **结果** — 报告高于阈值的匹配项,包含得分、ASN 信息和 `curl` 验证命令。
## 发现方法
| 方法 | 类型 | 描述 |
|---|---|---|
| SPF records | Free | 从 `ip4:`/`ip6:` SPF 机制中提取 IP |
| MX records | Free | 解析邮件服务器主机名(跳过 Google/Microsoft 等)|
| Subdomain probing | Free | 解析 30+ 个常见子域名(mail, dev, staging, cpanel, origin 等)|
| Certificate Transparency | Free | 查询 crt.sh 获取所有子域名,并解析为非 WAF IP |
| AlienVault OTX | Free | 被动 DNS 记录(可选 API 密钥可提高速率限制)|
| RapidDNS | Free | 通过 HTML 抓取进行子域名枚举 |
| HackerTarget | Free | 主机搜索 API(50 次/天)|
| Wayback Machine | Free | 通过 CDX API 从存档 URL 中提取主机名 |
| WAF detection | Free | 通过 HTTP headers 指纹识别 WAF 供应商 |
| Favicon hashing | Free | 生成 MD5、SHA256 和 MMH3 哈希值,用于 Shodan/Censys 搜索 |
| Shodan host search | API (free tier) | 通过 SSL 证书 CN、主机名和 favicon 哈希进行搜索(搜索需要会员资格)|
| SecurityTrails history | API (free tier) | 历史 DNS A 记录(免费 50 次/月)|
| ViewDNS history | API (free tier) | 历史 DNS A 记录(免费 250 次请求)|
| Censys SSL search | API (paid) | 查找展示与域名匹配的 SSL 证书的主机 |
| DNSDB/Farsight | API (free tier) | 通过 NDJSON API 获取历史 DNS 记录(社区版:500 次查询/月)|
## 验证方法
| 方法 | 权重 | 描述 |
|---|---|---|
| HTML similarity | 60% | 基于差异(Diff-based)的文本与参考页面对比 |
| SSL certificate | 25% | 序列号 (50%), CN 匹配 (25%), SAN 重叠 (25%) |
| HTTP headers | 15% | Server, X-Powered-By, 和 Set-Cookie 名称对比 |
| Status code | ±5-20% | 匹配奖励,成功/错误不匹配惩罚 |
## 安装
```
go install github.com/mmarting/unwaf@latest
```
## 使用方法
```
unwaf -h
```
## 选项
| 标志 | 长标志 | 描述 | 默认值 |
|------|-----------|-------------|---------|
| `-d` | `--domain` | 要检查的域名 | **(除非指定 `-l`,否则为必填)** |
| `-s` | `--source` | 要对比的源 HTML 文件 | — |
| `-c` | `--config` | 配置文件路径 | `$HOME/.unwaf.conf` |
| `-t` | `--threshold` | 相似度阈值百分比 | `60` |
| `-w` | `--workers` | 并发工作线程数 | `50` |
| `-v` | `--verbose` | 启用详细输出 | `false` |
| `-q` | `--quiet` | 静默模式:仅输出绕过 IP | `false` |
| | `--timeout` | HTTP 超时时间(秒)| `10` |
| | `--rate-limit` | 每秒最大 HTTP 请求数,0=无限制 | `0` |
| | `--proxy` | 代理 URL(`http://` 或 `socks5://`)| — |
| | `--scan-neighbors` | 扫描已确认绕过 IP 的 /24 邻居 | `false` |
| | `--json` | 以 JSON 格式输出结果 | `false` |
| `-l` | `--list` | 包含待检查域名的文件,每行一个 | — |
| `-o` | `--output` | 将结果写入文件 | — |
| | `--version` | 打印版本信息并退出 | — |
| `-h` | `--help` | 显示帮助信息 | — |
## 示例
检查域名(仅使用免费方法,无需 API 密钥):
```
unwaf -d example.com
```
裸域名和完整 URL 均可:
```
unwaf -d https://example.com/path
```
使用手动保存的 HTML 文件进行检查(当 WAF 阻止该工具时很有用):
```
unwaf -d example.com -s original.html
```
降低相似度阈值以捕获部分匹配:
```
unwaf -d example.com -t 40
```
增加并发以加快扫描速度:
```
unwaf -d example.com -w 100
```
详细模式,查看每一个解析的子域名/IP:
```
unwaf -d example.com -v
```
用于自动化的静默模式 — 仅输出 IP,每行一个:
```
unwaf -q -d example.com
```
用于自动化的 JSON 输出:
```
unwaf -d example.com --json
```
带域名列表的批量模式:
```
unwaf -l domains.txt --json -o results.json
```
使用代理(Tor、Burp 等):
```
unwaf -d example.com --proxy socks5://127.0.0.1:9050
```
扫描绕过 IP 的 /24 邻居:
```
unwaf -d example.com --scan-neighbors
```
将请求速率限制为 2 次/秒,超时时间为 5 秒:
```
unwaf -d example.com --rate-limit 2 --timeout 5
```
### 通过管道传递给其他工具
```
# 导入 nuclei
unwaf -q -d target.com | nuclei -l - -t waf-bypass.yaml
# 导入 httpx
unwaf -q -d target.com | httpx -silent
# 批量侦察
cat domains.txt | while read d; do unwaf -q -d "$d" | sed "s/^/$d,/"; done > results.csv
# JSON + jq
unwaf -d target.com --json | jq '.bypasses[].ip'
```
## 配置
首次运行时,Unwaf 会使用以下模板创建 `$HOME/.unwaf.conf`:
```
# Unwaf 配置文件 — 可选发现方法的 API 密钥
# 免费方法 (SPF, MX, crt.sh, subdomains, OTX, RapidDNS, HackerTarget, Wayback) 无需任何密钥即可工作。
# ViewDNS.info — DNS 历史 (250 次免费请求,无需信用卡)
viewdns=""
# SecurityTrails — DNS 历史
securitytrails=""
# Censys — SSL 证书搜索 (需要付费许可证)
censys_token=""
censys_org_id=""
# AlienVault OTX — 被动 DNS (可选,可提高速率限制)
otx_api_key=""
# Shodan — 通过 SSL 证书、主机名、favicon 哈希进行主机搜索
shodan_api_key=""
# DNSDB/Farsight — 历史 DNS 记录 (社区版:每月 500 次免费查询)
dnsdb_api_key=""
```
## 作者
**Martín Martín**
- [网站](https://mmartin.me/)
- [LinkedIn](https://www.linkedin.com/in/martinmarting/)
- [GitHub](https://github.com/mmarting)
## 许可证
根据 [GPL v3 许可证](LICENSE.md)分发。
标签:C++17, C2日志可视化, CDN绕过, Favicon哈希, Go语言, HTML相似度, HTTP头分析, IP发现, SSL证书指纹, WAF绕过, 安全工具库, 实时处理, 密码管理, 底层编程, 指纹识别, 数据展示, 数据统计, 日志审计, 源站IP获取, 程序破解, 端口扫描, 红队, 网络安全, 被动侦察, 隐私保护