通过共享密钥解密 Cobalt Strike 流量
Avenger,公众号:威胁棱镜破解版密钥相同,部分CobaltStrike加密流量可解
procdump.exe -mp pid
dump 可写进程内存即可。其中,-mp
是获取可写内存 dump 的参数,pid
是正在运行的 Beacon 进程的 PID。0x0000BEEF
作为特征在内存中检索。获取内存 Dump 的时间越早,也就越有可能包含未加密的元数据。cs-extract-key.py
查找并解码元数据:cs-parse-http-traffic.py
来解密流量。值得注意的是, cs-extract-key.py
可能存在误报。发现以0x0000BEEF
开头的字节序列并不都是元数据。上篇文中的示例就是好例子,第一个例子包含机器名称和用户的确实是有效的元数据,这些元数据也可以在进程内存的其他位置中发现。但是第二个例子实际上没有得到可识别的名称,在其他位置也找不到 AES 和 HMAC 密钥,这就是一个误报。
cs-parse-http-traffic.py -k unknown capture.pcapng
,-k
表示密钥未知,该工具尝试提取加密数据流量:cs-extract-key.py -t d12c14aa698a6b85a8ed3c3c33774fe79acadd0e95fa88f45b66d8751682db734472b2c9c874ccc70afa426fb2f510654df7042aa7d2384229518f26d1e044bd rundll32.exe_211028_205047.dmp
尝试提取密钥:DATA_JITTER
,该命令表示服务器向 Beacon 发送可以忽略的随机数据。使用默认配置文件的 Cobalt Strike 不会发送随机数据,也不会使用 Malleable 进行处理。这表示,只要没有需要 Beacon 执行的命令,就不会向 Beacon 发送数据,HTTP 响应长度为 0。这样即使流量是加密的,也可以确定 Beacon 是否收到了命令。-c
而不是 -t
参数,原因在于 Team Server 的加密方式和 Beacon 的加密方式略有不同。一些注意事项
较大的内存 Dump 需要较长的时间来进行密钥字典碰撞。
使用完整内存 Dump 需要的时间更长
4.x 版本的方法也适用于 3.x 版本
cs-analyze-processdump.py
https://github.com/DidierStevens/Beta/blob/master/cs-analyze-processdump.py
思考
防御者对 Cobalt Strike 的理解应该更加深入,只有在技术原理和实际实现的层面深入理解,才能发现更有效的检测方式。以不断地深入研究总结经验,应对千变万化的攻击形式。实际上不仅是防御者,Cobalt Strike 一路走来的不断更新都是攻防对抗不断升级的结果,从旁观到亲历的视角转变也许可以让每一个攻击者来主动思考 Cobalt Strike 之所以成功的原因。