关于ZAKER 融媒体解决方案 合作 加入

WAV 文件暗藏恶意 payload

简介

BlackBerry Cylance 发现在 WAV 音频文件中有潜入的混淆后的恶意代码。每个 WAV 文件中都有一个用于解码和执行恶意内容的加载器组件。播放时,部分 WAV 文件产生的音乐没有任何质量问题,但部分文件播放时会生成白噪声。

研究人员进一步分析发现其中一些 WAV 文件中含有与 XMRig 门罗币挖矿机相关的代码。其他样本中含有用来建立反向 shell 的 Metasploit 代码。所有的 payload 都是在相同环境中找到的,表明攻击活动部署恶意软件的两个目的:获取经济收益和在受害者网络中建立远程访问。

WAV 文件加载器可以分成 3 大类,分别是:

1. 使用 Least Significant Bit ( 最低有效位,LSB ) 隐写术来解码和执行 PE 文件的加载器。

2. 使用基于 rand ( ) 的解码算法来解码和执行 PE 文件的加载器。

3. 使用基于 rand ( ) 的解码算法来解码和执行 shell 文件的加载器。

每个方法都允许攻击者来从非恶意的文件格式中执行代码。这些技术证明了可执行的内容理论上可以隐藏在任意文件类型中,而攻击者可以不破坏容器格式的结构和处理。使用该策略引入了一层额外的混淆,因为底层代码只在内存中出现,因此很难检测。

加载器

隐写 PE 加载器

概述

加载器的第一类使用隐写术来从 WAV 文件中提取可执行文件的内容。隐写术是将文件或消息隐藏到另一个文件中的实践,理想情况下也不会引起目标文件的怀疑。攻击者使用隐写术可以隐藏数据。研究人员发现的 WAV 文件加载器具有以下特征:

该加载器中含有硬编码的字符串,其中指定了要加载的文件名 ( "Song.wav" ) 和要执行的导出函数。Song.wav 文件位于一个 zip 文件中:

执行后,加载器会读取 Song.wav,在内存中提取 DLL,执行 "Start" export。提取的文件与 XMRig 门罗币 CPU 挖矿机相关:

攻击者部署 CPU 挖矿机来窃取处理资源,并利用加密货币挖矿来获益。加密货币挖矿机是主流的恶意软件 payload,因为提供了经济利益而且可以在用户毫不知情的情况下在后台运行。一个高效的加密货币僵尸网络每个月可以为攻击者产生上千美元的收益。

技术细节

WAV ( RIFF ) 文件的 header 为 44 字节,最后 4 字节表明 data section 的大小。在 Song.wav 文件中,数据大小为 0xE79F20 ( 低字节序 ) 或 15,179,552 字节:

图 1: WAV 文件 header – data 大小

在下面的代码段中,加载器按 4 字节读取,并使用这些值来在内存中分配字节。然后读取数据,并关闭 WAV 文件。最后,do-while 循环,并提取 LSB 来决定解码的数据的大小:

图 2: 解码文件大小

为了更好地理解上面的代码,认识到当 counter < 32 时就会执行循环,每执行因此 counter 就会加 1。data_offset 表示编码的数据中的偏移量,每个循环该值会加 2,该值是从 0 开始的。该循环会覆盖数据的前 64 个字节 ( 32 * 2 ) :

图 3: WAV 文件数据 – 64 字节

对每个处理的字节,加载器会提取 LSB,并在 decoded_size 中分配适当的比特位置,从 31 开始每个循环减 1。应用算法到数据的前 64 个字节:

最后的 32 位二进制值 00000000 00001011 00110010 00000000 用十六进制表示是 0xB3200,十进制为 733,696。该值位于 decoded_size 中。

然后,会分配 decoded_size 大小的内存,并执行不同的计算。默认标记名会被修改来表示所有计算的结果。这些数会用作下一个解码循环的编码数据中的偏移量:

图 4: 分配内存和计算偏移量

Do-while 循环开始解码编码数据的剩余部分:

图 5: 解码文件内容

这部分循环会提取每个字节的 LSB。有一点不同是它会在最低比特位来分配位置。每个循环会从 8 字节中提取 LSB 来组成解码数据的 8 比特(1 字节)。应用算法来生成解码数据的 2 字节。因为 8 比特组成了一个解码的字节,LSB 是从每 2 个编码的字节中提取的,生成 2 个解码的字节需要 32 个编码的字节(2 个解码字节 * 8 LSB(每个解码字节)* 2 = 32):

图 6: 编码数据的 32 字节

解码的数据的第 1 个字节会生成:

生成解码数据的第 2 个字节:

第一个 2 字节是二进制值分别是 01001101 和 01011010。十六进制表示就是 0x4D5A,这就是 Windows PE 文件开始的 MZ 字节。

do-while 循环会继续直到内存中生成了 XMRig DLL。最后,解码的 DLL 会与内存进行映射,start export 也会执行来驱动加密货币挖矿活动。

基于 Rand ( ) 的 PE 加载器

第二类加载器使用基于 rand ( ) 的解码算法来隐藏 PE 文件。样本具有以下特征:

为加载 WAV 文件,加载器必须使用以下命令行:

WAV 文件具有以下特征:

与第一类加载器中的 WAV 文件不同,此类音频文件样本有合法的 header,但播放时没有音乐,音频听起来就像是白噪声一样。

加载器执行时,会读取 WAV 文件,在内存中提取 DLL 文件,尝试执行特定的入口点。与第一个场景类似,提取的文件也与 XMRig 门罗币加密货币挖矿机有关:

事实上,文件结尾的 4 个字节不同外,该文件与从 Song.wav 中解码的 dll 是相同的。

技术细节

执行后,加载器会读取 WAV header,提取 data 大小,对应地分配内存,并存储 WAV 数据到新分配的内存中。然后加载器会用运行负责解码 WAV 文件数据内容的代码:

图 7: 基于 Rand ( ) 的 PE 加载器解码循环

size_of_data 表述从 WAV header 中提取的数据大小,wave_data 含有编码的 WAV 数据的地址。加载器使用到 srand ( ) 的初始调用,并重复调用 rand ( ) 来从 WAV 数据中提取 PE 文件。给定 srand ( ) 的 seed 值,调用 rand ( ) 会生成相同的伪随机数。

do-while 循环会便利编码数据的每个字节,用从编码的字节中减去 rand ( ) 输出的结果来替换字节。比如,解码数据的前 2 个字节:

使用加载器和 section 中指定的 WAV 文件,下图寿命了 srand ( ) seed 值 0x309 的前 2 个循环的值:

前 2 个字节表示 Windows 可执行文件开头的 MZ 字符。循环运行所有数据字节后,结果就是一个与 XMRig 门罗币挖矿机相关的 64 位 DLL。生成的 DLL 与 Song.wav 中解码的 DLL 只有 4 个字节不同:

图 8: 解码的 click.wav 和 Song.wav

目前还不清楚为什么这些字节是不同的,这些不同的字节并不影响 DLL 的功能,所以 XMRig DLL 文件实际上是相同的。

然后,加载器需要获取命令行中指定的 export 的地址。如果存在,加载器就会启动一个线程来执行:

图 9: 识别 export 地址并启动线程来执行

基于 Rand ( ) 的 Shellcode 加载器

第 3 类加载器使用基于 rand ( ) 的解码算法来隐藏 PE 文件。加载器样本具有以下特征:

为了在加载器中加载 WAV 文件,必须读取下面命令行的内容:

与前面介绍的加载器类似,音频文件中只含有白噪声没有音乐。执行后,加载器会打开一个可共用的 WAV 文件,读取数据,解码内容,尝试执行 shellcode。

加载器会读取 WAV header,确定 data 大小,分配内容,并读取数据。解码的代码也是相同的,包括使用的 srand ( ) seed:

图 10: 基于 Rand ( ) 的 shellcode 加载器解码循环

唯一的不同的解码循环完成后立刻调用 CreateThread。该加载器只处理 shellcode。Shellcode 会尝试连接 IP 94.249.192.103。反向 TCP 连接发生在 3527 端口,而反向 HTTPS 连接发生在 443 端口。

结论

总的来看,攻击者在执行代码的方法上非常具有创意,包括使用不同文件格式的多个文件。研究人员发现了多个从 WAV 音频文件中提取和执行恶意代码的加载器样本。分析发现恶意软件作者使用隐写术和其他编码技术来反混淆和执行代码。这些战略使攻击者可以隐藏可执行文件的内容,并使检测变得很难。在本例中,攻击者使用混淆技术来执行加密货币挖矿活动,并并命令和控制建立反向连接。

以上内容由"嘶吼RoarTalk"上传发布 查看原文

觉得文章不错,微信扫描分享好友

扫码分享