Cobalt_Strike 无 .cobaltstrike.beacon_keys 流量解密
Cobalt_Strike 无 .cobaltstrike.beacon_keys 流量解密
暂且先就题论题,后续将把文章扩充为 应急响应之CS流量解密一文通
走马灯
其实这次移动的比赛质量很高,极其贴近实际生活中的工作内容,包括服务器安全配置,数据分级,应急响应等。
第二天发布了wp,有太多题目一离开赛场就成千古悬案了,这就是国企的担当啊!对移动好感up!(虽然无图/很多步骤一句带过)
可惜去年在 湖南大学参加比赛 导致开学要缓考,等考试结束比赛只剩下一小时出头,把题目都扫了一遍,发现这道应急响应工作中出现的cs流量解密,很有意思
知识学爆(正在施工中)
在做题之前,先来了解一下cobalt_Strike
Cobalt Strike 是一款很常用的GUI的框架式渗透工具,集成了端口转发、服务扫描,自动化溢出,多模式端口监听,win exe木马生成,win dll木马生成,java木马生成,office宏病毒生成,木马捆绑;钓鱼攻击包括:站点克隆,目标信息获取,java执行,浏览器自动攻击等等。
加密算法
Cobalt Strike 服务端和客户端是通过 SSL 加密通讯的 (默认证书对 cobaltstrike.store )。
Beacon 的元数据传输过程中虽然使用的是 RSA 算法,但是 Beacon 任务的传输使用的却是 AES 算法加密的,而 AES 密钥则是 Beacon 随机生成的然后通过 RSA 交换 AES密钥。加解密算法为 AES ,密钥位长 128 ,CBC 模式,填充标准 PKCS7 ,其通信具体流程如下。
题目分析
题目描述:
财务部的小张收到一封标题为《关于2025年部分节假日安排的通知》的邮件。小张未经验证便双击执行,随后电脑突然蓝屏重启。重启后,公司内部监控系统检测到异常外联流量,疑似财务数据泄露。作为应急响应专家的你,请你分析出黑客的攻击行为。
一般国内考cs流量分析的题目都只给一个流量包,同时会给.cobaltstrike.beacon_keys文件,提出来就能用CTF-NetA工具一把梭了,但是这道题是没给。
这里就需要一些tricks来获取AES 和 HMAC 密钥
理论可行的做法有两种:
- 解析stage文件 (非常吃时间和计算资源,但仅需流量文件,优点是不需要受害机的内存镜像)
- 从内存镜像中提取Beacon进程的数据 (本题给了受害者的电脑内存镜像,预期解也正是这样)
解题流程
共通线
内存分析
#以下均为调用volatility的指令,具体写法根据自己本地环境来 |
用各种取证工具都可以非常轻松的发现 关于2025年部分节假日安排的通知.exe 的外联地址是192.168.27.132,端口为12580
流量分析
分析pcap流量包,发现很明显的CobalStrike流量特征,找通信数据
解法1(理论可行)
本题提供的内存镜像
通过http.request.uri matches "/....$"筛选cs木马上线时所发送的stage文件
接着通过1768.py解密该文件,将publickey多余0去除得到公钥
python3 cs_dec_stage.py TJvI |

之后用cs_invert_pub.py将公钥转为pem格式,并提取其中的n和e

将n进行模数分解,得到p和q
这里可以选用yafu或RsaCtfTool
.\yafu-x64.exe “factor(110209881007357893823335805800713195851127501725957565233140927957700204009298219831317940655870344979959172203765131703915110847527123581538957802617902884782216119145118127834057251159376653146542095451104320803312070357977411524497260098391204298785177487587770308799475139763729699721645361283357313642349)“ |
最吃时间和计算资源的一步,笔者这里尝试了yafu,2个小时没跑出来,我就放弃了
后续我将再尝试RsaCtfTool,RsaCtfTool依旧失败,
于是我尝试了西湖论剑类似题目的公钥数据,秒分解。
说明这题如果要在有限时间内分解n的话对于数据有些要求,这题的公钥并不适合这种解法
进入某一条神奇的世界线
通过对公网暴露的 Cobalt Strike 服务器进行分析识别,发现许多服务器使用相同的公钥,这意味着他们使用的 .cobaltstrike.beacon_keys 文件相同,公私钥都相同。
因为这些人使用的都是 Cobalt Strike 的破解版,而在第一次使用时生成的 .cobaltstrike.beacon_keys 文件也被包含在破解版中共享出去了。
通过 VirusTotal 进行样本检索,发现了 10 个破解版 Cobalt Strike 的 ZIP 压缩包,这些压缩包中根据 .cobaltstrike.beacon_keys 提取了 6 个 RSA 密钥对。其中有 2 个密钥对被广泛使用,发现的 Cobalt Strike 服务器中有 25%(1500 余个)使用的都是这二者之一。
通过 1768.py 提取 Cobalt Strike Beacon 的配置时会显示是否为已知的私钥。
如果运气好——攻击者使用了破解版的Cobalt Strike,就可以使用已知的私钥
python3 cs_dec_stage.py -V TJvI #会显示已知的私钥 |
回到常规世界线
用cs_calc_pri.py通过p和q计算私钥,接着跳转至穷哥们打法-通过私钥解密Cookie
解法2(实际解法)
提取内存镜像中的Beacon进程文件
使用procdump或者volatility等工具,提取beacon进程为dmp文件
D:\CTF\misc\lovelymem\Tools\python27\python27.exe D:\CTF\misc\lovelymem\Tools\volatility2_python\vol.py -f D:/CTF/misc/vol2/财务小张/XiaoZhang-PC-DESKTOP.raw --profile=Win10x64_19041 memdump -p 6492 --dump-dir=./ |
此时可以尝试直接使用cs-extract-key.py去提取AES Key和HMAC Key
python .\cs_extract_key.py .\6492.dmp |
但是其原理是查找0x0000BEEF序列号头,这个序列号头是未被加密的元数据的头部,很有可能不正确
提取加密流量中的raw data
如果此时有包含加密数据的流量包,可以用cs-parse-http-traffic.py提取加密流量中的raw data
python3 cs-parse-http-traffic.py -k unknown XiaoZhang-PC.pcapng |
利用Beacon进程和流量中的数据获取AES key和HMAC Key
PS C:\Users\zhang\Desktop\1\zhang> python cs_extract_key.py -t 9ea8c274326a1db1e25142558f2bac154d8139bc18a19f5d772786e8075d6d8fca4d82ed8a7253e3e2c17110e911ff16 6492.dmp |
解密CobalStrike流量
通过CS_Task_And_Return_AES_Decrypt.py解密数据

👆找到读取敏感信息secret.txt的请求包
👇一个就是被窃取的敏感信息

5c1eb2c4-0b85-491f-8d50-4e96
如果题目简单些,给了.cobaltstrike.beacon_keys?
富哥打法
导入key文件后CTF-NetA一把梭:但是我记得购买这个工具要快100块
穷哥们打法
私钥获取
利用 .cobaltstrike.beacon_keys 文件
.cobaltstrike.beacon_keys文件本质上为KeyPair的Java对象,Python的javaobj可以直接读取其中存储的数据
利用parse_beacon_keys.py读取公钥和私钥(如果是python3环境装的是 javaobj-py3 )
通过私钥解密Cookie
用Beacon_metadata_RSA_Decrypt.py通过私钥解密心跳包中的Cookie数据,拿到AES Key和HMAC Key
用Beacon_metadata_moreInfo_RSA_Decrypt.py可以获得host、PC name、username、AES key、HMAC key等更多信息
有key了就通过CS_Task_And_Return_AES_Decrypt.py解密数据
参考文章
CobaltStrike流量解密 – S1mh0’s Blog(脚本出处)
https://forum.butian.net/share/1861
https://www.cnblogs.com/fleurs/p/19007755