发布于 

Cobalt Strike特征隐藏和流量加密

作为红队,隐藏 CS 流量特征还是很有必要。一次重保过程中,由于自己虚拟机运行的 CS 没有关闭,导致流量被安全设备捕获并告警,识别出了 CS 证书特征

image.png

仔细一看原始 TCP 流量数据,特征还是挺明显的,流量中就包含了 CobaltStrike 关键字

image.png

还好告警被我及时发现并立即关停了 CS,仔细一想,正好值守期间空闲时间还算多,正好花时间学习一下 CS 特征隐藏技巧

SSL证书修改

CS默认证书一共三个,不同的证书作用也不同:

  1. cobaltstrike.store 证书用于服务端和客户端加密通讯
  2. proxy.store 证书用于浏览器代理也就是 browserpivot 功能
  3. ssl.store 证书,如果你没有配置 https-certificate 选项,并且使用的是 https 监听器那么 CS 默认就会使用这个证书

这里主要介绍端到端传输加密,也就是 cobaltstrike.store 证书加密,其他证书有需求了再补充(留坑)

keytool

keytool 是 Java 提供的密钥(Key)和证书(Certificate)管理工具,用于管理公钥/私钥对以及相关证书。我们生成新的 CS 证书就需要借助 keytool,keytool 工具在 Java 安装目录的 bin 目录下可以找到,不用再去下载

image.png

使用 keytool 查看一下 CS 默认证书的信息,密钥库口令为 123456,从证书信息中可以可以看到明显的 CS 特征信息,名称和所有者都有 CS 关键字

1
keytool -list -v -keystore cobaltstrike.store

image.png

KeyTool 使用指令如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[>] $ keytool
密钥和证书管理工具

命令:

-certreq 生成证书请求
-changealias 更改条目的别名
-delete 删除条目
-exportcert 导出证书
-genkeypair 生成密钥对
-genseckey 生成密钥
-gencert 根据证书请求生成证书
-importcert 导入证书或证书链
-importpass 导入口令
-importkeystore 从其他密钥库导入一个或所有条目
-keypasswd 更改条目的密钥口令
-list 列出密钥库中的条目
-printcert 打印证书内容
-printcertreq 打印证书请求的内容
-printcrl 打印 CRL 文件的内容
-storepasswd 更改密钥库的存储口令

使用 "keytool -command_name -help" 获取 command_name 的用法

cobaltstrike.store

使用 keytool 创建证书,指令如下

1
keytool -keystore {证书名} -storepass {密码} -keypass {密码} -genkey -keyalg {加密方法} -alias {别称} -dname "CN={名字与姓氏}, OU={组织单位名称}, O={组织名称}, L={城市或区域名称}, ST={州或省份名称}, C={单位的两字母国家代码}"

为了更好的隐藏特征,证书信息之前最好也有些关联,下面两个证书生成指令可以作为参考

1
2
3
4
5
# 360
keytool -keystore cobaltstrike.store -storepass 123456 -keypass 123456 -genkey -keyalg RSA -alias 360.com -dname "CN=US, OU=360.com, O=Sofaware, L=Somewhere, ST=Cyberspace, C=CN"

# baidu
keytool -keystore cobaltStrike.store -storepass 123456 -keypass 123456 -genkey -keyalg RSA -alias baidu.com -dname "CN=ZhongGuo, OU=CC, O=CCSEC, L=BeiJing, ST=ChaoYang, C=CN"

修改证书标准并应用

1
keytool -importkeystore -srckeystore cobaltstrike.store -destkeystore cobaltstrike.store -deststoretype pkcs12

再次通过 keytool 查看证书信息,证书信息已被仿造成百度

image.png

用生成的证书替换服务器 cobaltstrike.store 文件,抓包 CS 查看流量,之前明显的 CS 特征码已经看不到了

image.png

Profile流量配置

官方介绍文档:https://www.cobaltstrike.com/help-malleable-c2

CS 中 Beacon 的 HTTP 指示器由可延展命令和控制配置文件(Malleable C2 Profile)控制,我们可以通过修改 profile 文件来控制 HTTP 流量的传输方式,可以很好的隐藏 CS 流量特征

要使用自定义配置文件,需要启动 teamserver 服务器时指定 profile 文件

1
./teamserver [external IP] [password] [/path/to/my.profile]

首先我们不使用 profile,用 CS 生成一个简单的后门并抓包,流量特征还是比较明显

image.png

编写 profile 文件比较复杂,这里我们直接通过网上写好的 profile 文件隐藏流量:

也可以通过 bp 插件选取网站流量,生成定制化流量隐藏配置,插件地址 (适配 CS4.4 以下):

https://github.com/Peithon/JustC2file

不管是使用自己编写的 profile 还是使用插件或 GitHub 上别人写好的 profile,正式使用之前都可以先通过 CS 自带校验工具 c2lint 对配置文件进行单元测试,工具就在 CS 目录下

1
./c2lint /path/to/malleable_c2_profile.profile

image.png

校验没问题就可以指定 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 代码中进行隐蔽传输

image.png

默认端口修改

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 服务端口就修改成功了




👨‍💻本站由 @鱼龙 使用 Stellar 主题创建

📃本"页面"访问 次 | 👀总访问 次 | 🥷总访客

⏱️本站已运行 小时