8Base 组织部署的 Phobos 勒索软件深入分析
2023-11-28 17:58:0 Author: paper.seebug.org(查看原文) 阅读量:19 收藏

原文链接:A deep dive into Phobos ransomware, recently deployed by 8Base group
译者:知道创宇404实验室翻译组

有安全团队观察到近期 8Base 组织活动频繁,主要使用Phobos 勒索软件变体和其他开源工具来进行操作。该组织的Phobos 变体通常通过后门木马SmokeLoader进行传播。通常,这个通用的加载器在部署时会释放并下载额外的有效负载。然而,在 8Base 活动中,它的加密有效负载中包含了勒索软件组件,然后解密并加载到 SmokeLoader 进程的内存中。

8Base 的 Phobos 勒索软件有效负载包含我们在本文中描述的嵌入式配置。除了这种嵌入式配置之外,在分析中并未发现8Base的Phobos变体与 2019 年以来在野观察到的其他Phobos样本之间有其他显著的差异。我们对 Phobos 配置的分析揭示了许多有趣的功能,包括用户访问控制 (UAC) 绕过技术和向外部 URL 报告受害者感染情况。值得注意的是,在我们分析的 2019 年以来发布的所有 Phobos 样本中,使用了相同的RSA密钥来保护加密密钥。因此可以推断出,获得关联的私钥可以解密所有这些样本。

在此示例中,我们将使用样本518544e56e8ccee401ffa1b0a01a10ce23e49ec21ec441c6c7c3951b01c1b19c,但任何最近的 8base 样本最终都将具有相同的勒索软件二进制有效负载。完成此过程需要在类似x32dbg的调试器下在受控环境中执行恶意软件。

SmokeLoader 恶意软件采用三个阶段来解密其有效负载。第一阶段包含大量随机 API 调用,旨在混淆执行流程,而另外两个阶段则涉及存储在分配的内存中的 shellcode。最终的二进制数据暴露在第三阶段,在该内存块中,PE(Windows 可移植可执行文件)数据的二进制副本以原始形式呈现最终有效负载。

img

SmokeLoader 嵌入有效负载的解密过程

在第一阶段,通过设置VirtualAlloc或VirtualProtect断点并检查其参数,可以显示下一阶段将解密的内存地址。接着,该内存位置将在入口点 (EP) 函数的末尾被调用,如上所示。

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

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

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

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

  • 完全加密小于1.5MB的文件,对超过此阈值的文件进行部分加密以提高加密速度。对较大文件的加密采用对整个文件进行分块处理,并将这些块的列表与文件末尾的密钥一起保存在元数据中。
  • 具备扫描本地网络中网络共享的功能。
  • 通过启动文件夹和运行注册表项实现持久性。
  • 生成要加密的扩展名和文件夹的目标列表。
  • 进程看门狗线程终止可能持有目标文件的进程。
  • 禁用系统恢复、备份和影像副本以及Windows防火墙。
  • 嵌入式配置有 70 多个可用选项。该配置使用与加密文件相同的AES函数进行加密,但使用了硬编码密钥。

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

  • 使用 .NET profiler DLL 加载漏洞进行UAC绕过。
  • 存在启用恶意软件中附加功能的调试文件。
  • 列出了阻止文件扩展名的黑名单,这些扩展名指向使用Phobos恶意软件的其他组织。
  • 使用动态导入 API 调用以规避安全产品的行为检测。
  • 硬编码的 RSA 密钥,用于保护加密中使用的每个文件 AES 密钥。
  • 向外部 URL 报告受害者感染情况。
  • 检查Cyrillic语言的操作系统,以防止恶意软件在不需要的环境中运行。

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

这种加密方式使得暴力破解文件的可能性非常小,因为每个文件都使用不同的密钥,尽管过去曾尝试过暴力破解,但由于每个文件都使用不同的密钥,成功的可能性较低。然而,这意味着一旦获知私有RSA密钥,自 2019 年以来由任何 Phobos 变体加密的任何文件都可以可靠地解密。

img

Talos 分析了自 2019 年以来在所有 Phobos 变体中使用的 RSA 密钥

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

解密Phobos配置文件

通过IDA Pro分析Phobos中的恶意代码,我们能够与配置数据进行交互,并且使用IDA Python解密这些数据。

img

入口点包含内存中的 Phobos 配置数据设置的代码片段

首先,我们观察到恶意代码执行的操作之一是检查有效负载并将其加载到内存中。在示例中,恶意代码检查PE文件的最后一部分数据的CRC32哈希值,通常被命名为“.cdata”或“.sdata”。

此数据随后被加载到堆分配的内存中,并将指向该数据的指针结构保存在全局变量,如代码所示的“payoad_struct_addr”。解密函数使用这个结构,以便后续代码加载所请求的配置条目。每个条目都有一个特定的索引,作为参数传递给解密函数。

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

img

存储指向配置数据的指针的结构

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

标头部分包含用于定位每个索引的加密数据的信息。这个结构体总共有12个字节,定义如下:

img

配置数据中标头条目的结构

上面的偏移量是相对于从 0x00 开始的加密数据缓冲区的开头。索引也从 0x00 开始,每个索引对应特定类型的配置数据。这表示每个样本在给定索引处应具有相同类型的配置数据。

然而,我们观察到一些样本的索引内容略有变化。这种变化可能表明不同的构建器或变体在使用Phobos。通过分析VirusTotal中的公共样本,我们发现约 88% 的样本有 64 个配置条目,而其他样本的配置条目数量则在 40 到 72 之间。

根据我们的代码分析,我们还发现存在三个额外的选项,用于设置报告 URL 和发送自定义消息回攻击者。尽管我们的分析未发现这些选项在任何样本中的存在,但处理这些选项的代码却存在于所有样本中。

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

img

解密函数显示使用有效负载结构中存在的密钥调用 AES_Init 和 AES_Decrypt

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

使用 IDA Pro 自动配置解密

通过了解解密算法,我们可以编写自动化脚本,实现对配置中每个条目的解密,并将详细信息输出到文件中。IDA Pro 允许使用 Python 来自动执行应用程序内的任务,我们选择使用Flare-Emu Python 模块来模拟恶意软件的 AES 例程,而不是重新实现相同的代码逻辑。

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

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 = [0xffffffff, entry_idx, buffer]
eh.emulateRange(eh.analysisHelper.getNameAddr(DECRYPT_FN), stack=myStack, skipCalls=False)
if entry_size<=4:    buffer=0else:    buffer=eh.allocEmuMem(entry_enc_size)myStack = [0xffffffff, entry_idx, buffer]eh.emulateRange(eh.analysisHelper.getNameAddr(DECRYPT_FN), stack = myStack, skipCalls=False)

如果解密后的数据为四个字节或更少,则存在EAX寄存器中;如果较大,则将出现在分配的缓冲区中。经过对在野发现的样本进行分析,我们发现了以下类型的配置条目:

img

恶意软件配置索引

UAC绕过技术

为了加密尽可能多的文件,勒索软件通常需要以提升的权限运行,以便访问磁盘上的所有内容并禁用关键系统服务。这通常导致权限提升警告,并可能阻止恶意软件运行。为了规避这些警告,恶意软件利用UAC绕过或漏洞利用提升自身权限。

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

需要注意的是,尽管恶意软件包含绕过 UAC 的代码,并且该漏洞在特定执行路径下有效,但它仅在特定参数存在于配置文件中时才会触发。Phobos通常与其他恶意软件捆绑分发,只有在攻击者能够获取所有必要信息后才会执行文件加密,因此不一定会使用UAC代码路径,因为这种功能在文件加密之前可能不是攻击者所需的。

在此方法中,DLL被放置在用户可写的文件夹中,并修改了环境变量,以便即使在权限提升后,.Net分析器也可以加载该文件。在Phobos的情况下,配置文件中存储了一个小型的2KB DLL文件,它仅包含创建新进程并加载恶意二进制文件的指令。这个DLL文件在32位和64位系统中都存在于配置文件中。

img

用于从提升的进程启动恶意二进制文件的代码

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

嵌入在配置数据中的DLL并不是一个完整的PE文件,直到导入表数据之后的部分,即“CALL [EAX]”。PE文件从配置中提取并在内存中修复后再写入磁盘。恶意软件二进制文件的路径被写入文件,这个路径位于导入表之后,将作为“CreateProcessW”函数的其中一个参数。然后使用字节0xBAADF00D完成该节,直到节对齐。

img

64 位样本在内存中修复前后的对比视图

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

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

img

显示具有高完整性和完全提升权限的新进程的进程信息

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

img

进程树显示了从 mmc.exe 启动的勒索软件进程

Phobos 的隐藏调试文件功能

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

img

Phobos 检查调试文件是否存在

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

根据我们的代码分析,可以使用以下命令进行调试:

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

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

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

img

由Phobos 调试文件设置创建的调试控制台和日志文件

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

Phobos 的感染报告功能

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

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

img

Phobos 代码检查配置中是否存在报告 URL

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

img

显示解析 ID 后 HTTP POST 请求的参数的代码片段

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

img

已启用配置中将POST请求发送回攻击者

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

已知 8Base 组织的运作特征与之前的 Phobos 活动类似,因此我们将 8Base 样本中的代码与之前的 Phobos 变体进行了比较,并确定在二进制级别的代码中没有任何差异。正如上面所述,这个 8Base 样本32a674b59c3f9a45efde48368b4de7e0e76c19e06b2f18afb6638d1a080b2eb3是从 2023 年 6 月至 8 月期间观察到的SmokeLoader二进制中提取出来的。

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

这两个二进制文件之间唯一发生变化在于最后PE节段中的配置数据。

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

当前 8Base 样本中存在几个在2019年的样本中不存在的函数。

img

8Base 样本中存在但 2019 年示例中不存在的功能列表

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

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

img

8base 样本与 Malwarebytes 博客中的 2019 年样本进行了比较

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

img

Malwarebytes 分析的 2019 年样本中导入的函数列表

我们观察到这个样本的主要区别在于它使用了Windows Crypto API,而不是近期样本中的自定义加密代码。观察2019年样本中存在的功能,我们可以看到这个样本导入了Crypto API:

img

8Base与2019年旧Phobos样本的文件加密功能对比

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

在早期样本中观察到的这些变化支持了Phobos在2019年经历了开发阶段,但自那时以来一直保持不变。

在我们题为“了解 Phobos 附属结构和活动”的第二篇文章中,将提供在阻止扩展名列表中找到的数据,对它是如何映射到不同的行为者组以及这些组进入受害者网络后的行为的进行详细的分析。


Paper 本文由 Seebug Paper 发布,如需转载请注明来源。本文地址:https://paper.seebug.org/3079/


文章来源: https://paper.seebug.org/3079/
如有侵权请联系:admin#unsafe.sh