在看这篇文章前,建议具备CDN转发原理的相关知识储备,这样读起来可能会更轻松一些。
域前置的核心关键点是可信域名配合CDN节点转发流量,且在流量层面无法被检测。
如果没有可信域名那么域前置可能就只剩下防溯源这一项,当然如果CS-Profile编写的好也是可以维持一段时间的。
相比于云函数与OSS,他们本质上也是域前置,只不过通讯的域名已经被各大厂商标记,一旦客户端与服务端进行通信从而命中IOC
,则会迅速告警。
本篇搭建的域前置主要分为两大类别,分别为HTTPS和HTTP通信。
1、以HTTPS协议通讯的域前置基本在流量侧无任何特征且流量经过TLS加密无法分析。 2、以HTTP协议通讯的域前置在流量是可读没有加密的,需要通过编写Profile
来进行流量伪造,且同样会把我们的Host
暴露给审查者。
文章将重点介绍域前置的搭建过程,相关理论不做赘述,相关HTTPS域前置图文介绍:
在处理HTTPS请求时,CDN会首先将它解密,并根据HTTP Host的值做请求转发。
如果客户端想要访问一个非法网站forbidden.com,它可以使用一个CDN上的合法的域名allow.com作为SNI, 然后使用forbidden.com作为HTTP Host与CDN进行HTTPS通信。之后,CDN会将HTTP请求重新封装,并发往forbidden.com的源服务器。
这种情况下,客户端实际通信的对象是forbidden.com,但在流量监控设备看来,客户端是在与allow.com通信,即客户端将流量成功伪装成了与allow.com通信的流量。
Domain Fronting也有一些局限性。
Domain Fronting流量的一个显著特点是SNI和Host不相等。企业的防守方可以部署HTTPS流量解密设备,并对比流量中的SNI和Host是否相等,如果不相等则说明是该流量是Domain Fronting流量。这也是MITRE ATT&CK中建议的检测方式。
并且,随着该技术不断在真实网络攻击中被使用,云厂商也逐渐意识到了Domain Fronting的危害,目前Cloudflare、AWS CloudFront、Google Cloud CDN等厂商也都纷纷禁用了这种隐蔽通信方法。
在开始前,你需要具备以下条件:
一个域名(可有可无)
一台VPS(作为C2)
首先去互联网找几家CDN服务商,阿里云,腾讯云都可以,我这里使用华为云做演示。
在华为云CDN控制台页面添加自己的域名,节点选择 “中国大陆境外”,若域名已经备案可以选择中国大陆,这样的可信域名的质量就会更高。业务类型选择“全站加速”。
首次添加会提示要求进行验证,DNS解析验证或文件验证都可,这里我的域名以xxx.work进行演示,实战中最好注册一个无需实名的域名
将回源方式选择为 “协议跟随”,将回源地址选为 “源站IP”,将自己C2的HTTP和HTTPS的listener监听的端口分别填写在**“源站地址”和“回源端口”**上。
绑定好之后会分配一个CNAME地址
将缓存时间修改为0秒,也就是对页面数据不进行缓存,方便我们对受害者机器下发命令。若心疼自己的钱包,可以对某些目录进行缓存,具体请看官方文档。
访问控制里的User-Agent
白名单可以对我们指定的UA进行通信,防止蓝队进行反制或进一步分析。
配置好之后稍等3-5分钟等待CDN生效。之后复制CNAME,去ping一下会得到一个IP
对这个CNAME全国PING,会得到很多CDN节点的IP,随便找一个去反查 这里我以219.76.20.204
举例
通过反查的域名尽量去找一些高可信的域名,比如这里我选用**“X港ZF网”作为域前置的域名,这里要注意如果采用HTTPS加密,请确保域前置的站点HTTPS是合法的。**
若当前IP下没有高可信域名则去更换下IP继续重复此次步骤。若所有CDN节点下都没有可信域名,那么就换家CDN提供商。
添加HTTPS监听器,这里要注意HTTPS Port(C2)
与HTTPS Port(Bind)
是映射的关系,配置如下
HTTPS Hosts = 可信域名
HTTPS Host(Stager) = 可信域名
HTTPS Port(C2) = 443 (CDN端口)
HTTPS Port(Bind) = 43904(回源端口)
HTTPS Host Header = xxx.work(添加的域名)
打开CS的Web Log测试CDN是否能将流量转发成功,执行命令
curl "https://cloudvideo.news.gov.hk/test" -H "Host: xxx.work" -v -k
可以看到已经收到CDN转发来的请求
这里我们生成stagless的载荷
模拟上线,一定要是stagless,或者提取出shellcode进行分离加载也是可以
上线后wireshark抓包查看通信建立过程,可以看到全是TLSv1.2
套件加密,并且SNI
为可信域名
执行命令进行抓包
下发命令通信也是加密状态
查看DNS也是对可信域名进行请求
上传到微步沙箱查看通信域名是我们的可信域名,通信地址为华为云的CDN节点,完美隐藏我们的Host以及真实的C2服务器地址。
至此,HTTPS域前置配置结束。
最终通信的流程为:
受害者机器请求可信域名,可信域名解析到CDN厂商分配的CNAME ,CNAME解析到CDN节点服务器,CDN节点服务器根据我们配置的Host进行寻源,最后根据我们的回源策略将流量转发到我们的C2服务器。
整个通信过程暴露给审查者的只有可信域名和CDN节点,且流量无法进行分析。
没有域名的情况下必须要去寻找不需要验证域名解析权的CDN提供商,一些香港或者境外的厂商可能不会去验证,还有就是一些国内小型的CDN提供商。
找到之后添加我们想要伪造的域名,这里我以api.sisimanhua.com
为例,之所以选择这个域名是因为www.sisimanhua.com
同样绑定在这家CDN提供商,且我同时绑定api这个子域,则可以利用www.sisimanhua.com作为域前置,api.sisimanhua.com作为Host回源。
因为这次演示以HTTP协议通信,流量是明文的,所以我们尽量让充当域前置的域名和Host头的域名保持一致,或者是他的子域,这样可以大大增加可信程度,让审查者误以为我们和正常域名进行通信。
CS创建HTTP监听器如下
模拟上线后对通讯流量进行抓包可以看到请求域名为www.sisimanhua.com
,解析IP为CDN节点
通信流量Host为api.sisimanhua.com
,整个通信也是明文,同时这里我们使用profile对流量进行了一定的伪造
上传到微步沙箱进行分析,可以看到我们的通讯域名甚至是白名单,请求的url是api的子域
通信流程和HTTP的域前置是一样的,但通信过程会暴露给审查者可信域名、Host和CDN节点,会增加一定被发现的风险。
同时如果攻击者对api子域进行溯源,其实也是溯源不到的,因为这个域名没有DNS解析记录,但如果配置Host绑定是可以访问到的。
此篇文章的促成首先要感谢@风起
对域前置这方面的指导。
此文也算是冷饭热炒,关于域前置其实还有很多改进的地方,例如默认我们使用的HTTPS证书其实是不可信的,我们可以去伪造证书或者申请合法证书的方式进行加密。
关于域前置不懂的地方可以随时在后台进行私信或留言。
1、https://mp.weixin.qq.com/s/D9jA1a8oFdrvbOXerRat1g
2、https://mp.weixin.qq.com/s/8GBoKP3QWb0NpdllIi\_YCg
3、https://mp.weixin.qq.com/s/GpFT8bnOeyFCTtyS0yR3JA
4、https://mp.weixin.qq.com/s/39yJNEbu7Ya4VdlmjGVbRA
5、https://mp.weixin.qq.com/s/LGs\_gf5CIOaMJMQcIiQCOA
6、https://mp.weixin.qq.com/s/6WJUTKPgg9OgtKVkUbPucg
7、https://xlab.tencent.com/cn/2021/05/14/domain-borrowing/