mmarting/unwaf

GitHub: mmarting/unwaf

一款用于被动发现WAF/CDN背后真实源站IP的Go工具,整合多种发现方法并通过加权评分验证候选IP。

Stars: 175 | Forks: 21

# Unwaf [![Go Version](https://img.shields.io/github/go-mod/go-version/mmarting/unwaf)](https://go.dev/) [![License: GPL v3](https://img.shields.io/badge/License-GPLv3-blue.svg)](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获取, 程序破解, 端口扫描, 红队, 网络安全, 被动侦察, 隐私保护