Cobalt Strike License

跟着许多大佬的文章分析过Cobalt Strike对License认证过程。整个License中最重要的就是解密Key。通过这个解密Key才可以对sleeve中的beacon与加载执行的PE程序进行解密。但在这个blog中不讲整个的认证流程,只说一下License的结构。(License就是cobaltstrike.auth)。由于可能会受Github的DMCA Policy影响,4.0-4.4的解密Key就不直接放出来了。如果有需要,可以直接向我发送邮件并表明你的需求;)

解析过程

根据 AuthCrypto.java 中60行判断读取的第一个 Int 长度的数据是否等于 -889274157,进入到else分支中,先读取了一个 Short 长度,并将剩余部分返回。

AuthCrypto

在上一部分中返回的数据中有进行了如下解析。

  1. 读取Int长度数据作为57行进行License有效时间的判断。
  2. 读取Int长度数据作为水印。
  3. 读取一个Byte长度数据,判断是否大于44作为适用版本判断。
  4. 之后不断的进行读一个Byte,再根据Byte大小读取相同长度的数据。如此循环5次,每个循环分别是读取了4.0版本到4.4版本的解密 Key。 并将读取到最后的解密Key给到 SleeveResource.Setup() 方法中。

Authorization

cobaltstrike.auth 结构

根据 Cobalt Strike 4.4中 AuthCrypto.javaAuthorization.java 解析过程分析出的 License 结构。

text
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
00 00 00 00  | -889274157
00 00 | 之后的字节数
00 00 00 00 | 29999999
00 00 00 00 | watermark
00 | >43

00 | Authorization():var8 = 16
00*16 | len = var8 CS4.0 用来对dll解密的密钥

00 | Authorization():var10 = 16
00*16 | len = var10 CS4.1 用来对dll解密的密钥

00 | Authorization():var12 = 16
00*16 | len = var12 CS4.2 用来对dll解密的密钥

00 | Authorization():var14 = 16
00*16 | len = var14 CS4.3 用来对dll解密的密钥

00 | Authorization():var14 = 16
00*16 | len = var14 CS4.4 用来对dll解密的密钥