0%

Domain fronting域名前置攻击

红队隐藏恶意流量的小技巧

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.pemwww.rev1.fun.key,将创建的pem和key文件上传至cs文件夹下

1
2
3
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

keytool -importkeystore -deststorepass 123456 -destkeypass 123456 -destkeystore www.rev1.fun.store -srckeystore www.rev1.fun.p12 -srcstoretype PKCS12 -srcstorepass 123456 -alias www.rev1.fun

最后会生成一个www.rev1.fun.store文件。其中文件有个坑,cs的store的默认密码是123456所以我这边都保持一致免得出错。

profile文件配置

GitHub上有很多,根据cs不同版本来选即可。项目地址:https://github.com/threatexpress/malleable-c2

我这里用的是4.3版本,需要修改下面几个地方

https-certificate

打开下载好的jquery-Profile,找到https-certificate模块中的keystorepassword,修改后把注释去掉

http-stager

修改http-stager 中的Host和Referer及Content-Type

1
2
3
4
5
6
// server 中 Content-Type
header "Content-Type" "application/javascript; charset=utf-8";
修改为:
header "Content-Type" "application/*; charset=utf-8";

// client Host和Referer,记得去掉注释

http-get

1
2
3
4
5
6
// server 中 Content-Type
header "Content-Type" "application/javascript; charset=utf-8";
修改为:
header "Content-Type" "application/*; charset=utf-8";

// client Host和Referer,记得去掉注释

http-post

1
2
3
4
5
6
// server 中 Content-Type
header "Content-Type" "application/javascript; charset=utf-8";
修改为:
header "Content-Type" "application/*; charset=utf-8";

// client Host和Referer,记得去掉注释

在这个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运营商的,成功隐藏


参考文章