cobaltstriken3 key逆向分析

旧笔记 cs3的key生成过程

授权流程分析

1.common.License文件去调用common.Authorization文件
2.Authorization文件读取cobaltstrike.auth文件并创建AuthCrypto类然后调用decrypt方法解密auth文件。
3.AuthCrypto类主要是使用RSA算法读取jar包内resources/authkey.pub私钥然后利用它去解密cobaltstrike.auth文件
4.然后调用DataParser类去解析
5.最后调用gunzip函数解压缩
6.成功返回授权信息

函数分析

Authorization调用decrypt方法解密
ScreenShot_20191208163252.png

利用RSA解密授权文件
ScreenShot_20191208163642.png

判断文件头

判断授权文件头是否匹配
2019-12-08164003.png

取授权文件前4个字节

文件头十六进制\xca\xfe\xc0\xbb

获取压缩数据偏移

1
return CommonUtils.gunzip(dataParser.readBytes(dataParser.readShort()));
1
2
3
4
public int readShort() throws IOException {
this.content.read(this.bdata, 0, 2);
return this.buffer.getShort(0) & 0xFFFF;
}

取前两个字节代表压缩数据长度

1
2
3
4
5
public byte[] readBytes(final int n) throws IOException {
final byte[] array = new byte[n];
this.content.read(array);
return array;
}

根据长度返回压缩数据(注意这里是从第6个字节开始因为前4个字节代表文件头在后两个字节代表压缩数据长度)

最后转成string字符串然后在以,号为分割符转成string数组
例子如下

9022-418a-b376-ab71,200908,1873433027,1546198065476

1
final String[] array = CommonUtils.toArray(CommonUtils.bString(decrypt));

[0] License key 许可证key
[1] End date 授权过期时间
[2] Watermark 水印
[4] issued 授权文件发出时间

授权文件结构
authfile.png