Cobalt Strike:使用已知的私钥解密流量 -Part 2

本文是Cobalt Strike流量解密系列的第二部分,通过已知的私钥解密了Cobalt Strike beacon与C2服务器之间的HTTP流量。分析了捕获的恶意软件流量包,使用Wireshark和相关工具识别并解密了beacon的下载路径,展示了如何解密和解析加密命令,揭示了操作者如何指示beacon进行交互。
摘要由CSDN通过智能技术生成

Cobalt Strike:使用已知的私钥解密流量 -Part 2

博客系列: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以多种方式呈现,但是我们可以大致将它分为两类:

  1. 一小段shellcode(几百个字节),通常叫做stager shellcode,这段代码下载整个的beacon。
  2. 一个完全的beacon:一个可以反射性加载的PE文件

在这一步骤中,我们在流量文件中寻找stager shellcode的踪迹:我们通过一下的过滤器来进行筛选:http.request.uri matches "/....$".

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m3OjRqoT-在这里插入图片描述

图1:Cobalt Strike流量抓包

我们一次性就找到了:用来发送GET请求来下载整个beacon的路径,包含满足以下条件的4个字符: 字符值之和的字节值(又称校验和8)是一个已知的常数。我们可以通过工具metatool.py来进行检查:

在这里插入图片描述

图2:使用metatool.py

更多关于校验和的进程可以在这里地方去找到

该工具返回的结果显示该路径是一个确实可以用来下载32位完整beacon(CS x86)。

在这里插入图片描述

图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密钥,我们也可以解密流量。我们将在接下来的一篇博文中介绍这个问题。

**关于作者 ***
们今天可以解密它,因为操作者使用了一个恶意的Cobalt Strike包,包括一个私钥,我们从VirusTotal恢复了这个私钥。

如果没有这个私钥,我们将无法解密该流量。

私钥并不是解密流量的唯一方法:如果可以从进程内存中提取AES密钥,我们也可以解密流量。我们将在接下来的一篇博文中介绍这个问题。

**关于作者 ***
Didier Stevens是一名为NVISO工作的恶意软件专家。Didier是SANS互联网风暴中心的高级处理员和微软的MVP,并开发了许多流行的工具来协助进行恶意软件分析。你可以在TwitterLinkedIn找到Didier。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值