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 ,密钥位长 128CBC 模式,填充标准 PKCS7 ,其通信具体流程如下。image-20230930201229567

题目分析

题目描述:

财务部的小张收到一封标题为《关于2025年部分节假日安排的通知》的邮件。小张未经验证便双击执行,随后电脑突然蓝屏重启。重启后,公司内部监控系统检测到异常外联流量,疑似财务数据泄露。作为应急响应专家的你,请你分析出黑客的攻击行为。

一般国内考cs流量分析的题目都只给一个流量包,同时会给.cobaltstrike.beacon_keys文件,提出来就能用CTF-NetA工具一把梭了,但是这道题是没给。

这里就需要一些tricks来获取AES 和 HMAC 密钥

理论可行的做法有两种:

  1. 解析stage文件 (非常吃时间和计算资源,但仅需流量文件,优点是不需要受害机的内存镜像)
  2. 内存镜像中提取Beacon进程的数据 (本题给了受害者的电脑内存镜像,预期解也正是这样)

解题流程

共通线

内存分析

#以下均为调用volatility的指令,具体写法根据自己本地环境来
-f XiaoZhang-PC-DESKTOP.raw imageinfo
-f XiaoZhang-PC-DESKTOP.raw --profile=Win10x64_19041 filescan|grep Desktop
-f XiaoZhang-PC-DESKTOP.raw windows.netscan

用各种取证工具都可以非常轻松的发现 关于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

image-20250913135800316

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

image-20250913135712326

将n进行模数分解,得到p和q

这里可以选用yafuRsaCtfTool

.\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 KeyHMAC 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
######################################
File: 6492.dmp
Searching for AES and HMAC keys
Searching after sha256\x00 string (0x61a44)
######################################
AES key position: 0x00068c60
AES Key: a6f4a04f8a6aa5ff27a5bcdd5ef3b9a7
HMAC key position: 0x00068c70
HMAC Key: 35d34ac8778482751682514436d71e09
######################################
SHA256 raw key: 35d34ac8778482751682514436d71e09:a6f4a04f8a6aa5ff27a5bcdd5ef3b9a7

解密CobalStrike流量

通过CS_Task_And_Return_AES_Decrypt.py解密数据

image-20250916175107830

👆找到读取敏感信息secret.txt的请求包

👇一个就是被窃取的敏感信息

image-20250916175225730

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 KeyHMAC Key

Beacon_metadata_moreInfo_RSA_Decrypt.py可以获得hostPC nameusernameAES keyHMAC 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

西湖论剑https://mp.weixin.qq.com/s/gXYLwdup6HYd_rETUSb9aA

西湖论剑https://www.cnblogs.com/alexander17/p/18737592