修改beacon与C2通信的流量特征:Malleable-C2-Profiles
前言
这篇文章主要探讨一些Malleable-C2-Profiles的简单运用,Malleable-C2-Profiles可用于定制beacon向cobaltstrike服务端通信的流量特征,不同于常见的修改端口,证书,做反向代理等。Malleable-C2-Profiles是cobaltstrike的一个扩展,意为"可定制的" 的 C2 服务器,官方链接地址https://www.cobaltstrike.com/help-malleable-c2
beacon与C2的通信模式
在目标主机上线以后,beacon会定时向C2进行通信,这个通信时间是可以通过sleep控制的,从客户端输入的希望受害主机执行的命令并不是直接通过C2转发给beacon让受害主机去执行,而是存储在C2中,beacon定时向C2进行通信,这种通信是以心跳的方式进行的,beacon每次通信都会读取C2上有没有新的命令,如果有,就读取这个命令,并在下一次与C2通信时将执行命令的结果发送给C2。
不经过修改的beacon流量分析
既然要通信,从被害主机上就一定会捕获通信的流量,那就先来看以下在不进行定制流量特征时流量是什么样子的。我们使用以下环境进行测试:
受害主机:windows7 C2服务器:CentOS cobaltstrike版本:cobaltstrike4.0
首先,开启一个http的监听器,并生成beacon,上传到目标主机运行使其上线,
上线成功,开始在受害主机上使用wireshark进行抓包,筛选出与C2通信的流量
从抓取的流量可以看到,beacon与C2之间的通信是以http协议通信的,每次心跳,都会请求dot.gif,中间的通信的时间间隔就是以sleep设定的时间为准,这个时间是有一个默认值的,也可通过sleep命令来修改。但所有beacon与C2之间的通信不一定都是请求这个地址,我尝试过生成其他监听器重新上线,这个请求地址会发生变化,由此可以确认这个流量特征是随机的。
查看一下数据包的详细内容:
虽然通信的数据包格式是随机的,但如果通过人工分析,这个数据包还是显得那么不正常,尤其是Host字段还带了C2服务器的地址和监听器的端口。
关于Malleable-C2-Profiles
刚才已经说过,Malleable-C2-Profiles可以定制流量特征,具体如何编写profiles在官方链接和其他关于profiles编写的文章都有详细的描述,如果感觉编写很麻烦或不熟练,可以下载实例文件,对文件中的参数进行修改,这样就简单的多
实例文件地址:https://github.com/threatexpress/malleable-c2
下载完后,把对应版本的示例文件拿下来编辑
set sample_name 是这个profiles的名称,不影响其他功能
set sleeptime为设置sleep时间,以毫秒为单位
set jiiter设置抖动值
DNS beacon设置可以定制以dns beacon进行通信时的一些流量特征
http-stager定义分段过程,这里也就是可以定制HTTP请求的地方,实例文件中将流量伪装成请求一个js文件,并定制一个看似合法的响应。
http-get就不难理解了,这里定义了get请求,客户端和服务端都可进行详细配置,剩下还有http-post也是一样。
Profiles使用
修改完(或编写完)之后将profiles上传到C2服务器上,在启动teamserver时做如下调用
./teamserver [external IP] [password] [/path/to/my.profile]
启动teamserver,并调用profile,重新上线主机,抓取流量
这样Host字段隐蔽了C2服务器的ip,请求看起来也像是一个正常的,请求js文件的请求。
参考文献
https://xz.aliyun.com/t/2796