verygoodsecbadsec/cdnunmasker
GitHub: verygoodsecbadsec/cdnunmasker
一款通过九种侦察技术交叉验证并加权评分,揭示隐藏在 CDN 背后的真实源站 IP 的自动化侦察脚本。
Stars: 0 | Forks: 0
# CDN-Unmasker
大多数现代目标都隐藏在 Cloudflare、Akamai、Fastly 或 AWS CloudFront 背后。当你扫描它们时,你扫描的是 CDN 边缘节点——而不是实际的服务器。CDN-Unmasker 串联了九种侦察技术,过滤掉 CDN 地址空间,并根据有多少独立信号指向该候选 IP 来对其进行评分。
```
$ ./cdn_unmasker.sh example.com --report --nmap
[*] CDN Unmasking v3.4 for example.com
[*] Output: recon_example.com_20240812_143022
[+] CDN ranges saved (312 entries).
[+] 847 passive subdomains collected.
[+] 23 subdomains from DNS brute-force.
[+] 4 vhosts discovered.
[+] Historical IPs: 185.220.101.47 37.48.89.12
[+] Candidate origin IPs (weighted):
185.220.101.47 7 historical_dns,ssl_san,spf,asn_mismatch
37.48.89.12 3 historical_dns,asn_mismatch
[+] All data in recon_example.com_20240812_143022
```
## 工作原理
CDN-Unmasker 按顺序运行九个阶段,每个阶段的结果都会输入到最终的评分环节。
| 阶段 | 技术 | 工具 |
|-------|-----------|-------|
| 1 | 被动子域名枚举 | `subfinder`、`assetfinder`、`crt.sh` |
| 2 | 主动 DNS 暴力破解 | `ffuf` + SecLists 11万词表 |
| 3 | 虚拟主机暴力破解 | `gobuster` vhost 模式 |
| 4 | Whois 查询 | `whois`(并行,限速) |
| 5 | DNS 解析 (A/AAAA/CNAME) | `dig`(并行) |
| 6 | 历史 DNS 记录 | HackerTarget API + crt.sh 时间线 |
| 7 | SSL 证书检查 | `openssl` — SAN IP 提取 |
| 8 | CDN 绕过自动检查 | `cloudrip.py` |
| 9 | 证据汇总与评分 | `grepcidr` + 加权评分 |
所有已解析的 IP 都会与实时汇总的 CDN 范围列表(Cloudflare、Akamai、Fastly、AWS CloudFront、Azure)进行比对过滤。剩下的 IP 将根据指向它的独立证据源数量进行评分。
## 评分系统
每个候选 IP 都会根据识别出它的信号获得一个加权分数。分数越高 = 它是真实源站 IP 的置信度越高。
| 来源 | 权重 | 理由 |
|--------|--------|-----------|
| `historical_dns` | **3** | 最强信号。历史 A 记录反映了服务器在采用 CDN *之前*所在的位置——该 IP 大概率没有改变。 |
| `ssl_san` | **2** | SSL 主题备用名称(SAN)属于基础设施记录。开发人员在迁移到 CDN 背后时经常忘记更新它们,从而泄露了真实的 IP。 |
| `spf` | **2** | SPF 记录经常暴露同一基础设施上的邮件服务器 IP。邮件很少通过 CDN 路由。 |
| `asn_mismatch` | **1** | 弱信号。解析到非 CDN ASN 的 IP 虽然可疑,但小型托管商可能会在此处产生误报。 |
| `passive_subdomain` | **1** | 直接解析并绕过 CDN 的子域名。这在预发布环境和内部服务中很常见。 |
输出示例:
```
IP Score Sources
185.220.101.47 7 historical_dns,ssl_san,spf,asn_mismatch
37.48.89.12 3 historical_dns,asn_mismatch
203.0.113.42 2 ssl_san
```
在多个独立来源中获得 5+ 分的 IP 是高置信度的源站候选者。如果 IP 仅仅因为 ASN 不匹配而得 1 分,则在采取进一步行动之前需要进行验证。
## 安装说明
### 1. 克隆仓库
```
git clone https://github.com/verygoosecbadsec/cdnunmasker.git
cd cdn-unmasker
```
### 2. 安装依赖
**Go 工具:**
```
go install github.com/projectdiscovery/subfinder/v2/cmd/subfinder@latest
go install github.com/tomnomnom/assetfinder@latest
go install github.com/projectdiscovery/httpx/cmd/httpx@latest
go install github.com/ffuf/ffuf/v2@latest
go install github.com/OJ/gobuster/v3@latest
```
**系统工具:**
```
# Debian / Ubuntu
sudo apt install jq whois dnsutils openssl grepcidr nmap curl python3
**CloudRip:**
```bash
git clone https://github.com/staxsum/CloudRip.git
cp CloudRip/cloudrip.py .
```
### 3. 下载词表
```
wget https://raw.githubusercontent.com/danielmiessler/SecLists/master/Discovery/DNS/subdomains-top1million-110000.txt
```
### 4. 验证安装
```
chmod +x cdn_unmasker.sh
./cdn_unmasker.sh --help
```
## 使用说明
```
./cdn_unmasker.sh [--report] [--nmap]
```
| 标志 | 描述 |
|------|-------------|
| `--report` | 在输出目录中生成包含完整发现表格的 `REPORT.md` |
| `--nmap` | 分析后对评分排名前 5 的候选者运行 `nmap -sV` |
**基本扫描:**
```
./cdn_unmasker.sh example.com
```
**带报告和服务检测的全面扫描:**
```
./cdn_unmasker.sh example.com --report --nmap
```
**自定义词表或 cloudrip 路径:**
```
WORDLIST=/path/to/wordlist.txt CLOUDRIP_SCRIPT=/opt/cloudrip.py ./cdn_unmasker.sh example.com
```
## 输出结构
每次运行都会创建一个带时间戳的目录:
```
recon_example.com_YYYYMMDD_HHMMSS/
├── cdn_ranges.txt # Aggregated CDN CIDR ranges used for filtering
├── passive_subs.txt # Subdomains from subfinder + assetfinder + crt.sh
├── bruteforce_subs.txt # Subdomains from ffuf DNS brute-force
├── vhosts.txt # Virtual hosts from gobuster
├── all_discovered.txt # Deduplicated union of all above
├── current_ips.txt # All IPs resolved from DNS records
├── possible_origin_ips_raw.txt # Non-CDN IPs (post grepcidr filter)
├── possible_origin_ips_scored.txt # Final candidates with weighted scores ← key file
├── all_candidates.txt # All IPs fed into ASN analysis
├── spf_cidrs.txt # SPF CIDRs extracted from DNS TXT records
├── asn_work.txt # Raw ASN lookup results
├── whois/ # Per-host whois output
├── dns/ # Per-host A, AAAA, CNAME records
├── ssl/ # Per-host SSL certificate text dumps
├── historical/
│ ├── historical_example.com_ips.txt # Historical IPs from HackerTarget
│ └── crtsh_timeline.txt # Certificate issuance timeline
├── cloudrip_results.txt # CloudRip findings
└── REPORT.md # Markdown report (if --report was used)
```
## API 限制与外部服务
| 服务 | 限制 | 备注 |
|---------|-------|-------|
| HackerTarget | 50 次查询/天(免费) | 用于历史 DNS。可设置 `ST_API_KEY` 以使用 SecurityTrails 作为替代方案。 |
| crt.sh | 无硬性限制 | 高负载下可能会变慢。结果缓存在 `crtsh.txt` 中。 |
| Team Cymru whois | 限速 | 脚本使用 `-P 3` 并在查询之间设置 0.5 秒的延迟,以保持在合理使用范围内。 |
| Cloudflare / Fastly / AWS | 无限制 | 每次运行时都会重新获取 IP 范围文件。 |
**Azure CDN 范围**作为静态列表包含在内。Microsoft 每周在 `aka.ms/azureipranges` 发布更新的范围——请定期更新 `aggregate_cdn_ranges()` 中的 heredoc 以确保准确性。
## 已知限制
- **双向 TLS 和证书固定**将阻止对某些目标进行 SSL SAN 提取。
- **SPF 扩展**涵盖了一级 `include:` 指令。深度嵌套的 SPF 链(例如 `include: → include: → ip4:`)将无法被完全解析。
- **ASN 不匹配**会对托管在小型或地区性提供商(其 ASN 不在 `KNOWN_CDN_ASNS` 中)上的目标产生误报。请将得分为 1 的候选者视为线索,而非最终结论。
- **CloudRip** 依赖于外部维护的工具。如果其标志接口发生变化,第 8 阶段可能会静默失败(会被阶段跟踪机制捕获)。
- 本脚本仅适用于**授权的渗透测试**。对你没有测试权限的目标运行本工具是非法的。
## 法律声明
本工具仅用于 CTF 竞赛、安全研究和受控测试环境中的授权操作。在大多数司法管辖区,在你不拥有或未获得明确授权监控的网络上抓取流量是非法的。作者对未经授权的使用不承担任何责任。
## 许可证
- 本项目基于 MIT 许可证授权——有关详细信息,请参见 [LICENSE](LICENSE) 文件。
标签:Akamai, ASN交叉验证, AWS CloudFront, CDN溯源, Cloudflare, DNS历史记录, DNS解析, GitHub, IP发现, MITRE ATT&CK, SPF记录检查, SSL证书解析, Whois查询, 主动侦察, 子域名爆破, 安全工具库, 应用安全, 开源项目, 插件系统, 数据展示, 日志审计, 目标定位, 真实IP获取, 红队, 绕过CDN, 网络安全, 被动侦察, 资产测绘, 逆向工具, 隐私保护, 黑帽SEO