博客系列:Cobalt Strike:流量解密
- Cobalt Strike: 使用已知的私钥解密流量 - Part 2(当前部分)
- Cobalt Strike: 使用进程内存解密流量 - Part 3
- Cobalt Strike:使用已知的私钥解密流量-Part 1
- Cobalt Steike: 解密被掩盖的流量 - Part 4
- Cobalt Strike: 解密DNS流量 - Part 5
我们发现6个流氓软件Cobalt Strike的私钥,可以用来将C2网络流量进行解密
在这篇文章中,我们将通过查看感染期间捕获的完整数据包来分析Cobalt Strike感染。该分析包括对C2流量的解密。
如果你还没有看,我希望你先阅读下Part 1部分:使用已知的私钥解密流量 - Part 1
在此次分析中,我将使用2021-02-02-Hancitor-with-Ficker-Stealer-and-Cobalt-Strike-and-NetSupport-RAT.pcap.zip文件,该文件是Brad Duncan在他的个人网站分享出来的一个众多恶意软件流量中的其中之一。
我们从最低程度的知识基础开始:这个捕获文件包含Cobalt Strike的beacon与其团队服务器通信的加密HTTP流量。
如果你想了解更多关于Cobalt Strike和其他Cobalt Strike组件方面的只是,强力推荐这个 博客.
第一步:我们使用Wireshark打开这个流量文件,通过stager shellcode查找beacon并进行下载
虽然beacon以多种方式呈现,但是我们可以大致将它分为两类:
- 一小段shellcode(几百个字节),通常叫做stager shellcode,这段代码下载整个的beacon。
- 一个完全的beacon:一个可以反射性加载的PE文件
在这一步骤中,我们在流量文件中寻找stager shellcode的踪迹:我们通过一下的过滤器来进行筛选:http.request.uri matches "/....$".
图1:Cobalt Strike流量抓包
我们一次性就找到了:用来发送GET请求来下载整个beacon的路径,包含满足以下条件的4个字符: 字符值之和的字节值(又称校验和8)是一个已知的常数。我们可以通过工具metatool.py来进行检查:
图2:使用metatool.py
更多关于校验和的进程可以在这里地方去找到
该工具返回的结果显示该路径是一个确实可以用来下载32位完整beacon(CS x86)。
完整的beacon下载流量捕获如下:
图3:完整beacon下载
我们解压这个下载流量
图4:导出HTTP实例
图5:选择下载EbHm下来保存
图6:将选中的文件下载到磁盘
一旦将完整的beacon保存为EbHm到磁盘,就可以用工具 tool 1768.py进行分析。1768.py是个能够用来加密和解密beacon的工具,而且还能解压出配置文件。Cobalt Strike的beacon有多种的配置选项:所有这些配置选项都存储在一个编码的嵌入式表格中。
下面是本次分析的输出:
图7:解压出来的beacon的配置
让我们仔细看下其中的一些选项。
首先,0x000表示这个是个HTTP类型的beacon:它是通过HTTP传输数据。
这个beacon通过HTTP连接到192.254.79.71(option 0x0008)端口8080(选项0x0002).
GET请求使用的路径为 /ptj(选项0x0008),POST请求使用的路径为 /submit.php(option 0x000a)
在本次分析中比较重要的是:该beacon使用的公钥有一个已知的私钥(选项0x0007)。
因此,有了这些消息,我们就可以知道这个beacon会发送GET请求到团队服务器,等待下一步的指示。如果团队服务器有需要这个beacon执行的命令,这个beacon就会通过加密的数据发送GET请求进行回复。当beacon要发送命令执行后的结果到团队服务器,它就会将数据进行加密并使用POST请求发送。
如果团队服务器没有要beacon执行的命令,它会发送没有加密的数据,这并不一定意味着对GET请求的回复不包含任何数据:操作者有可能通过配置文件来掩盖通信。比如,加密的数据是包含在一个GIF文件中。但是,对上面的beacon来说并不是这个情况。我们所知道的是,因为在这个配置文件中没有所谓的可修改的C2指令:选项0x000b 和0x00000004有着相同的作用,这意味着在解密前不应对数据进行任何操作(具体细节将在下一篇文章中进行解释)。
我们创建一个过滤器来查看C2数据流:http and ip.addr == 192.254.79.71
图8:完整的beacon下载过程,以及Cobalt Strike的HTTP加密请求流量
以上显示所所有的发送到团队服务器和从团队服务器接收到HTTP流量。注意,我们已经看了这个视图中的前2个数据包(数据包6034和6703):那是beacon本身的下载,而这种通信是不加密的。因此,我们将用以下显示过滤器过滤掉这些数据包
http and ip.addr == 192.254.79.71 and frame.number > 6703
过滤出来的结果显示了一组有回复的GET请求,注意,有个每分钟都会发送的GET请求。这也能够从配置文件中发现:60.000ms 的睡眠时间(option 0x0003)0%的变化(又称抖动,选项0x0005)。
图9:加密的Cobalt Strike HTTP请求
我们查看HTTP数据流进行查看:
图10:查看数据流
图11:第一个HTTP流
这是一个向/ptj路径进行GET请求的流,接收到了一个200状态回复,但是没有数据。这就意味着当前的团队服务器没有发送要beacon执行的命令,这个包中显示当时操作者没有发送任何命令。
注意这个GET请求中的Cookie头,这看起来是一个BASE64编码的字符串:
KN9zfIq31DBBdLtF4JUjmrhm0lRKkC/I/zAiJ+Xxjz787h9yh35cRjEnXJAwQcWP4chXobXT/E5YrZjgreeGTrORnj//A5iZw2TClEnt++gLMyMHwgjsnvg9czGx6Ekpz0L1uEfkVoo4MpQ0/kJk9myZagRrPrFWdE9U7BwCzlE=
该值是加密的元数据,beacon以BASE64字符串的形式发送到团队服务器。该数据是用RSA的公钥进行加密过的,该公钥在beacon的配置中能查看到(选项0x0007),团队服务器能够使用私钥进行解密,因为团队服务器有私钥。记住有些私钥已经被泄露了,我们第一片文章中就讲过。
我们的beacon分析显示,这个beacon使用的公钥对应的私钥已经被泄露了。也就意味着我们能够使用
cs-decrypt-metadata.py工具将元数据(cookie)进行解密,如下:
图12:解密beacon元数据
我们能看到解密后的元数据,最重要的是有原钥匙:
caeab4f452fe41182d504aa24966fbd0。我们要使用这个要是进行解密流量(AES和HMAC密钥是由这个原始密钥衍生出来的)。
更多的能偶发现的元数据有:计算机名,用户名等等
现在我们将用9379和9383数据包跟踪HTTP流:这是操作者(团队服务器)向信标发送的第一个命令。
图13:有加密命令的HTTP流
我们能看到回复的包中包含48字节的数据,这个数据是加密了的
图14:加密命令的HTTP流的十六进制视图
像这样的加密数据,可以用工具cs-parse-http-traffic.py进行解密。由于数据是加密的,我们需要提供原始密钥(选项-r caeab4f452fe41182d504aa24966fbd0),并且由于数据包捕获包含除纯Cobalt Strike C2流量之外的其他流量,最好提供一个显示过滤器(选项-Y http and ip.addr == 192.254.79.71 and frame.number > 6703),以便该工具可以忽略所有非C2流量的HTTP流量。
以下是输出结果:
图15:解密后的命令和结果
现在我们可以看到,9383号包中的加密数据是一个睡眠指令,睡眠时间为100毫秒,抖动系数为90%。这意味着操作员指示信标进行互动。
解密的数据包9707包含一个未知的命令(id 53),但当我们看数据包9723时,我们看到一个目录列表输出:这是未知命令53被送回团队服务器的输出结果(注意POST网址/submit.php)。因此,我们可以安全地假设53号命令是一个目录列表命令。
在这个捕获文件中,有许多命令和结果是工具cs-parse-http-traffic.py可以解密的,太多了,在此不一一展示。但我们邀请你重现这篇博文中的命令,并查看工具的输出。
捕获文件中的最后一条命令是一个进程列表命令。
图16:解密后的进程列出了命令和结果
结论
尽管我们在这里解密的数据包捕获文件是半年多以前由Brad Duncan通过在沙盒内运行恶意的Cobalt Strike信标产生的,但我们今天可以解密它,因为操作者使用了一个恶意的Cobalt Strike包,包括一个私钥,我们从VirusTotal恢复了这个私钥。
如果没有这个私钥,我们将无法解密该流量。
私钥并不是解密流量的唯一方法:如果可以从进程内存中提取AES密钥,我们也可以解密流量。我们将在接下来的一篇博文中介绍这个问题。
**关于作者 ***
Didier Stevens是一名为NVISO工作的恶意软件专家。Didier是SANS互联网风暴中心的高级处理员和微软的MVP,并开发了许多流行的工具来协助进行恶意软件分析。你可以在Twitter和LinkedIn找到Didier。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)