吉沃运营专员 发表于 2022-12-2 14:17:49

Crytox 勒索软件技术分析

英文原文:https://www.zscaler.com/blogs/security-research/technical-analysis-crytox-ransomware
关键点

[*]Crytox 是一个勒索软件家族,由多阶段的加密代码组成,于 2020 年首次被发现;
[*]勒索软件加密本地磁盘和网络驱动器,并留下带有五天最后通牒的勒索字条,但不会从受害者那里窃取数据;
[*]Crytox 在受感染的系统上放置 uTox Messager 应用程序,使受害者能够与攻击者进行通信和协商;
[*]Crytox 使用 AES-CBC 和每个文件 256 位密钥,该密钥受本地生成的 RSA 公钥保护;
[*]可以通过已知的明文暴力攻击来解密文件;

概要
使用 Crytox 勒索软件的攻击者至少从 2020 年开始就很活跃,但与许多其他勒索软件家族相比,受到的关注要少得多。2021 年 9 月,总部位于荷兰的 RTL 公司公开承认他们受到了攻击,该公司向 Crytox 支付了 8,500 欧元。与目前的赎金要求相比,这个数额相对较低。与大多数勒索软件组织不同,Crytox 攻击者不会执行双重勒索攻击,其中数据既被加密又被勒索。

该组织的作案手法是加密连接的驱动器和网络驱动器上的文件,删除 uTox Messenger 应用程序,然后向受害者显示赎金票据,如下图所示



赎金要求期限设置为五天,以迫使受害者尽快付款

技术分析

ThreatLabz 分析的样本具有以下 SHA256 哈希值 32eef267a1192a9a739ccaaae0266bc66707bb64768a764541ecb039a50cba67。在大多数情况下,Crytox 样本都有 UPX。解压缩后,样本通常约 1.23 MB,因为整个 uTox 客户端都嵌入在恶意软件中。

Cryptox 使用不同的技术来阻止静态分析,包括:


[*]API 哈希
[*]加密配置
[*]加密的 shellcode
[*]远程线程注入

恶意软件的某些部分看起来直接用汇编语言编写,最值得注意的是下图中所示的 AES-CBC 的特定实现的使用。



作者借用了 AES 的代码,并修改了一些部分以满足需要。甚至添加了一种使用 Intel x86 AES 指令的替代算法。奇怪的是,作者选择只实施 Rijndael_Encrypt 例程来解密他们的配置和加密文件。这意味着当他们嵌入配置时,使用 AES 解密例程来加密它们。用于解密 Crytox 配置的密钥是使用 NULL 初始化向量 (IV) 的 AES 查找表 Te1 的第一个或第二个 32 字节块。

第一阶段
该恶意软件使用上述 AES-CBC 实现对第一阶段配置进行加密。在这里,AES 密钥是 Te1 查找表 a5c6636384f87c7c99ee77778df67b7b0dfff2f2bdd66b6bb1de6f6f5491c5c5 的前 32 个字节,如下图所示:



此配置包含以下信息:


[*]硬编码的 2048 位 RSA 公钥;
[*]删除 uTox 客户端应用程序的路径;
[*]要在启动时显示的赎金票据的运行注册表值;
[*]要注入的进程名称;
[*]用于存储恶意软件配置的类注册表项;
[*]解密此配置后,恶意软件会使用 CryptGenKey 函数在本地生成 2048 位 RSA 密钥对,然后使用硬编码公钥对生成的 RSA 私钥进行五次加密;

在子项 HKCR\.waiting\shell\open\command\ 下,勒索软件存储了表 1 中所示的以下值数据对。


ValueData
"en"Generated RSA public key
"n"Encrypted generated RSA private key
""C:\Windows\System32\mshta.exe "C:\ReadMe.hta"

为了确保在启动时显示勒索字条,在下面创建了打开的注册表值和数据 "C:\ReadMe.hta" HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run

一旦存储了 Crytox 配置,代码就会继续定位一个进程以注入第二阶段。创建一个远程线程来执行第一段 shellcode。

第二阶段
此阶段使用 AES-CBC 解密第二个配置,密钥为 5060303003020101a9ce67677d562b2b19e7fefe62b5d7d7e64dabab9aec7676 (这是查找表 Te1 中的第二个 32 字节块)。根据这个解密的配置,shellcode 执行一个批处理文件来删除卷影副本并从日志中删除事件,基本上运行以下命令::

for /F "tokens=*" %%1 in ('wevtutil.exe el') DO wevtutil.exe cl "%%1"
vssadmin.exe Delete Shadows /All /Quiet
diskshadow.exe /s ../pghdn.txt
文件 pghdn.txt 包含 "delete shadows all" 行。

给定以下哈希算法,第二阶段搜索其名称的哈希对应于 0xDCF164CD (explorer.exe) 或 0x561F1820 (svchost.exe) 的进程的进程 ID (pid)。

name = process_name + "\x00"
hash = 0
for c in name.upper():
    hash = ROTR32(hash, 0xD) + ord(c)
在一个新线程中,shellcode 通过将一个硬编码的 4 字母单词 (例如 "CSWS") 与一些基于目标进程的 pid 的随机字符连接起来创建一个互斥体,如下图所示



然后线程使用与第二个配置相同的算法和密钥从原始恶意软件的资源部分解密内容。此资源包含另一个 shellcode,这是最后阶段,该 shellcode 被注入到目标远程进程中。

最后阶段
使用相同的加密算法,将 Te1 查找表的前 32 个字节作为 AES 密钥,最后阶段解密包含以下信息的主要配置:


[*]用于生成文件加密密钥的种子;
[*].hta 格式的赎金票据;
[*]用于列出系统上所有文件的简单正则表达式;
[*]加密文件扩展名 (例如,YOUR ID.waiting);
[*]要删除的权限 (SeBackupPrivilege、SeRestorePrivilege);

首先,代码尝试检索第一阶段存储在注册表配置单元中的配置,如果此配置不存在,Crytox 将创建它。该代码继续在赎金票据中设置倒计时变量,然后替换赎金票据模板中的字符串 YOUR ID。后一个值被替换为一个唯一的受害者 ID,该 ID 由以下伪算法根据加密的本地生成的 RSA 私钥生成:



在加密任何文件之前,恶意软件会删除 SeBackupPrivilege 和 SeRestorePrivilege 权限。使用函数 WNetOpenEnumW 和 WNetEnumResourceW,恶意软件检索连接的驱动器,并为找到的每个驱动器创建一个线程来加密文件。使用函数 GetLogicalDrives 对每个逻辑驱动器应用相同的过程。然后,恶意软件会等待解锁,然后调用 ShChangeNotify 函数来更改图标和文件关联,并向受害者显示勒索信息。

文件加密
发现所有文件的算法是相对标准的,并且依赖于递归方法。Windows 目录以及赎金票据和扩展名为 .waiting 的文件被排除在搜索范围之外。此外,Crytox 只会加密大于 16 字节的文件,这是 AES 的块大小。如果文件大小不是 16 字节的精确倍数,恶意软件将不会填充和加密最后一个数据块。对于大文件,仅读取和加密前 1,048,576 (0x100000) 个字节以优化加密速度。

对于每个文件,都会生成一个新的 256 位 AES 密钥,并使用 AES-CBC 对文件内容进行加密。Crytox 然后在下图中创建以下结构



BLOBHEADER 结构:

.bType = PLAINTEXTKEYBLOB
.bVersion = CUR_BLOB_VERSION
.aiKeyAlg = CALG_AES_256
由于结构未初始化,填充结构填充随机数据。

此结构使用本地生成的 RSA 公钥加密,生成的密码连接到加密文件的末尾,然后是加密生成的 RSA 私钥。加密文件通过将 YOU ID.waiting 附加到原始文件名来重命名,其中 YOUR ID 替换为如前所述计算的受害者 ID。

加密所有存在的文件后,赎金票据将写入每个目录,Crytox 的工艺流程图如下图所示:



密钥生成算法和弱点
如前所述,为每个加密文件生成一个 256 位 AES 密钥,下图中的以下算法用于密钥生成



自定义伪随机密钥生成器函数依赖于以下变量:


[*]通过调用 GetTickCount 确定的种子值;
[*]64 位整数 config_t.random_generated 初始设置为 0;
[*]一个 32 位整数常量 config_t.config_seed;
[*]最后一个值存储在恶意软件的配置中,这个值在 ThreatLabz 分析的样本中是相同的,确定 AES 密钥所需的唯一未知值是加密时 GetTickCount 的值。但是,如果已知文件的某些明文,则可以尝试暴力破解 AES 密钥。

基于文件的魔法值,可以用以下逻辑划分一个暴力破解程序:


[*]将计数器设置为 0
[*]让随机生成器创建一个以计数器为旋转种子的密钥
[*]解密加密文件的第一块
[*]将已知的魔法值与解密数据进行比较
[*]如果值匹配,GetTickCount 的初始值和密钥已成功识别。否则,递增计数器并循环回到 2。

下图中显示了在具有 16 个逻辑内核的机器上运行的暴力破解程序。此处,加密文件为 dotnet-sdk-3.1.416-win-x64.exe (SHA1: 83A53E8770EDD38EDDD37DED63CEF2253FC16979),已知明文为 Windows PE (MZ) 文件头 4D5A9000。



该方法依赖于了解特定偏移处的明文部分。因此,只有特定的文件类型可以被解密。因为种子基于 GetTickCount,如果可以访问主文件表 (MFT) 并且能够定位和解密第一个和最后一个加密文件,则可以推断出 GetTickCount 值的范围。因此,可以大大降低暴力破解范围来解密所有文件。

结论
Crytox 暴露了一些有趣的特性,通过多次自我解密、在不同进程中注入 shellcode、加密其配置和使用 API 哈希来阻碍静态分析。Crytox 的主要文件加密逻辑是标准的,每个文件使用唯一的 AES 密钥,受 RSA 保护。然而,作者选择依靠弱随机生成器来创建新的 AES 密钥。对于当今的计算能力,使用 32 位整数作为种子是不够的。

勒索软件这一类软件由于它们的共同目标而有很多共同点,并且大多数都使用安全加密方案。但是,可能仍然存在实现文件解密而无需访问私钥的弱点。这篇文章中描述的暴力破解方法可以重复用于类似的场景。

IoC
Hashes


[*]1c0bf0c2e7d0c34ec038a8b717bb19d9c4cf3382ada1412f055a9786d3069d78
[*]2115c4c859d497eec163ca33798c389649543d8a6e4db5806a791c6186722b71
[*]307c83924e90f4627f08c2f744cf51f18ec6e246687282a0c1794369ff084f42
[*]3764200cfa673e8796e7c955454b57c20852c2a7931fb9f632ef89d267bbd4c8
[*]6d4e75bc0cc095fef94b9d98a4e94ce9145890b435012b5624aa73621ba6e312
[*]79aff06385c16a98594c6fd314c572bfbe07fbe923f30a627e9b86ac3ab7c071
[*]8ee4a58699ecf02dca516dc6b5b72d93fd9968f672b2be6f8920dfec027d7815
[*]c5550f44332750552921cb5d685ccfbeefa2ab4b03aed8c51c5db52bbe2ff5d4
[*]d60dc6965f6d68a3e7c82d42e90bfda7ad3c5874d2c59a66df6212aef027b455

Files written


[*]C:\ReadMe.hta
[*]Files with ".waiting" extension

Registry keys


[*]HKCR\.waiting\shell\open\command

页: [1]
查看完整版本: Crytox 勒索软件技术分析