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,并开发了许多流行的工具来协助进行恶意软件分析。你可以在Twitter和LinkedIn找到Didier。

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

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

    博客系列:Cobalt Strike:流量解密 Cobalt Strike:使用已知的私钥解密流量-Part 1 Cobalt Strike: 使用已知的私钥解密流量 - Part 2(当前部分) C ...

  2. UDF——已知入口压力和流量计算压降

    有时候我们在计算内流,比如管道内的流动时,只知道入口压力和流量,而我们想要计算得到出口的压力,这个应该怎么办呢?当然新版本的Fluent已经自带了流量出口边界,而这里我们采用Fluent的UDF来实现 ...

  3. # Cobalt Strike: 使用进程内存解密流量-Part 3

    博客系列:Cobalt Strike:流量解密 Cobalt Strike:使用已知的私钥解密流量-Part 1 Cobalt Strike: 使用已知的私钥解密流量 - Part 2 Cobalt ...

  4. Cobalt Strike:解密 DNS 流量——第 5 部分

    博文系列:Cobalt Strike:解密流量 Cobalt Strike:使用已知私钥解密流量 - 第 1 部分 Cobalt Strike:使用已知私钥解密流量 - 第 2 部分 Cobalt S ...

  5. Cobalt Strike使用教程——基础篇

    本文主要介绍 Cobalt Strike 4.3 的基本功能及使用方法,具体分析和实战中使用放在另一篇讲解:Cobalt Strike使用方法--实战篇. 文章目录 一.基本介绍 (一) 目录结构 ( ...

  6. Cobalt Strike 域内渗透

    郑重声明: 本笔记编写目的只用于安全知识提升,并与更多人共享安全知识,切勿使用笔记中的技术进行违法活动,利用笔记中的技术造成的后果与作者本人无关.倡导维护网络安全人人有责,共同维护网络文明和谐. Co ...

  7. 【计算机网络】网络安全 : 公钥密码体质 ( 公钥 - 加密密钥 | 私钥 - 解密密钥 | 与对称密钥体质对比 | 特点 | 数字签名引入 )

    文章目录 一.公钥密码体质 二.公钥密码体质 中的 加密密钥 与 解密密钥 三.公钥密码体质 与 对称密钥体质对比 四.公钥密码体质算法特点 五.公钥密码体质 与 数字签名 一.公钥密码体质 公钥密码 ...

  8. cobaltstrike扩展_Malwarebytes:使用可变C2下发Cobalt Strike的APT攻击

    6月中旬,Malwarebytes Labs的研究人员发现了一个伪装成简历的恶意Word文档,该文档使用模板注入来删除.Net Loader.研究人员认为这是与APT攻击有关的多阶段攻击的第一部分.在 ...

  9. 记录一道已知是n,(p-1)*(q-2)和(p-2)*(q-1)的RSA题目writeup

    目录 题目 解题思路 解题脚本 题目 题目还是来源于qq群聊,是昨晚看到一个师傅问的,聊天记录中的图片如下: 这个图片还是比较容易ocr的,后面会给出解题脚本,就包括上面这些数字了. 解题思路 刚看到 ...

最新文章

  1. 联想拯救者Y9000-ubuntu-nvidia-驱动安装
  2. 破局传统算法痛点,腾讯安全首提基于跨模态检索的二进制代码-源代码匹配
  3. 键空间通知(keyspace notification)
  4. 如何读懂UWA性能报告?—NGUI篇
  5. SpringSecurity过滤器链加载原理
  6. Elastic-Job中的DataFlowJob
  7. 蓝桥杯第八届省赛JAVA真题----拉马车
  8. vs没有添加引用_NBA 季后赛 湖人vs火箭 G2大战谁能防住哈登?
  9. JavaScript服务器端开发(函数实参对象arguments使用的几个注意事项)
  10. .net 获取邮箱邮件列表和内容
  11. 关于串口助手(sscom)打开影响32程序跑飞问题。
  12. BLP防数据泄露安全操作系统:道里云公司参展英特尔北京IDF峰会产品介绍(二)
  13. Android 获取照相机图片或本地图片
  14. SqlSugar 6.导航查询
  15. zend guard loader php ts,安装Zend Guard Loader说明
  16. sed搜索某行在行末追加_sed在行首或者行尾添加内容
  17. 快速批量去除图片水印方法大全~~
  18. 一张图概括编程语言发展史
  19. 逆向教程2 某信营业厅
  20. 【复变函数与积分变换】02. 解析函数

热门文章

  1. 2022湖北恩施州宣恩县城市社区工作者招聘测试题及答案
  2. html 点击下载图片
  3. linux I2C驱动(Linux驱动开发篇)
  4. 【c语言】链表(完整版)
  5. Android项目客制化
  6. 计算机专业竞聘词150,计算机专业组长竞聘演讲稿
  7. 推荐一款免费开源的代码质量分析工具
  8. 【计算机导论调研报告】AI技术的发展
  9. 求圆面积OJ python
  10. mysql手机号以135开头_135开头的手机号码是移动还是联通