当C2藏在CDN后面:域前置在真实入侵中的应急响应思路

当C2藏在CDN后面:域前置在真实入侵中的应急响应思路

在应急排查现场,大家最怕的一类情况不是“清晰的恶意域名或 IP”,而是那种表面看起来一切正常的 HTTPS 流量 —— 仿佛业务流量,背后却藏着恶意的 C2 控制信道。当我们看到流量是云厂商 CDN、证书合法、访问域名看起来也没有问题的时候,应急人员的第一反应往往是:

“不会吧,这些都是正经的 CDN 域名,怎么可能是恶意的?”

但事实证明,攻击者正是利用了 CDN 这种“可信流量”的特性来隐藏自己的控制通道,这种技术被称为域前置(domain fronting)。

什么是域前置

简单来说,域前置就是借助 CDN 的路由机制,让一个看起来“正常”的 HTTPS 请求,去连接真正的恶意 C2 后端。

在 HTTPS 握手阶段,客户端会在 TLS 协议里发送一个 SNI 字段,这个字段通常会告诉服务端“我想连这个域名”。攻击者在这里填入一个可信域名,通常是 CDN 加速的域名;但接下来在 HTTP 层的 Host 头中,却填入了一个真正的 C2 控制域名。CDN 解包后就会根据 Host 字段把流量送到那个恶意源站。

这种技术本来被一些隐私项目用于绕过审查,但因为它可以让恶意流量混在高信誉 CDN 流量中,很快也被攻击者用来隐藏 C2 通道。

域前置在真实攻击中的案例

在另一起真实入侵排查中,我们遇到的域前置场景更加“隐蔽”。最初的线索来自一台内部 Windows 跳板机,这台机器没有对外业务,也几乎没有人为上网行为,但却在日志中显示,每隔60s固定时间就会主动发起 HTTPS 连接。

网络侧第一眼看过去完全正常:目的 IP 属于主流 CDN,TLS 握手没有异常,证书链合法,SNI 显示的是一个非常常见、日常访问频率极高的网站域名。

用 Wireshark 抓包之后,情况反而更“干净”了——除了 ClientHello 里的 SNI,后续流量全部加密,看不到任何 HTTP 内容,也看不到真实的 Host 字段。如果只停留在这一层,很容易得出“这是正常 HTTPS 流量”的结论。

但真正的问题在于,这台跳板机本身并不存在访问该网站的合理业务场景,而且发起连接的并不是浏览器或系统组件,而是一个独立的、无签名的可执行文件。为了确认判断,我们随后在主机上通过 MITM 的方式对 HTTPS 流量进行解密,这一步直接揭开了伪装:TLS SNI 依旧是那个正常网站,但在解密后的 HTTP 请求中,Host 字段已经变成了完全不同的域名,请求路径和参数结构高度固定,明显不属于任何正常业务。

这意味着,对外看起来是一次“访问常见网站的 HTTPS 请求”,实际上却通过 CDN 转发,最终落到了攻击者控制的 C2 后端——这是一个非常典型、但在抓包层面几乎无法直接看穿的域前置通信。

为什么域前置难以排查?

这里需要特别说一句,也是很多人在第一次遇到域前置时会踩的坑。在这类案例中,在主机上用 Wireshark 直接抓包,基本是抓不到什么“实锤”的。原因其实很简单:整个通信过程是标准的 HTTPS。

TLS 握手阶段能看到的,只有:

  • 目标 IP
  • 端口
  • TLS ClientHello
  • SNI:一个看起来完全正常的域名

只要攻击者选择的是一个“足够干净”的前置域名,比如常见的网站或 CDN 域名,那么在抓包工具里看到的画面,几乎和正常业务一模一样。

真正关键的那个 HTTP Host 头,是在 TLS 握手完成之后才出现的,而这一部分内容已经被加密了。也就是说,在不做 TLS 解密、不做中间人的情况下:

  • 只能看到 SNI
  • 看不到真实的 Host
  • 更看不到 CDN 最终转发到的后端 C2

这也是为什么很多应急现场会卡在一个很尴尬的位置:主机行为已经很可疑,但抓包看起来“一切正常”如果只靠 Wireshark 去盯流量,很容易得出一个错误结论:
“网络侧没问题,可能不是 C2。”

而实际上,问题恰恰藏在 TLS 加密之后。

排查思路:中间人攻击解密https流量

既然在确认仅靠抓包无法还原通信细节之后,我们最终选择在主机侧引入中间人方式,对这条 HTTPS 通道进行解密,从而拿到真实的Host。

具体做法并不复杂:在受控主机上部署一个本地代理,将其作为系统 HTTP/HTTPS 的出口,同时向系统信任链中安装自签 CA 证书,使得所有经过代理的 TLS 会话都可以被正常解密。这样一来,原本在 TLS 握手之后被完全加密的 HTTP 请求就变得可见了,可以简单理解类似burp抓包的过程。

在测试过程过程中可以先用Proxifier现将域前置的进程流量强制走代理经过mitm服务器。

解密之后的结果非常直观——TLS 层的 SNI 依旧指向一个看起来完全正常的前置域名,但在 HTTP 请求头中,Host 字段已经明确暴露为另一个完全不同的域名,而这个域名正是 CDN 实际转发流量的目标地址。也正是通过这一点,我们才能确认此前看到的“正常 HTTPS 流量”,实际上是利用 CDN 作为跳板的域前置 C2 通信;如果不通过中间人解密,这一层真实的控制目标在网络层面是无法被直接观测到的。

工程化落地,域前置一键检测工具

这个工具的思路其实不复杂,甚至有点粗暴:

  • 在主机上启动一个本地 MITM Proxy
  • 自动往系统里安装一个受信任的 CA 证书
  • 接管系统的 HTTP / HTTPS 流量
  • 对每一条请求,直接对比两件事:
    • TLS SNI
    • HTTP Host
  • 同时将请求的进程名和PID关联出来

如果这两者不一致,而且无法用正常业务解释,那在应急的场景下,就已经是非常强的信号了。

而Linux上的实现思路则是配合iptables让进程经过透明代理后比对SNI和HOST。

通过工具解决三个在实战应急场景下的问题:

  1. 不用改现有网络架构,不依赖 NDR / WAF / 解密网关,直接在受控主机上验证。
  2. 证据非常直观,SNI 和 Host 摆在一起,不需要复杂解释。
  3. 适合快速定性,一键运行快速定位异常请求的进程信息

这个方法的价值不在“技术多高深”,而在于它非常贴合应急场景

下载链接:DomainFrontingDetector-windows-amd64.zip

赞赏

微信赞赏支付宝赞赏

Zgao

愿有一日,安全圈的师傅们都能用上Zgao写的工具。

发表评论