红队隐藏恶意流量的小技巧
Domain fronting域名前置攻击
什么是域前置
Domain Fronting基于HTTPS通用规避技术,也被称为域前端网络攻击技术。这是一种用来隐藏Metasploit,Cobalt Strike等团队控制服务器流量,以此来一定程度绕过检查器或防火墙检测的技术,如Amazon ,Google,Akamai 等大型厂商会提供一些域前端技术服务。
攻击原理
在虚拟主机中搭建多个网站服务,为了方便我们区分它们,可以 IP+Port名称 等方式去访问它们,但是如果是SSL/TLS的话。根据HTTPS的工作原理,浏览器在访问一个HTTPS站点时,先与服务器建立SSL连接。
建立连接的第一步就是请求服务器的证书。而服务器在发送证书时,是不知道浏览器访问的是哪个域名的,所以不能根据不同域名发送不同的证书。因此就引入一个扩展叫SNI,SNI是为了解决一个服务器使用多个域名和证书的SSL/TLS扩展,做法就是在 Client Hello 中补上 Host 信息。
域前置的关键思想是在不同的通信层使用不同的域名,是一种隐藏连接真实端点来规避互联网审查的技术。在应用层上运作时,域前置使用户能通过HTTPS连接到被屏蔽的服务,而表面上像在与另一个完全不同的站点通信。
此技术的原理为在不同通信层使用不同的域名。在明文的DNS请求和TLS服务器名称指示(SNI)中使用无害的域名来初始化连接,而实际要连接的被封锁域名仅在创建加密的HTTPS连接后发出,在Host头中携带了另一个恶意C2域名(Host头对于检查器是不可见的,但是对于接收HTTPS请求的前端服务器是可见的)。
环境配置
- c2 服务器:cs 4.3
- 服务器端:Ubuntu 22.04
- 客户端:kali 2023.2
- 靶机:win10
注册申请相关
域名
域名可以在硅云上购买,官网链接:https://www.vpsor.cn/
由于我们只是进行域前置攻击的实验,随便挑一个免费的就可以。
注册好后跳转到域名控制面板,添加上www
主机名的解析记录(即www.rev1.fun
)
然后我们访问一下,解析成功
VPS
在DK盾买的香港服务器
CDN
CDN就用Cloudfare的,然后点击主页的添加站点,把根域名添加进去
选择免费的计划即可,点击继续提示要更改权威服务器名称
CDN绑定域名
回到硅云的域名控制面板,找到修改域名DNS处后将上面分配的服务器名称复制上去
等个几分钟Cloudfare会发邮件给我们,表示已经绑定上了他的权威名称服务器,说明可以添加DNS解析记录了
设置解析配置
选中导航栏的DNS,添加A记录为我们的VPS的IP
然后点击概述界面的快速入门指南
将重写HTTPS功能关掉
继续关闭始终使用HTTPS,最后点击完成即可
启用开发模式来禁用缓存
SSL证书加密选择为灵活模式
测试
访问域名成功解析HTTPS
我们在本地ping一下域名,会发现ip不是我们vps的
查ip发现是Cloudflare的,成功给我们域名套上CDN
C2服务器配置 流量混淆
由于Cobalt Strike上线的流量包非常明显,很容易被防守方捕获数据包并溯源,所以我们配置证书以及profile文件来实现流量混淆。
证书配置
回到cloudflare找到SSL证书的源服务器
选择ECC加密生成私钥
点击创建,然后继续往下得到证书和私钥文件内容
我们分别导入并修改文件名为www.rev1.fun.pem
和www.rev1.fun.key
,将创建的pem和key文件上传至cs文件夹下
1 | openssl pkcs12 -export -in www.rev1.fun.pem -inkey www.rev1.fun.key -out www.rev1.fun.p12 -name www.rev1.fun -passout pass:123456 |
最后会生成一个www.rev1.fun.store
文件。其中文件有个坑,cs的store的默认密码是123456所以我这边都保持一致免得出错。
profile文件配置
GitHub上有很多,根据cs不同版本来选即可。项目地址:https://github.com/threatexpress/malleable-c2
我这里用的是4.3版本,需要修改下面几个地方
https-certificate
打开下载好的jquery-Profile,找到https-certificate模块中的keystore
和password
,修改后把注释去掉
http-stager
修改http-stager 中的Host和Referer及Content-Type
1 | // server 中 Content-Type |
http-get
1 | // server 中 Content-Type |
http-post
1 | // server 中 Content-Type |
在这个Profile中,我们请求的URI是以.js结尾的,Cloudflare作为一个CDN肯定要去缓存它,但这样的话请求就无法到达我们的CS服务器,自然也就无法上线了。使用开发模式并清除缓存(这个只能缓存两个小时)
测试
将修改的jquery-c2.4.3.profile 上传vps的cs文件夹下,在修改完成后,使用CS自带的c2lint对profile语法进行检查
1 | ./c2lint jquery-c2.4.3.profile |
Cobalt Strike上线
为了可以交互cs流量,先在服务器上关闭防火墙ufw
1 | sudo systemctl stop ufw |
然后启动服务端并使用我们刚刚修改的profile配置文件
1 | ./teamserver 156.238.233.68 root jquery-c2.4.3.profile |
在我们的攻击机kali启动客户端,进行连接
1 | ./start.sh |
创建HTTPS监听器添加上我们的C2服务器域名, 这边需要注意Cloudflare只支持监听以下端口:
- HTTP端口:80,8080,8880,2052,2082,2086,2095
- HTTPS端口:443,2053,2083,2087,2096,8443
注意:如果VPS是国内云主机,且注册的免费域名没有备案,则不能使用80、8080、443、8443端口提供服务,否则会被拦截提示备案才能访问。
创建好后生成后门程序,选择我们创建的监听器点击x64的payload
我们拿win10作为靶机,为了方便演示我们直接连上蚁剑上传后门程序
Cobalt Strike成功上线
我们再来看下靶机win10抓取的流量,注意域名被成功解析
由于是HTTPS的监听器,我们看不到http的流量并且https的流量是加密过的,那么我们可以再创建个HTTP监听器进行验证
注:域前置是跟HTTPS来进行配合的,这里只是方便我们验证是否成功隐藏我们C2服务器的域名。至于为什么和HTTPS配合,是因为除非逆向程序获取host头信息,否则无法获取到真实连接域名
重新创建个监听器,端口为2052
然后和之前一样生成后门程序,蚁剑上传后执行,成功上线
继续抓取下http流量,这里我们可以看到上线的cs流量包变成我们修改的profile文件,这样就可以避免默认流量特征被识别
并且查询IP为cloudflare运营商的,成功隐藏
参考文章
- https://bbs.sangfor.com.cn/forum.php?mod=viewthread&tid=71715
- https://www.cnblogs.com/0xl4k1d/p/15643269.html
- https://xz.aliyun.com/t/4509?time__1311=n4%2Bxni0Qi%3DdCq0KAq05DK32xmO8iDBjmDxmTID
- http://chen.oinsm.com/2022/05/15/cobaltstrike%E5%9F%9F%E5%89%8D%E7%BD%AE/
- https://fz1lin.com/2022/937989325/
- https://zone.huoxian.cn/d/733-aptcsc2-profilecdn
- https://paper.seebug.org/1349/