目录导航
概括
DarkTortilla 是一种复杂且高度可配置的基于 .NET 的加密程序,可能至少从 2015 年 8 月开始就一直处于活动状态。它通常提供流行的信息窃取程序和远程访问木马 (RAT),例如 AgentTesla、AsyncRat、NanoCore 和 RedLine。虽然 Secureworks® Counter Threat Unit™ (CTU) 研究人员表示其似乎主要提供商品恶意软件,但它发现 DarkTortilla 样本提供了目标有效载荷,例如 Cobalt Strike 和 Metasploit。它还可以提供“附加包”,例如额外的恶意负载、良性诱饵文档和可执行文件。它具有强大的反分析和防篡改控制功能,可以使检测、分析和根除具有挑战性。
从 2021 年 1 月到 2022 年 5 月,平均每周有 93 个独特的 DarkTortilla 样本被上传到 VirusTotal 分析服务。代码相似之处表明 DarkTortilla 与其他恶意软件之间可能存在联系:由RATs Crew威胁组织运营的加密器,在 2008 年至 2012 年间活跃,而Gameloader恶意软件于 2021 年出现。
传播
对 VirusTotal 样本的 CTU™ 分析揭示了许多通过恶意垃圾邮件 (malspam) 传播 DarkTortilla 的活动。这些电子邮件通常使用物流诱饵,并将恶意负载包含在存档附件中,文件类型为 .iso、.zip、.img、.dmg 和 .tar。电子邮件的语言是针对受害者定制的,CTU 研究人员观察了英语、德语、罗马尼亚语、西班牙语、意大利语和保加利亚语的样本。图 1 显示了一个德语垃圾邮件样本。附加ISO 映像的编辑文件名存档文件 (.iso) 包含发送电子邮件的组织的名称。目前尚不清楚该组织是否受到损害。存档文件包含一个具有相同文件名但扩展名为 .exe 的单个可执行文件。此可执行文件是 DarkTortilla 初始加载程序示例。

(德语文本翻译为“早上好,请为我们附加的订单提供最优惠的价格。等待您的回复。亲切的问候”)。
CTU 研究人员还发现了传播 DarkTortilla 的恶意文档 (maldocs)。这些恶意文档中的大多数都将 DarkTortilla 初始加载程序可执行文件作为 Packager Shell 对象嵌入。图 2 显示了一个示例,该示例提示受害者双击执行负载的嵌入式 Packager Shell 对象。对 Packager Shell Objects 属性的检查发现它是一个名为RFQ-010129H.exe的可执行文件,它是一个 DarkTortilla 初始加载程序示例。其他分析的恶意文档使用不同的方法,例如利用嵌入式宏在受害者打开文档并启用宏时自动执行 Packager Shell 对象。

高级执行流程
DarkTortilla 由两个相互依赖以成功引爆有效载荷的组件组成:一个基于 .NET 的可执行文件(初始加载程序)和一个基于 .NET 的 DLL(核心处理器)。DarkTortilla 有效负载的典型高级执行流程从执行初始加载程序开始。初始加载程序然后检索其编码的核心处理器。虽然编码的核心处理器通常嵌入在初始加载程序的 .NET 资源中,但 CTU 研究人员确定了从公共粘贴站点检索其核心处理器的初始加载程序。 (如 pastebin . pl, textbin . net, 和paste . ee.)
初始加载程序解码、加载和执行核心处理器。执行时,核心处理器提取、解密和解析其配置。加密配置作为位图图像存储在初始加载程序的 .NET 资源中。根据 DarkTortilla 的配置,核心处理器执行以下操作:
- 显示一个虚假的消息框
- 执行反虚拟机检查
- 执行反沙盒检查
- 实现持久化
- 使用“Melt”配置元素将执行迁移到 Windows %TEMP% 目录
- 处理插件包
- 将执行迁移到其安装目录
然后,核心处理器在配置的子进程的上下文中注入并执行其配置的主有效负载。最后,如果已配置,核心处理器会实施防篡改控制,以防止干扰初始加载程序、核心处理器、注入子进程和 WatchDog 可执行文件的执行。
图 3 说明了这个高级 DarkTortilla 执行流程。

初始加载器
CTU 研究人员分析的初始加载程序样本使用DeepSea .NET 代码混淆器进行了混淆。结果,原始代码的许多方面已被更改以阻止分析。例如,命名空间、类、函数和属性名称从其原始描述性值重命名为随机字符。图 4 显示了由dnSpy .NET 分析工具反编译的代码中这些混淆值的示例。

除了名称混淆之外,DeepSea 还对 DarkTortilla 的初始加载程序应用了开关调度控制流混淆。这种技术将原始线性代码重构为 switch 语句,这些语句以看似不可预测的模式转移执行,使分析变得困难。图 5 显示了 DarkTortilla示例入口点的 switch 语句。在此示例中,存储在“num”变量中的值控制接下来执行的代码。该值是模糊的,通常是在运行时计算的条件或数学表达式的结果,例如“ ((!flag) ? 15 : 9) ”或“ Math.Abs(num2 * 25 * 25) ”。

初始加载程序将 DarkTortilla 的加密配置存储为位图图像。图 6 列出了一个样本的部分资源部分,其中包含 700 多张此类图像。

初始加载程序的执行流程通常从通过发出 HTTP GET 请求检查互联网连接开始。在实现此检查的示例中,初始加载程序尝试从 google.com ,bing.com检索内容。或两者兼而有之。一些示例将 URL 作为纯文本存储在可执行文件中(参见图 7),但大多数示例对它们进行编码。如果检查失败,初始加载程序会重试请求,直到全部成功。

初始加载程序生成一个 16 字节的密钥来解码核心处理器。此键基于初始硬编码值乘以其在目标数组中的位置的索引值。因为值存储为单个字节,所以数组中元素的最大值为 0xFF(十进制 255)。例如,初始硬编码值 0x6E(十进制 110)的解码密钥数组为 [0x00,0x6E,0xDC,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF]。
然后初始加载程序检索编码的核心处理器数据。此数据通常驻留在初始加载程序二进制文件的 .NET 资源中。图 8 显示了位于 DarkTortilla示例的“pnj”.NET 资源中的编码核心处理器数据。

初始加载程序通过对每个字节应用以下算法来解码核心处理器数据:
enc_byte ^ (dec_key_arr[idx % len(dec_key_arr)] ^ (idx + (seed_byte %
len(dec_key_arr)) & seed_byte)
- enc_byte:被解码的核心处理器字节数组值
- idx:核心处理器字节数组中的编码字节索引
- dec_key_arr:生成的 16 字节解码密钥字节数组
- seed_byte:16字节解码密钥字节数组的第四个字节
初始加载程序加载解码的核心处理器汇编代码并执行其预先确定的入口点函数。
具有外部托管核心处理器的初始加载程序变体
从公共粘贴站点检索编码的核心处理器的初始加载程序变体首先解码托管核心处理器的 URL。应用于 URL 的编码逻辑因分析的 DarkTortilla 样本而异,使得分析和检测变得困难。图 9 显示了一个 DarkTortilla示例,该示例通过预先添加和附加随机文本对 URL (https://pastebin.pl/view/raw/60b6b03b) 进行编码。

初始加载器检索托管在解码 URL 上的编码字符串。该字符串表示编码的核心处理器数据。该字符串由伪造的 XML 标记、使用移位密码编码的整数值和由随机字母组成的分隔符组成(参见图 10)。下载的数据存储在内存中,永远不会保存到文件系统中。

初始加载程序通过首先删除虚假 XML 标记来解码字符串。通过用一致的字母替换随机字母字符分隔符,然后使用该字母将字符串拆分为整数,将字符串转换为整数数组。最后一步是遍历整数数组并减去一个预定义的值。该值随样本变化。
在图 10 示例中(<xml>1002k1015U1069k925E928s925U925E925g929E925…</xml>),一致的字母分隔符是“k”,预定义的减值是 925:
- 删除 XML 标签:1002k1015U1069k925E928s925U925E925g929E925…
- 用一致字符替换随机字母:1002k1015k1069k925k928k925k925k925k929k925…
- 拆分成整数数组:[1002, 1015, 1069, 925, 928, 925, 925, 925, 929, 925, …]
- 从每个整数中减去预定义的值:[77, 90, 144, 0, 3, 0, 0, 0, 4, 0, …]
此示例的最终整数数组的十六进制表示是 [4D, 5A, 90, 00, 03, 00, 00, 00, 04, 00, …]。该解码数据是核心处理器 DLL(参见图 11)。

核心处理器
核心处理器包含 DarkTortilla 的主要功能。至少从 2020 年 6 月到 2022 年 3 月,恶意软件作者转换了这个 DLL 的有限数量的文件名,这些文件名似乎与功能或目的相关(Deserialize.dll、SHCore1.dll、PVCore1.dll和 SHCore2.dll)。2022 年 3 月,名称开始更频繁地更改为看似随机的名称(例如,BRIN.dll、UKRUSAIN.dll、KNIFALL.dll、NullSBAS.dll)。
配置处理
核心处理器识别初始加载程序中与加密配置关联的以下资源:
- 包含加密配置数据的位图图像资源
- 指定要处理的图像总数的二进制资源
- 包含这些图像和二进制资源的资源文件夹
这些资源的名称是使用初始加载程序中列出的编译时间戳(不是文件的实际编译时间戳)和两个硬编码值来计算的,这些值表示初始化值和资源名称的长度。CTU 研究人员分析的所有 DarkTortilla 样本中的硬编码初始化和名称长度值都是一致的(见表 1)。
初始加载器资源 | 初始化值 | 资源名称长度值 |
---|---|---|
资源文件夹 | 5 | 12 |
图像计数文件 | 80 | 8 |
图像文件 | 20 | 8 |
表 1. 用于派生初始加载程序资源名称的值。
这些名称通过以下过程计算:
- 将编译时间戳除以<初始化值>。
- 使用Math.Round()函数对结果进行舍入。
- 将结果作为种子值传递给Random.Random()函数。通过使用预先计算的种子值,恶意软件作者可以生成可预测的 16 字节值。
- 使用Guid.Guid()函数将 16 字节值转换为 GUID ,该函数转换字节顺序。
- 删除在 GUID 转换期间添加的短划线字符 (‘-‘)。
- 将值截断为 <资源名称长度> 个字符。
例如,以下计算会生成编译时间戳为“Sun May 26 23:57:08 1985”(整数:486014228)的样本的资源文件夹名称:
- 486014228 / 5 = 97202845.6
- Math.Round(97202845.6) = 97202846
- Random.Random(97202846) = d00bee25fa9dc9024fdf632727286708
- Guid.Guid(d00bee25fa9dc9024fdf632727286708) = 25ee0bd0-9dfa-02c9-4fdf-632727286708
- Remove dashes = 25ee0bd09dfa02c94fdf632727286708
- Truncate to 12 characters = 25ee0bd09dfa
对其他组件应用相同的计算表明,此示例的图像计数资源名称为“cd6935eb”,图像基础名称为“d390ea32”。位图格式的图像名称遵循模式 < image_base_name > < image_index >,其中 < image_index > 的值范围从 0 到图像计数资源中指定的值。在此示例中,图像计数资源值为 0x2D4(整数:724),这意味着 DarkTortilla 尝试处理名称为 d390ea32 0、d390ea32 1、d390ea32 2、…、d390ea32 723、d390ea32 724的 725 个位图格式的图像。
为了提取加密配置,核心处理器按顺序遍历每个图像资源,提取像素数据,并将像素数据连接到一个字节数组中(参见图 12)。

使用Rijndael密码(也称为高级加密标准 (AES))解密生成的字节数组,并配置电子密码本 (ECB) 分组密码模式和ISO10126 填充。ISO10126标准于 2007 年撤销,因此使用此填充可能表明 DarkTortilla 的起源可以追溯到 2007 年或更早。用于解密此数据的密钥存储为硬编码整数数组 [81, 42, 59, 7, 27, 70, 83, 13, 71, 75, 17, 9, 39, 64, 3, 2] (参见图 13)。

Key | 类型 | 描述 |
---|---|---|
%Installation% | bool | 安装DarkTortilla并实现持久性 |
%InstallationReg% | string | 用于持久性的注册表项 |
%InstallationKey% | string | 用于持久性的注册表值 |
%InstallationDirectory% | int | 安装根目录 |
%InstallationFolder% | string | 根安装目录中的子文件夹名称 |
%InstallationFileName% | string | 根子文件夹中初始加载器可执行文件的文件名 |
%StartupFolder% | bool | 启用启动文件夹持久性 |
%Hidden% | bool | 启用“隐藏”注册表持久性 |
%HiddenReg% | string | 用于持久性的“隐藏”注册表项 |
%HiddenKey% | string | 用于持久性的“隐藏”注册表值 |
%Message% | bool | 显示假消息框 |
%MessageIcon% | int | 假消息框图标ID |
%MessageButton% | int | 假消息框按钮ID |
%MessageTitle% | string | 假消息框标题 |
%MessageBody% | string | 假消息框消息 |
%MessageRepetition% | bool | 显示假消息框,即使安装 |
%VM% | bool | 执行反虚拟机检查 |
%SB% | bool | 执行反沙箱检查 |
%InjectionPersist% | bool | 对运行的进程启用防篡改控制 |
%StartupPersist% | bool | 启用防篡改控制以保持启动 |
%Melt% | bool | 将初始加载程序执行迁移到Windows %TEMP%目录 |
%MeltName% | string | Windows %TEMP%目录中初始加载器可执行文件的文件名 |
%WatchDogName% | string | 防篡改看门狗可执行文件的文件名 |
%WatchDogBytes% | byte[] | WatchDog字节数组 |
%Compress% | bool | 指示负载是否为zlib压缩 |
%Delay% | int | 在核心处理器中延迟执行的秒数 |
%HostIndex% | int | 用于主/插件负载注入的目标子进程名称的ID |
%MainFile% | byte[] | 主有效负载字节数组 |
%FilesNum% | int | 要处理的插件包数量 |
F.{0}.D | byte[] | 插件包(数据):负载字节数组 |
F.{0}.N | string | 插件包(名称):文件名 |
F.{0}.P | int | Addon package (path):目标安装文件夹(特殊文件夹ID) |
F.{0}.F | string | 插件包(文件夹):目标安装子文件夹 |
F.{0}.O | int | 插件包(操作):执行类型(磁盘,内存,无) |
F.{0}.T | int | 插件包(时间):执行延迟(秒) |
F.{0}.R | int | 插件包(运行):负载执行标准 |
假消息显示
DarkTortilla 可以配置为在执行时显示一个消息框。威胁行为者可以自定义消息框特征,例如显示消息、消息框标题以及图标和按钮配置。威胁参与者使用虚假消息框使受害者认为执行失败或正在加载和安装合法应用程序。表 3 列出了一个 DarkTortilla示例中的配置元素和值。
配置元素 | 在配置中显示的赋值 |
---|---|
%Message% | True |
%MessageIcon% | 16 |
%MessageButton% | 0 |
%MessageTitle% | .Net Framework Initialization Error |
%MessageBody% | To run this application, you first must install one of the following version of the .Net Framework:\r\n.Net Framework, Version = 4.8.0 |
%MessageRepetition% | True |
图 14 显示了使用表 3 中的值配置的 DarkTortilla 示例的消息框。%MessageRepetition% 配置元素控制在安装 DarkTortilla 后消息框是否继续显示并在受感染的系统上持续显示。

“Melt”执行迁移
如果 %Melt% 配置元素设置为 true,则核心处理器将初始加载程序可执行文件移动到 Window 的 %TEMP% 目录。它使用 %MeltName% 配置元素值作为可执行文件名(例如,java.exe、PDF.exe、cookies.exe)。核心处理器运行新的可执行文件,然后终止原始的初始加载程序可执行文件。但是,%TEMP% 目录可能不是初始加载程序的最终目标。如果 %Installation% 配置元素设置为 true,可执行文件可能会再次迁移。
安装
%Installation% 配置元素控制 DarkTortilla 是否将自身安装在系统上。如果设置为 true,核心处理器将当前的 DarkTortilla 可执行文件移动到配置指定的目录中。表 4 列出了存储在一个 DarkTortilla样本中的值。
配置元素 | 值 |
---|---|
%InstallationDirectory% | 38 |
%InstallationFolder% | WindowsPowerShell |
%InstallationFileName% | PowerShellInfo.exe |
分配给 %InstallationDirectory% 配置元素的整数值表示与系统上的特殊文件夹关联的CSIDL值。在表 4 中,值 38 对应于 Windows程序文件目录。基于此配置,此 DarkTortilla 示例的完整安装路径和文件名是“C:\Program Files\WindowsPowerShell\PowerShellInfo.exe”。
要安装,核心处理器会终止当前运行的 DarkTortilla 可执行文件。它将可执行文件复制到配置的安装路径和文件名,然后通过Process.Start()执行安装的可执行文件。
持久性
持久性由 %Installation% 配置元素结合 %Hidden% 和 %StartupFolder% 配置元素控制。DarkTortilla 使用表 5 中的逻辑来确定持久性类型。
%Hidden% | %StartupFolder% | 持久性类型 |
---|---|---|
False | False | 使用注册表HKCU运行键 |
True | True | Windows的启动文件夹 |
False | True | Windows的启动文件夹 |
True | False | 使用注册HKCU Winlogon键 |
表 5. 确定持久性类型的配置元素。
如果两个配置元素都设置为 true,则代码中的错误会导致 %StartupFolder% 逻辑覆盖 %Hidden% 逻辑。恶意软件作者在设置持久性类型的逻辑中错误地使用了“if”语句而不是“else if”(参见图 15)。

对于 Windows 启动文件夹持久性,核心处理器使用WshShortcut COM 对象在 Windows 启动文件夹中创建一个 .lnk 快捷方式文件。该文件指向 DarkTortilla 的初始加载程序可执行文件的配置安装路径和文件名(参见图 16)。

DarkTortilla 具有通过 Windows 注册表实现持久性的标准和隐藏技术。这两个选项都将 HKEY_CURRENT_USER (HKCU) 配置单元中的持久性实现为核心处理器代码中的硬编码值。这种持久性导致每次用户登录时都会运行已安装的 DarkTortilla 初始加载程序可执行文件。
- 对于标准注册表持久性,核心处理器使用 %InstallationReg% 和 %InstallationKey% 值来设置目标键/值组合。在 CTU 研究人员分析的每个配置了标准持久性的样本中,%InstallationReg% 值为“Software\Microsoft\Windows\CurrentVersion\Run”。%InstallationKey% 中存储的值因样本而异(例如,“Updates”、“svchost”、“Runtime Broker”)。
- 对于隐藏注册表持久性,核心处理器使用 %HiddenReg% 和 %HiddenKey% 值来设置目标键/值组合。在 CTU 研究人员分析的每个配置了隐藏持久性的样本中,%InstallationReg% 值为“Software\Microsoft\Windows NT\CurrentVersion\Winlogon”,而存储在 %HiddenKey% 中的值为“Shell”。在设置隐藏的持久性注册表值之前,DarkTortilla 的核心处理器会使用从 HKEY_LOCAL_MACHINE (HKLM) 配置单元中检索到的 Windows shell 值预先安装已安装的初始加载程序可执行路径。该值通常是“explorer.exe”,导致“explorer.exe,< installed_darktortilla_exe_path>”。例如,如果为 DarkTortilla 示例配置的安装路径和可执行文件名称为“C:\Program Files\WindowsPowerShell\PowerShellInfo.exe”,则 HKCU Winlogon\Shell 注册表项为“explorer.exe,C:\ Program Files\WindowsPowerShell\PowerShellInfo.exe”。要创建这些注册表值,核心处理器通过 Process.Start() 执行以下命令:
cmd.exe /c REG ADD "HKCU\<configured_reg_key>" /f /v "<configured_reg_val>" /t
REG_SZ /d "<installed_darktortilla_exe_path>"
RunPE 进程注入
DarkTortilla 可以使用进程注入来执行其有效负载。使用这种方法,有效负载仅驻留在内存中,从不访问文件系统。%HostIndex% 配置元素定义进程注入的目标合法进程(参见表 6)。
%HostIndex% 值 | 对应的目标进程 | 源目录 |
---|---|---|
0 (或任何不是 1-6 的数值) | 初始加载程序可执行文件的名称 | |
1 | AppLaunch.exe | Microsoft.NET 框架文件夹 |
2 | svchost.exe | System32 文件夹 |
3 | RegAsm.exe | Microsoft.NET 框架文件夹 |
4 | InstallUtil.exe | Microsoft.NET 框架文件夹 |
5 | mscorsvw.exe | Microsoft.NET 框架文件夹 |
6 | AddInProcess32.exe | Microsoft.NET 框架文件夹 |
在设置目标进程名称之前,核心处理器会检查名为“avp”的活动进程。avp.exe 进程是卡巴斯基反病毒套件的一部分。如果核心处理器检测到此进程,它将覆盖 %HostIndex% 值并将目标进程名称设置为初始加载程序可执行文件的名称。当 %HostIndex% 值为 1-6 时,核心处理器会尝试将合法的目标可执行文件复制到 Windows %TEMP% 目录。
DarkTortilla 使用名为“RunPe6”的基于 .NET 的 DLL 进行进程注入。该 DLL 作为编码字节数组嵌入到核心处理器中(参见图 17)。

为了解码每个字节,核心处理器使用以下等式,其中<xor_key>作为硬编码整数数组 [45, 89, 125, 69, 250, 222, 111],<seed>作为硬编码整数 99:
decoded_byte = encoded_byte ^ (<xor_key>[(idx * <seed>) % xor_key.Length])
核心处理器加载 RunPe6 并调用其“Runn”函数以在配置的目标子进程的上下文中执行恶意负载。核心处理器不直接引用这个函数。相反,它引用目标类 (18) 和函数 (0) 的索引值。图 18 显示了 CTU 研究人员开发的 PowerShell 代码,用于复制核心处理器的目标功能识别逻辑。

插件包处理
DarkTortilla 可以配置零个或多个称为插件包的有效负载。这些插件是对 DarkTortilla 负责交付的主要有效负载的补充。观察到的插件包括良性诱饵文档、合法可执行文件、键盘记录器、剪贴板窃取程序、加密货币矿工和其他 DarkTortilla 有效负载。每个插件包拥有一组配置元素,由一个静态“F”字符、一个整数“{0}”(表示指示插件在包数组中的位置的索引值)和一个表示与包裹。
%FilesNum% 配置元素定义要处理的插件包的数量。例如,如果 %FilesNum% 值为 3,则配置元素为 F.0。<插件属性>,F.1。<插件属性>和 F.2。<插件属性>。
F.{0}.D(数据)配置元素包含插件包有效负载二进制数据。核心处理器检查 %Compress% 配置元素以确定存储的数据是否被压缩。如果该元素设置为 true,则核心处理器会在处理数据之前对其进行解压缩。
核心处理器接下来通过检查初始加载程序的安装状态和插件包的 F.{0}.R(运行)值来确定它是否应该处理插件包。表 7 列出了标准及其结果。
从安装目录运行的初始加载程序 | F.{0}.R(运行)值 | 处理插件包? |
---|---|---|
真的 | 真的 | 是的 |
真的 | 错误的 | 不 |
错误的 | 真的 | 不 |
错误的 | 错误的 | 是的 |
表 7. 处理插件包的标准。
如果配置为处理插件包,核心处理器会检查 F.{0}.O(操作)配置元素值以确定如何执行其负载。此值可以是任何整数,但通常为 0、1 或 2。如果该值设置为 0 或除 1 或 2 之外的任何值,核心处理器会将有效负载保存到磁盘但不执行它。如果值为 1,则核心处理器将有效负载保存到磁盘并执行它。如果值为 2,则核心处理器通过相同的 RunPE 进程注入技术和它用于主有效负载的目标进程在内存中执行有效负载。
如果负载保存到磁盘,则位置由插件路径 (F.{0}.P)、子文件夹 (F.{0}.F) 和文件名 (F.{0}.N) 配置元素指定. F.{0}.P 整数值表示与系统上的特殊文件夹关联的 CSIDL 值。例如,值 2 对应于 Windows 开始菜单/程序文件夹。包含 F.{0}.P 值为 2、F.{0}.F 为空字符串以及 F.{0}.N 为 sertif.exe 的值的分析样本的完整路径为“C :\Users\ <用户名> \AppData\Roaming\Microsoft\Windows\开始菜单\Programs\sertif.exe”。
主要有效载荷处理
在处理插件包并安装初始加载程序可执行文件(如果合适)之后,DarkTortilla 会处理其主要有效负载。此主要有效负载通常是商品信息窃取程序或远程访问木马 (RAT)。DarkTortilla 将主要负载的二进制数据存储在 %MainFile% 配置元素中。处理此有效负载包括两个步骤:
- 核心处理器查询 %Compress% 配置元素以确定 %MainFile% 配置元素中的二进制数据是否被压缩。如果设置为 true,核心处理器会解压缩数据。
- 核心处理器通过 RunPE 进程注入执行主要有效负载。与插件有效负载不同,没有将主要有效负载保存到文件系统的选项。因此,主要有效载荷仅驻留在内存中。用于注入的目标进程与插件包相同,由 %HostIndex% 配置元素定义。
反分析控制
CTU 研究人员分析的 DarkTortilla 核心处理器样本使用ConfuserEx代码混淆器进行了混淆。除了更改命名空间、类、函数和属性名称的混淆器之外,CTU 研究人员还发现了多个样本,其中注入了特制代码,这些代码不会影响执行,但会禁止使用 dnSpy 等工具进行反编译(参见图 19)。绕过这个反分析控制需要删除导致反编译器中断的代码,识别另一个没有实现这个控制的样本,或者将多个样本的分析拼凑在一起以理解代码。

核心处理器包含检测分析器和调试器的代码,但不会调用这些反分析控件。为了检测分析,代码验证COR_ENABLE_PROFILING环境变量是否存在并将值设置为 1。为了检测调试器,代码生成一个线程(参见图 20),该线程不断检查Debugger.IsAttached属性和Debugger.IsLogging方法. 如果核心处理器识别出调试器或执行检查的线程终止,则代码终止初始加载程序进程。目前尚不清楚此代码是由 ConfuserEx 还是恶意软件作者添加的。

核心处理器实现字符串编码以隐藏重要的字符串,例如配置键。图 21 显示了一个代码摘录,它传递了字符串长度 (17)、字符索引数组 ([26,8,13,18,19,0,11,11,0,19,8,14,13,17,4, 6,26])和大写字母索引数组([8,17])到解码函数。

此函数通过遍历字符索引数组中的每个值并检索硬编码字符数组中指定索引处的相应字符来解码字符串(参见图 22)。

图 21 显示示例中传递给解码函数的字符索引数组的前三个值是 26、8 和 13。这些值对应于硬编码中的字符“%”、“i”和“n”字符数组如图 22 所示。大写字母索引数组 (8, 17) 中传递的值指示哪些字符应大写(本例中为“I”和“R”)。处理字符索引数组会产生解码的字符串“%InstallationReg%”。
%VM% 配置元素启用 DarkTortilla 的反虚拟机 (anti-VM) 控件。如果设置为 true,则核心处理器通过查询以下 Windows Management Instrumentation (WMI) 对象来获取有关系统的信息:
核心处理器还检索有关系统正在运行的进程和服务的信息。然后,它会检查这些数据中与 Hyper-V、QEMU、Virtual PC、VirtualBox 和 VMware 关联的字符串。如果任何不区分大小写的数据符合表 8 中的标准,核心处理器将终止初始加载程序进程。
有针对性的技术 | 被检查单位 | 检查逻辑 |
---|---|---|
Hyper-V | Win32_DiskDrive | 标题包含“virtual” |
Hyper-V | Win32_ComputerSystem | 制造商包含”microsoft”,型号包含”virtual” |
QEMU | Win32_DiskDrive | 名称包含“qemu” |
Virtual PC | Process | 进程列表包含“vmusrvc”或“vpcmap”和“vmsrvc” |
VirtualBox | Win32_DiskDrive | 模型包含“vbox” |
VirtualBox | Process | 进程名包含“vboxservice” |
VMware | Win32_DiskDrive | 名称包含“虚拟机” |
VMware | Win32_DiskDrive | 模型包含“虚拟机” |
VMware | Win32_ComputerSystem | 厂商包含“vmware”,型号包含“virtual” |
VMware | Win32_BIOS | 序列号包含“vmware” |
VMware | Win32_PnPEntity | 名称等于“vmware pointing device” |
VMware | Win32_PnPEntity | 名称中包含”vmware sata” |
VMware | Win32_PnPEntity | 名称等于 “vmware usb pointing device” |
VMware | Win32_PnPEntity | 名称等于 “vmware vmci bus device” |
VMware | Win32_PnPEntity | 名称等于 “vmware virtual s scsi disk device” |
VMware | Win32_PnPEntity | 名称开始于”vmware svga” |
VMware | Service | Service Image Path包含“vmware”,ServiceName等于“vmtools” |
VMware | Service | ServiceImagePath包含“vmware”,ServiceName等于“tpvcgateway” |
VMware | Service | ServiceImagePath包含“vmware”,ServiceName等于“tpautoconnsvc” |
%SB% 配置元素启用 DarkTortilla 的反沙盒控制。此控件仅检测Sandboxie沙箱。如果核心处理器在当前会话中检测到名为“sandboxierpcss”的正在运行的进程,则核心处理器终止初始加载程序进程。
防篡改控制
DarkTortilla 的防篡改控制是其执行链中的最后一步,发生在主要有效负载执行之后。这四个控件确保没有任何东西干扰 DarkTortilla 对其关键组件的执行。
- 第一个防篡改控制由核心处理器采用,并确保运行主有效负载的注入子进程在终止时立即重新运行。%InjectionPersist% 配置元素调节此控件。如果设置为 true,核心处理器将启动一个线程来监视注入的子进程的状态。如果子进程被终止,这个防篡改控制会自动重新生成配置的目标子进程,重新注入主有效负载,并在子进程的上下文中执行它。
- 第二个防篡改控制确保初始加载程序可执行文件在终止后立即重新运行。DarkTortilla 使用基于 .NET 的辅助可执行文件实现此功能,它称为“WatchDog”。%InjectionPersist% 配置元素调节此控件。如果设置为 true,核心处理器会将 WatchDog 可执行文件及其配置文件放到 Windows %TEMP% 目录中。然后它执行 WatchDog 可执行文件,它监视初始加载程序进程。WatchDog 可执行字节存储在 DarkTortilla %WatchDogBytes% 配置元素中,文件名存储在 %WatchDogName% 中。如果 %Compress% 配置元素设置为 true,则在处理之前,核心处理器会解压缩 WatchDog 可执行文件的字节。DarkTortilla 删除的每个WatchDog 可执行文件都是相同的:
- MD5 哈希:0e362e7005823d0bec3719b902ed6d62
- SHA1 哈希:590d860b909804349e0cdc2f1662b37bd62f7463
- SHA256 哈希:2d0dc6216f613ac7551a7e70a798c22aee8eb9819428b1357e2b8c73bef905ad
如果 Windows %TEMP% 目录中已存在配置了 WatchDog 名称的可执行文件,则核心处理器将删除现有可执行文件的Zone.Identifier Alternate Data Stream (ADS),这会剥离任何现有URL 安全区域的可执行文件。然后它用新的 WatchDog 可执行文件覆盖现有的可执行文件。拖放到文件系统的 WatchDog 配置文件与 WatchDog 可执行文件具有相同的名称,但使用 .txt 文件扩展名。例如,“WatchDog.exe”的配置文件名为“WatchDog.txt”。此配置文件包含代表以下值的三行:- 初始加载程序可执行文件的进程 ID
- 初始加载程序可执行文件的路径和文件名
- WatchDog 可执行文件的进程 ID
如果初始加载程序终止,WatchDog 进程将重新运行它并使用新的进程 ID 信息刷新 WatchDog 配置文本文件的内容。 - 核心处理器采用第三个防篡改控制,确保删除的 WatchDog 可执行文件继续执行。核心处理器每秒从 WatchDog 配置文件中检索一次 WatchDog 可执行进程 ID,并验证相应进程是否正在运行。如果 WatchDog 进程终止,核心处理器会中断循环,丢弃新的 WatchDog 配置文件,并重新运行 WatchDog 可执行文件。
- 第四个防篡改控制由核心处理器采用,并保持初始加载程序的持久性。%StartupPersist% 配置元素调节此控件。如果设置为 true,核心处理器将使用 DarkTortilla 配置中定义的持久性类型每 30 秒启动一个设置持久性的线程。该控件不包含用于检查持久性状态的验证逻辑,因此它无限期地重复该过程。
延迟执行
核心处理器实现 kernel32.dll 休眠功能,以延迟进程后续阶段的执行。延迟长度通常由 %Delay% 配置元素中的值控制。CTU 研究人员观察到的值从 0 秒到 300 秒不等。
- 在实现持久性之前,核心处理器休眠 %Delay% 配置元素指定的秒数。
- 在处理插件包之前,核心处理器休眠 %Delay% 配置元素指定的秒数。
- 在将源可执行文件复制到安装目录之后,但在运行可执行文件之前,核心处理器会休眠 5 秒的硬编码。
如果 %Melt% 和 %Installation% 配置元素设置为 true,则延迟的数量会增加,因为每次迁移可执行文件时都会处理延迟。如果超过最大等待时间,这些延迟可能会阻碍沙盒环境中的检测。
可能的恶意软件连接
DarkTortilla 代码与其他恶意软件有相似之处。例如,有效载荷压缩、垃圾代码包含和通过RunPe6执行有效载荷也是 RATs Crew 加密器在 2016 年最后更新的功能。DarkTortilla 可能代表该加密器的演变。此外,Gameloader 恶意软件使用与 DarkTortilla 类似的恶意垃圾邮件诱饵和存档文件。它还利用 .NET 资源来存储编码的 DLL 和加密的位图图像,并提供类似的商品恶意软件负载。但是,截至本博客,没有足够的证据将这些恶意软件家族或威胁参与者与 DarkTortilla 明确联系起来。
结论
研究人员经常忽略 DarkTortilla 并专注于其主要有效载荷。然而,DarkTortilla 能够规避检测,高度可配置,并提供各种流行且有效的恶意软件。它的能力和普遍性使其成为一个可怕的威胁。
威胁指标
表 9 中的威胁指标可用于检测与 DarkTortilla 相关的活动。该 URL 可能包含恶意内容,因此请在浏览器中打开它之前考虑风险。
指标 | 类型 | 描述 |
---|---|---|
59295e810bbdbfd64b8c41316ea13cae | MD5 哈希 | 提供 DarkTortilla 的恶意垃圾邮件 |
18391a58ee25a5cb8dfbf4d48517b5b0 c66c5ae6 | SHA1 哈希 | 提供 DarkTortilla 的恶意垃圾邮件 |
981aa83b2d33cca994021197237ac5ee 3ad3402f7d25f04f4e76985f4ec8744c | SHA256 哈希 | 提供 DarkTortilla 的恶意垃圾邮件 |
84872b60072011eab8940f3b49bdb582 | MD5 哈希 | DarkTortilla 初始加载程序 |
3da0f44d45a1d6676d52ce691d2f6d75 4eb3097e | SHA1 哈希 | DarkTortilla 初始加载程序 |
5e03556be992d23088a3c49d24c45b1c 21cd275bffb4e536348e8128d50374b6 | SHA256 哈希 | DarkTortilla 初始加载程序 |
2d74df3ce221f6ff48d20bac158a3e78 | MD5 哈希 | 提供 DarkTortilla 的恶意文件 |
0563e691801251cdfd363eee31858ead 5ee3928b | SHA1 哈希 | 提供 DarkTortilla 的恶意文件 |
4f15b28c91fa0e8d0dd9e86481bad04f a34fcaf564d08de7c4c0c513fc6e122d | SHA256 哈希 | 提供 DarkTortilla 的恶意文件 |
827258f907c5087f498c413d28e2203e | MD5 哈希 | DarkTortilla 初始加载程序 |
5e0cb6076002b11a39636e07a217b493 835e5bce | SHA1 哈希 | DarkTortilla 初始加载程序 |
55d7d9bd9d4a511417033b6c14ce93f9 62d6a6e6c6414f0cb7e455baee1d3ab7 | SHA256 哈希 | DarkTortilla 初始加载程序 |
c37aae0ff565a2e44f144f837b750279 | MD5 哈希 | DarkTortilla 初始加载程序 |
dde386911b091e894746b0f12d88a1fd 18761fb9 | SHA1 哈希 | DarkTortilla 初始加载程序 |
a0b96236bfd79d2ebeadb8e3deb9448a f3ec8edd1ea9672b7ad4793934bb4c47 | SHA256 哈希 | DarkTortilla 初始加载程序 |
93fe6600c51014d7d6c2afedf8398f92 | MD5 哈希 | DarkTortilla 初始加载程序 |
8f7340704745f3d53b284c101e93c42f 8d4c2adc | SHA1 哈希 | DarkTortilla 初始加载程序 |
45ef054bca2ae4d67e6623bf28ff75e5 d178924602674c654e1b569aa74601cd | SHA256 哈希 | DarkTortilla 初始加载程序 |
6e91ad0972e104a277505104abe39d1e | MD5 哈希 | DarkTortilla 初始加载程序 |
261d699c3bb1a0042b88a45ed340f2d8 6149464f | SHA1 哈希 | DarkTortilla 初始加载程序 |
b3754c6ecc445e9a3b37c5ebe68adb96 30ca4aa89a8e8515468f39ae8131f141 | SHA256 哈希 | DarkTortilla 初始加载程序 |
cd49f7c3c4e82dee128eeedea9879bc33 | MD5 哈希 | DarkTortilla 初始加载程序 |
619bf90a8ea219e34bf57dda1a322914 b9fa1c81 | SHA1 哈希 | DarkTortilla 初始加载程序 |
0a5dc3b6669cf31e8536c59fe1315918 eb4ecfd87998445e2eeb8fed64bd2f2c | SHA256 哈希 | DarkTortilla 初始加载程序 |
851816aa8cf45ba769f0d9420acfb3e5 | MD5 哈希 | DarkTortilla 初始加载程序 |
4178d5efa388caf2d0ffd4539cf285b1 de5ffab6 | SHA1 哈希 | DarkTortilla 初始加载程序 |
083acce46cb8cf35e37c778d1f4aee68 14bca72d2874b793a47f9823f51df0fe | SHA256 哈希 | DarkTortilla 初始加载程序 |
f44695a8febb2a35576a59fa984629d2 | MD5 哈希 | DarkTortilla 初始加载程序 |
37ec57e5da46dc1990941a1bb3ffab9e 74db346a | SHA1 哈希 | DarkTortilla 初始加载程序 |
53b3b37b7d1e40c80fcda2c424cd8373 79ac2ce93023de6c22ba3e2d94679671 | SHA256 哈希 | DarkTortilla 初始加载程序 |
8d8c551dd572a1dc158de239b37eaa9a | MD5 哈希 | DarkTortilla 初始加载程序 |
6d4b4bcd107b09af37996c73a6448379 a31aaac4 | SHA1 哈希 | DarkTortilla 初始加载程序 |
5be86cfca25e295f88b5aab42a6f604d 2f1bb97f3c73b01df664c137908e2ec4 | SHA256 哈希 | DarkTortilla 初始加载程序 |
0f89a2015ed9c1be5522e27c00276e52 | MD5 哈希 | DarkTortilla 核心处理器 (PVCore1) |
5ad5b35f6cc093067c6f219f2d2107f4 4248c5bb | SHA1 哈希 | DarkTortilla 核心处理器 (PVCore1) |
93dd1202697dbaed9ef4f4707f262821 2bf13aad096de29c14924b1dae1d6d5b | SHA256 哈希 | DarkTortilla 核心处理器 (PVCore1) |
0e362e7005823d0bec3719b902ed6d62 | MD5 哈希 | DarkTortilla 看门狗可执行文件 |
590d860b909804349e0cdc2f1662b37b d62f7463 | SHA1 哈希 | DarkTortilla 看门狗可执行文件 |
2d0dc6216f613ac7551a7e70a798c22a ee8eb9819428b1357e2b8c73bef905ad | SHA256 哈希 | DarkTortilla 看门狗可执行文件 |
https://pastebin.pl/view/raw/60b6b03b | 网址 | DarkTortilla 编码核心处理器下载 |
参考
阿恩茨,彼得。“解释:Packer、Crypter 和 Protector。” 恶意软件字节实验室。2017 年 3 月 27 日。https://blog.malwarebytes.com/cybercrime/malware/2017/03/explained-packer-crypter-and-protector/
哈希雷扎德。“新 .NET 加密器中的彩虹、隐写术和恶意软件。” 恶意软件字节实验室。2016 年 3 月 30 日。https://blog.malwarebytes.com/threat-analysis/2015/08/rainbows-steganography-and-malware-in-a-new-net-cryptor/
“老鼠船员。” 黑客论坛。2021 年 6 月 21 日。https://wiki.hackforums.net/RATs_Crew
GoSecure 泰坦实验室。“Discord Malspam 活动中的新恶意软件‘Gameloader’。” 安全。2021 年 11 月 2 日。https://www.gosecure.net/blog/2021/11/02/new-malware-gameloader-in-discord-malspam-campaign-identified-by-gosecure-titan-labs/
转载请注明出处及链接
图片中的混淆怎么那么像Eazfuscator