Cobalt Strike特征隐藏和流量加密
作为红队,隐藏 CS 流量特征还是很有必要。一次重保过程中,由于自己虚拟机运行的 CS 没有关闭,导致流量被安全设备捕获并告警,识别出了 CS 证书特征
仔细一看原始 TCP 流量数据,特征还是挺明显的,流量中就包含了 CobaltStrike 关键字
还好告警被我及时发现并立即关停了 CS,仔细一想,正好值守期间空闲时间还算多,正好花时间学习一下 CS 特征隐藏技巧
CS默认证书一共三个,不同的证书作用也不同:
- cobaltstrike.store 证书用于服务端和客户端加密通讯
- proxy.store 证书用于浏览器代理也就是 browserpivot 功能
- ssl.store 证书,如果你没有配置 https-certificate 选项,并且使用的是 https 监听器那么 CS 默认就会使用这个证书
这里主要介绍端到端传输加密,也就是 cobaltstrike.store 证书加密,其他证书有需求了再补充(留坑)
keytool
keytool 是 Java 提供的密钥(Key)和证书(Certificate)管理工具,用于管理公钥/私钥对以及相关证书。我们生成新的 CS 证书就需要借助 keytool,keytool 工具在 Java 安装目录的 bin 目录下可以找到,不用再去下载
使用 keytool 查看一下 CS 默认证书的信息,密钥库口令为 123456,从证书信息中可以可以看到明显的 CS 特征信息,名称和所有者都有 CS 关键字
1 | keytool -list -v -keystore cobaltstrike.store |
KeyTool 使用指令如下:
1 | [>] $ keytool |
cobaltstrike.store
使用 keytool 创建证书,指令如下
1 | keytool -keystore {证书名} -storepass {密码} -keypass {密码} -genkey -keyalg {加密方法} -alias {别称} -dname "CN={名字与姓氏}, OU={组织单位名称}, O={组织名称}, L={城市或区域名称}, ST={州或省份名称}, C={单位的两字母国家代码}" |
为了更好的隐藏特征,证书信息之前最好也有些关联,下面两个证书生成指令可以作为参考
1 | # 360 |
修改证书标准并应用
1 | keytool -importkeystore -srckeystore cobaltstrike.store -destkeystore cobaltstrike.store -deststoretype pkcs12 |
再次通过 keytool 查看证书信息,证书信息已被仿造成百度
用生成的证书替换服务器 cobaltstrike.store 文件,抓包 CS 查看流量,之前明显的 CS 特征码已经看不到了
CS 中 Beacon 的 HTTP 指示器由可延展命令和控制配置文件(Malleable C2 Profile)控制,我们可以通过修改 profile 文件来控制 HTTP 流量的传输方式,可以很好的隐藏 CS 流量特征
要使用自定义配置文件,需要启动 teamserver 服务器时指定 profile 文件
1 | ./teamserver [external IP] [password] [/path/to/my.profile] |
首先我们不使用 profile,用 CS 生成一个简单的后门并抓包,流量特征还是比较明显
编写 profile 文件比较复杂,这里我们直接通过网上写好的 profile 文件隐藏流量:
也可以通过 bp 插件选取网站流量,生成定制化流量隐藏配置,插件地址 (适配 CS4.4 以下):
https://github.com/Peithon/JustC2file
不管是使用自己编写的 profile 还是使用插件或 GitHub 上别人写好的 profile,正式使用之前都可以先通过 CS 自带校验工具 c2lint 对配置文件进行单元测试,工具就在 CS 目录下
1 | ./c2lint /path/to/malleable_c2_profile.profile |
校验没问题就可以指定 profile 文件启动 teamserver 服务
1 | ./teamserver {host} {passwd} {/path/to/c2.profile} |
- host,填入服务器IP地址
- password,填入服务器连接密码
- /path/to/c2.profile,指定 CS 全局变量配置文件,主要用于流量隐藏
再次抓包查看流量,http 请求已经变成请求 jquery.js,同时响应包也会返回 jquery.js 的响应内容,真实的响应内容已被加密掺杂在 jquery.js 代码中进行隐蔽传输
CS 服务端默认50050 端口,存在一定的风险。编辑 teamserver 文件,将文件最后一行中的默认端口 50050 修改为自己喜欢的任意端口
1 | ./TeamServerImage -Dcobaltstrike.server_port=65151 -Dcobaltstrike.server_bindto=0.0.0.0 -Djavax.net.ssl.keyStore=./coobaltstrike.store -Djavax.net.ssl.keyStorePassword=123456 teamserver $* |
然后重启 teamserver 服务端口就修改成功了