kitty 发表于 2023-11-22 09:33:56

深入研究 8Base 集团最近部署的 Phobos 勒索软件

本帖最后由 kitty 于 2023-11-22 10:02 编辑

英文原文:https://blog.talosintelligence.com/deep-dive-into-phobos-ransomware/









Cisco Talos 最近观察到 8Base 进行的活动有所增加,该勒索软件组织使用 Phobos 勒索软件的变种和其他公开可用的工具来组合使用。该组织的大多数 Phobos 变种都是由后门木马 SmokeLoader 分发的。这种加载器通常在部署时丢弃或下载额外的有效负载。然而,在 8Base 活动中,它的加密有效负载中嵌入了勒索软件组件,然后解密并加载到 SmokeLoader 进程的内存中。8Base 的 Phobos 勒索软件有效负载包含我们在本博客中描述的嵌入式配置。除了这种嵌入式配置之外,我们的分析没有发现 8Base 的 Phobos 变种与 2019 年以来在野外观察到的其他 Phobos 样本之间存在任何其他显着差异。我们对 Phobos 配置的分析揭示了许多有趣的功能,包括用户访问控制 (UAC) 绕过技术和向外部 URL 报告受害者感染。值得注意的是,在我们分析的 2019 年以来发布的所有 Phobos 样本中,相同的 RSA 密钥保护加密密钥。这使我们得出结论,获得关联的私钥可以解密所有这些样本。

SmokeLoader 投递 Phobos 有效负载的三阶段过程
我们不会在这提供 SmokeLoader 的完整概述 (Malpedia 上有对它的基础描述),但我们想展示逆向工程师如何达到最终的有效负载。在此示例中,我们将使用样本 518544e56e8ccee401ffa1b0a01a10ce23e49ec21ec441c6c7c3951b01c1b19c,但任何最近的 8base 样本最终都将具有相同的勒索软件二进制负载。此过程需要在 x32dbg 等调试器下的受控环境中执行恶意软件。SmokeLoader 恶意软件分三个阶段解密其有效负载。第一个包含许多随机 API 调用来混淆执行流程,而另外两个则涉及存储在分配的内存中的 shellcode。最终的二进制文件在第三阶段公开,其中该内存块中 PE 数据的二进制副本以原始形式提供最终的有效负载。



在第一阶段,在 VirtualAlloc 或 VirtualProtect 处启用断点并检查其参数会显示下一阶段将被解密的地址。然后,该内存位置将在入口点 (EP) 函数的末尾被调用,如上所示。

在第二阶段 shellcode 上,在从入口点调用的函数中进行第二次调用后,将导致对第三阶段的第二个分配的内存的调用。到达第三阶段后,该内存区域应包含解压的二进制文件 (PE),然后可以将其导出到文件并进行分析。

通过此方法提取的最终有效负载哈希为 32a674b59c3f9a45efde48368b4de7e0e76c19e06b2f18afb6638d1a080b2eb3。

Phobos 勒索软件中包含的功能概述
我们对 Phobos 的分析发现了许多功能,让攻击者能够在目标系统中建立持久性、执行快速加密、删除备份等。Phobos 是一种典型的勒索软件,能够加密本地驱动器和网络共享中的文件。在我们的 2023 财年第二季度 Talos 事件响应季度报告中,详细介绍了 8Base 小组在安装 AnyDesk 后如何使用其 Phobos 变种来实现对计算机的远程访问以及通过 LSASS 执行凭证转储。这些被盗的凭据后来被用来提升权限、窃取数据和运行勒索软件模块。

Talos 观察到恶意软件代码中存在以下特征:


[*]对 1.5MB 以下的文件进行完全加密,对超过此阈值的文件进行部分加密,以提高加密速度。较大的文件将在整个文件中加密较小的数据块,并且这些块的列表与文件末尾的密钥一起保存在元数据中。
[*]能够扫描本地网络中的网络共享。
[*]通过启动文件夹和运行注册表项实现持久性。
[*]生成要加密的扩展名和文件夹的目标列表。
[*]进程看门狗线程杀死可能使目标文件保持打开状态的进程,这样做是为了提高重要文件被加密的机会。
[*]禁用系统恢复、备份和卷影副本以及 Windows 防火墙。
[*]嵌入式配置有 70 多个可用选项,此配置使用与加密文件相同的 AES 函数进行加密,但使用硬编码密钥。

根据对此配置数据的分析,我们能够发现恶意软件二进制文件中存在的其他功能,这些功能可以通过设置特定选项来启用。迄今为止,这些功能尚未记录在案或仅在开源报告中提及:


[*]使用 .NET profile DLL 加载漏洞绕过 UAC。
[*]存在启用恶意软件中附加功能的调试文件,如下节所示。
[*]指向使用 Phobos 恶意软件的其他组的名称的黑名单文件扩展名列表。
[*]动态导入 API 调用以避免安全产品的行为检测。
[*]硬编码的 RSA 密钥,用于保护加密中使用的每个文件 AES 密钥。
[*]向外部 URL 报告受害者感染情况。
[*]操作系统检查西里尔语,以防止恶意软件在不需要的环境中运行。

我们还研究了 Phobos 使用的加密方法,2019 年之后发布的 Phobos 版本使用 AES-256 加密的自定义实现,每个加密文件使用不同的随机对称密钥,而不是像早期变种那样使用 Windows Crypto API。每个文件加密后,将使用 RSA-1024 和硬编码公钥对加密中使用的密钥以及其他元数据进行加密,并将其保存到文件末尾。该算法之前已有记录,例如在 2019 年的 Malwarebytes 帖子中,并且该过程仍然保持不变。

这使得通过暴力破解文件的可能性极小,因为每个文件都使用不同的密钥,尽管过去曾尝试过暴力破解。然而,这意味着一旦知道 RSA 私钥,自 2019 年以来由任何 Phobos 变种加密的任何文件都可以可靠地解密,另外对 VirusTotal 上提供的 1000 多个未加壳的 Phobos 样本进行的分析支持了这一事实,其中使用了上述相同的 RSA 公钥。



接下来,我们将更深入地了解配置文件及其启用的一些功能。

解密 Phobos 配置文件
为了了解 Phobos 中如何使用配置数据,我们分析了 IDA Pro 中的恶意代码。这使得我们能够使用 IDA Python 与配置数据进行交互,并立即解密所有配置数据。但首先,我们要看看配置数据在二进制文件中的样子。一旦文件加载到 IDA Pro 中,我们观察到的代码执行的第一个操作就是检查其有效负载并将其加载到内存中:



在上面的代码中,我们看到恶意软件最初检查 PE 文件最后一部分中数据的 CRC32 哈希值。在示例中,该部分被命名为 ".cdata",尽管不同的示例可能使用该名称的变种。另外也观察了使用 ".cdata" 和 ".sdata" 的样本。

然后,数据被加载到堆分配的内存中,并且带有指向该数据的指针的结构被保存到全局变量中,在上图中名为 "payoad_struct_addr"。解密函数将使用此结构,以便稍后在整个代码中加载请求的配置条目。每个条目都有一个特定的索引,该索引作为参数传递给解密函数,正如我们在最后一个代码块中看到的那样。

用于处理配置数据的结构体有 48 个字节,定义如下:



标头和实际数据加载到堆内存中分配的不同缓冲区中,指向这些缓冲区的指针以及配置中的条目数保存在结构中。数据后面是用于解密配置的 16 字节 AES 密钥,该密钥被硬编码在二进制文件中。

标头包含用于查找配置中每个索引的加密数据的信息,该结构体有 12 个字节,定义如下:



上面的偏移量是相对于从 0x00 开始的加密数据缓冲区的开头。索引也从 0x00 开始,每个索引对于其包含的数据类型来说是相对静态的,这意味着对于给定的索引,每个样本中应该具有相同类型的配置数据。

然而,我们观察到一些样本的索引内容发生了微小变化。由于 Phobos 过去已被许多组织使用,这些变化可能表明他们正在使用不同的构建器或变种。在对 VirusTotal 中可用的公共样本的分析中,我们发现大约 88% 的样本有 64 个配置条目,而有些样本的配置条目少则 40,多则 72。

根据我们的代码分析,还能够推断出存在三个附加选项,用于设置报告 URL 和发送回攻击者的自定义消息。在分析的任何样本中都没有观察到这些选项,但处理它们的代码存在于所有样本中,本博客稍后将更好地介绍此功能。

解密函数接受两个参数:所需条目的索引和指向缓冲区的指针,如果条目包含超过四个字节的数据,则使用该缓冲区。否则,缓冲区参数必须为零。



该代码扫描标头缓冲区以查找与请求的索引匹配的条目。然后,它分配足够的内存来存储加密数据并将数据复制到该空间,并使用 "payload_struct_addr + 0x10" 中存在的密钥调用 AES_Init 函数,该密钥在示例数据部分中被硬编码。然后使用加密数据和此 AES 对象作为参数调用函数 AES_Decrypt。

使用 IDA Pro 自动配置解密
一旦理解了解密算法,就可以轻松自动解密配置中的每个条目并将详细信息输出到文件中。IDA Pro 允许使用 Python 来自动执行应用程序内的任务,我们决定使用 Flare-Emu Python 模块来模拟恶意软件的 AES 例程,而不是用 Python 重新实现代码。

由于解密函数只需要两个参数,因此相当独立,因此我们决定从该点开始模拟,创建一个类似于恶意软件对有效负载数据所做的结构:

eh=flare_emu.EmuHelper()
conf_struct=eh.allocEmuMem(0x30)
header_data=eh.allocEmuMem(header_size)
config_data=eh.allocEmuMem(config_size)
然后用适当的值填充此结构:

eh.writeEmuPtr(conf_struct,header_data)
eh.writeEmuPtr(conf_struct+4,config_entries)
eh.writeEmuPtr(conf_struct+8,config_data)
eh.writeEmuPtr(conf_struct+0xc,config_size)
eh.writeEmuMem(conf_struct+0x10,AES_Init_key_struct)

# load buffers
eh.writeEmuMem(header_data,eh.getEmuBytes(enc_data_start+0x8, header_size))
eh.writeEmuMem(config_data,eh.getEmuBytes(config_start,config_size))
# write addr of struct back to code
eh.writeEmuPtr(eh.analysisHelper.getNameAddr(CFG_STRUCT_NAME), conf_struct)
创建结构后,可以遍历标头中的每个条目并准备模拟器堆栈并从解密函数开始调用模拟:

if entry_size<=4:
    buffer=0
else:
    buffer=eh.allocEmuMem(entry_enc_size)
myStack =
eh.emulateRange(eh.analysisHelper.getNameAddr(DECRYPT_FN), stack = myStack, skipCalls=False)
如果解密后的数据为四个字节或更少,则将出现在 EAX 寄存器中;如果较大,则将出现在分配的缓冲区中。经过对野外发现的样本的分析,我们发现了以下类型的配置条目:



绕过 UAC 技术
为了实现对受害者计算机上尽可能多的文件进行加密,勒索软件需要以提升的权限执行,以便它可以访问磁盘上的所有文件,并禁用可能阻碍其目标的重要系统服务。提升进程权限通常会导致向用户显示警告,并可能阻止恶意软件运行。为了绕过该消息,许多恶意程序使用 UAC 绕过或利用漏洞来提升其自身的进程权限。

Phobos 二进制文件包含在执行 "compmgmt.msc" 时使用 .Net Profiler DLL 加载过程中的漏洞执行 UAC 绕过的代码。该技术至少自 2017 年起就有记录,但在最新版本的 Windows 10 中仍然有效。

注意:尽管恶意软件包含绕过 UAC 的代码,并且漏洞在执行时有效,但只有当我们强制执行遵循特定代码分支并且恶意软件未主动使用时,才会发生这种情况。仅当恶意软件配置中存在特定参数时,才能访问通往此特定功能的代码路径。由于 Phobos 通常与其他恶意软件一起分发,并且只有在攻击者能够提取他们需要的所有信息后,UAC 代码可能不会被使用,因为攻击者决定加密文件时不需要它。

在此方法中,DLL 被放置到用户可写的文件夹中,并修改环境变量以使 .Net Profiler 即使在提升的进程中也能加载该文件。对于 Phobos,配置文件存储一个 2KB 的小型 DLL 文件,该文件仅包含使用恶意二进制文件创建新进程的代码,32 位和 64 位文件都嵌入在配置中。



该 DLL 使用计算机序列号作为名称写入 %TEMP% 文件夹,如下所示:C:\Users\User\AppData\Local\Temp\1E41F172。

配置数据中嵌入的 DLL 并不代表完整的 PE,仅包含直到上面所示的 "CALL " 之后出现的导入表的数据。 PE 文件在写入磁盘之前从配置中提取并固定在内存中。恶意软件二进制文件的路径会在导入表之后写入文件,并将由代码用作 "CreateProcessW" 的参数之一。然后该节被最终确定,直到节与字节 0xBAADF00D 对齐:



然后,代码将使用 "Elevation:Administrator!new:{3ad05575-8857-4850-9277-11b85bdb8e09}" 作为参数调用 ShCreateItemFromParsingName,以创建一个提升的 shell 对象,该对象稍后将用于在执行之前初始化 .Net 环境通过 mmc.exe 的计算机管理工具。

一旦利用成功,恶意软件二进制文件的新实例就会以高权限启动:



进程树也值得注意,因为 MMC.EXE 启动未知二进制文件的情况并不常见,如下例所示:


kitty 发表于 2023-11-22 09:34:04

本帖最后由 kitty 于 2023-11-22 09:44 编辑

Phobos 的隐藏调试文件功能

我们在配置数据中发现的 Phobos 隐藏功能之一是支持调试文件,该文件可用于启用二进制文件中的其他功能。在代码的开头,Phobos 检查配置中索引 0x43 处是否存在文件名。如果存在该设置,它将检查该文件是否存在于同一文件夹中以及是否包含有效参数:



如果调试文件存在,Phobos 将解析每一行以查看它们是否包含有效命令,并将创建一个包含命令后找到的标志和字符串参数的结构。在 8Base 活动中,该文件的名称是 "suppo",但其他组织对调试文件使用不同的名称,或者根本没有设置。
根据我们的代码分析,可以使用以下命令进行调试:


[*]'C' 或 'c':显示打印调试字符串的控制台。
[*]'L':输出日志文件名。该名称将以 "e-" 为前缀,表示该进程正在提升运行状态。对于运行提升进程的低权限恶意软件的典型进程树,将创建两个文件:"文件名" 和 "电子文件名"。
[*]'M' 或 'm':不运行加密循环,此选项会禁用恶意操作并导致恶意软件跳转到代码末尾。
[*]'n':在缓冲区中设置一个标志。
[*]'e':接受以 ';' 分隔的一串值并在缓冲区结构中存储指向数据的指针。
[*]'s':在缓冲区中设置一个标志。
[*]'x':在缓冲区中设置一个标志。

虽然其中一些命令可以通过代码分析得出,但 Talos 从未找到这些调试文件的实际示例来与我们的分析进行比较,因此某些命令尚未完全理解。

当调试文件中存在显示控制台的选项时,恶意软件在典型执行期间会输出以下内容:



在上面的示例中,我们启用了控制台显示 (命令 "c") 和日志文件 (命令 "L"),我们可以看到打印到控制台的消息。它显示受害者标识 (字符串 "") 以及内部版本号 "v2.9.1"。输出中显示的所有字符串也作为配置中的设置出现,这表明这些消息可以由每个活动背后的威胁参与者自定义。

Phobos 的感染报告功能

虽然 Phobos 通常不会向攻击者报告新的感染,但我们的分析表明代码中存在这样做的功能,隐藏在启用此功能以及创建攻击者选择的自定义 URL 和消息的配置设置。

索引 "0x31" 的配置设置是整个代码中使用的标志,用于检查是否启用了各种功能。如果启用了报告功能,恶意软件将尝试分别从索引 0x44、0x45 和 0x46 中提取服务器名称、URI 路径和自定义消息:



如果存在这些选项,恶意软件将尝试将感染警报传回指定服务器。上面提到的自定义消息是一个字符串参数,其正文中可能包含 "<>" 标签。然后,在提交请求之前,该标签将被受害者 ID 替换。如下例所示,从二进制文件中提取的原始消息仍然具有标签,并且带有受害者 ID 的解析消息作为参数传递给 HTTP Post 函数:



发送的请求几乎没有标头,如下例所示:



但值得注意的是,迄今为止,Talos 尚未发现任何攻击者在分析的任何样本中使用此功能。

分析 Phobos 中代码随时间的变化

由于已知 8Base 组织的运作特征与之前的 Phobos 活动类似,因此我们将 8Base 样本中的代码与之前的 Phobos 变种进行了比较,并确定代码在二进制级别上根本没有差异。正如我们上面提到的,这个 8Base 样本 32a674b59c3f9a45efde48368b4de7e0e76c19e06b2f18afb6638d1a080b2eb3 是从 2023 年 6 月至 8 月期间发现的,从部署的 SmokeLoader 二进制文件中提取的。

波兰计算机紧急响应小组 (Cert-PL) 在 2023 年 2 月发布的有关 Phobos 暴力破解的帖子中,查看了 2704e269fb5cf9a02070a0ea07d82dc9d87f2cb95e60cb71d6c6d38b01869f66 样本,该样本于 2020 年在 VirusTotal 中首次观察到。与我们分析的 8Base 样本有很多相似之处,分析表明代码根本没有任何变化,样本的功能和基本块 100% 保留。

这两个二进制文件之间唯一发生变化的是最后一个 PE 部分中的配置数据:



对于 2020 年以来发现的其他样本也是如此。当我们将 8Base 样本与 2019 年创建的 Phobos 变种进行比较时,代码的差异开始出现。我们分析了 2019 年 8 月首次在 VirusTotal 中看到的样本 fc4b14250db7f66107820ecc56026e6be3e8e0eb2d428719156cf1c53ae139c6。根据我们的分析,目前的 8Base 样本与 2019 年的样本共享 89.6% 的代码。

当前 8Base 样本中存在一些 2019 年不存在的函数:



现在支持调试文件和感染报告功能,而旧示例中不存在这些功能。这意味着这些功能是在 2019 年或 2020 年的某个时候添加到 Phobos 源代码中的,很可能是 Phobos 源代码最后一次更新时。

Malwarebytes 于 2019 年首次描述了另一个引起我们注意的样本。该样本 a91491f45b851a07f91ba5a200967921bf796d38677786de51a4a8fe5ddeafd2 于 2019 年 5 月首次在野外观察到。此样本与同一时间范围内的其他样本有很大不同,仅共享其 47.2% 的样本代码。



在此示例中观察到的主要区别是使用 Windows Crypto API,而不是最近示例中的自定义加密代码。查看 2019 年样本中的函数,我们可以看到该样本导入的 Crypto API:



我们观察到这些 API 在整个代码中的一些关键函数中使用。下面的代码块与 8Base 中的加密/解密函数相关,它使用自定义加密库,而 2019 示例中的代码使用 Windows Crypto API



用于解密配置文件的函数也有类似的差异,其行为方式相关,但使用不同的加密 API。

在早期样本中观察到的这些变化支持了这样的假设:Phobos 在 2019 年经历了开发阶段,但此后一直保持不变。

在我们题为 "Understanding the Phobos affiliate structure and activity" 的第二篇文章中,我们将获得关于我们在阻止列表扩展中发现的数据的更多信息,以及这些数据如何映射到不同的参与者群体,以及这些群体一旦进入受害者网络后的行为。

IOCs

可以在 https://github.com/Cisco-Talos/IOCs/tree/main/2023/11/deep-dive-into-phobos-ransomware.txt 此处找到与此威胁相关的 IOC。

swan 发表于 2023-11-23 11:31:22

kitty 发表于 2023-11-22 09:34
Phobos 的隐藏调试文件功能

我们在配置数据中发现的 Phobos 隐藏功能之一是支持调试文件,该文件可用于启 ...

{:1_459:}{:1_459:}{:1_459:}
页: [1]
查看完整版本: 深入研究 8Base 集团最近部署的 Phobos 勒索软件