原文:
https://blog.nviso.eu/2021/10/21/cobalt-strike-using-known-private-keys-to-decrypt-traffic-part-1/
一、Cobalt Strike 公钥和私钥
Cobalt Strike 信标(客户端)和 Cobalt Strike 团队服务器 (C2) 之间的通信使用 AES 加密(即使它通过 HTTPS 进行)
公钥和私钥存储在文件 .cobaltstrike.beacon_keys 中。这些密钥是在首次使用 Cobalt Strike 团队服务器软件时生成的。
二、使用
捕获文件:使用文章中的数据包进行测试。
数据包:https://www.malware-traffic-analysis.net/2021/02/02/index.html
第一步 找到信标
1 | http.request.uri matches "...$" |
第二步 查看是否是CS生成的shellcode
Metasploit 和 Cobalt Strike 为 http(s) shell 生成 shellcode。在这个 shellcode 中找到的 URL 有一个由 4 个随机字母数字字符组成的路径。但它们并不是完全随机的:它们的 8 位校验和是一小组常数.
使用metatool.py工具进行检查
https://blog.didierstevens.com/2021/04/18/metatool-py/
第三步 将beacon转化成vir文件
l 完整信标的下载被捕获:
l 提取并下载
第四步、使用工具 1768.py对其进行分析
https://blog.didierstevens.com/2021/10/11/update-1768-py-version-0-0-8/
1768.py 是一个可以解码/解密 Cobalt Strike beacon并提取其配置的工具
1 | 0x0001 表明这是一个通过 HTTPBeacon 进行通信的 |
https://blog.didierstevens.com/2021/10/22/new-tool-cs-decrypt-metadata-py/
解密的元数据及原始密钥:caeab4f452fe41182d504aa24966fbd0。使用此密钥来解密流量
1 | Python cs-decrypt-metadata.py [cookie] |
【此元数据使用信标配置中的公钥(选项 0x0007)进行 RSA 加密,私钥来自已经泄露的】
第六步 使用 cs-parse-http-traffic.py 解密流量
l 找到c2发送的命令
数据包 6034 和 6703是信标本身的下载,并且通信未加密。因此,我们将使用以下显示过滤器过滤掉这些数据包:
1 | http and ip.addr == 192.254.79.71 and frame.number > 6703 |
从第一个流开始,找到第一个有响应内容的
l 使用工具 解析命令
https://github.com/DidierStevens/Beta/blob/master/cs-parse-http-traffic.py
三、测试
流量包来源:cs4.3 http
使用cs4.3打包进行测试是否可破解cs流量
1、流量包
数据包样例
2、使用1768.py对其进行分析
攻击机使用了HTTP的beacon,受害机会连接192.168.24.129的8888端口,GET请求路径是/ptj,POST请求路径是/submit.php
3、使用工具cs-decrypt-metadata.py来找到原始密钥 报错
说明密钥可能错误,可以将自己的密钥配置近代码中
使用进程内存解密流量
https://blog.nviso.eu/2021/11/03/cobalt-strike-using-process-memory-to-decrypt-traffic-part-3/
4、cs-parse-http-traffic.py提取此加密字符串
https://github.com/DidierStevens/Beta/blob/master/cs-parse-http-traffic.py
5.DMP文件
https://docs.microsoft.com/en-us/sysinternals/downloads/procdump
使用tasklist找到进程PID
执行命令[将进程内容转储存成dmp文件]
1 | procdump.exe -mp 3788[PID] |
6、cs-extract-key.py获取密钥
https://github.com/DidierStevens/Beta/blob/master/cs-extract-key.py
元数据包含原始密钥:16 个随机字节。AES 和 HMAC 密钥是通过计算原始密钥的 SHA256 值从该原始密钥导出的。SHA256 值的前半部分是 HMAC 密钥,后半部分是 AES 密钥。
1 | python cs-extract-key.py -t 加密字符串【4】 xxx.dmp |
7、使用恢复的 AES 和 HMAC 密钥来解密流量
https://github.com/DidierStevens/Beta/blob/master/cs-parse-http-traffic.py
1 | Python cs-parse-http-traffic.py -k [sha256 ray key] pcap |