在过去的一年里,我们团队发现恶意软件正使用一些新型隐写技术来躲避常规安全工具的检测,而且我们相信这种技术在日后会更加普及,这种技术就是使用新型的“数字隐写术”。
数字隐写术是一种将一个文件、信息、图像或者视频隐藏在另一个文件、信息、图像或者视频中的技术。而使用这种技术的一个典型代表就是 Stegoloader(会被 CYREN 检测为 W32/Gatak),这是一个木马或者勒索软件下载器。
Gatak/Stegoloader 是一个展示攻击者与防御者之间军备竞赛很好的例子。一种新型的数字隐写技术最早在 2011 年发现于 Duqu [ 1 ]恶意软件之中,其被发现通过在 JGP 图像中采用追加的方式传输加密的数据。Zeus/Zbot [ 2 &oldid=711753219)] 恶意软件也采用了类似的方式,将加密后的配置文件追加在图像文件的末尾。然而,现在这种技术已经很容易被内容过滤等机制检出,因为配置文件只是简单的被追加在图像文件的末尾。
而 2015 年出现的 Gatak/Stegoloader [ 3 ]恶意软件,改进这种隐写术,其完全将自己的恶意代码隐藏在了 PNG 图像文件中。到目前为止,我们发现这种恶意软件主要捆绑在一些软件破解工具中,但我们相信其日后也会出现在其他地方。
图 1 展示一个 Gatak 样本(SHA256: 0a58b98205c8542ae0516b4fe3ff8a4a6d6e9c199ec2d4e0de0aa8f9e1290328),其包含两个可执行文件在一个压缩包中。
图 1 一个 Gatak 样本
在运行文件后,软件破解工具(1237.exe)会被执行并显示如图 2 所示的窗口,这个程序用于执行破解指定的软件。当然,与此同时 Gatak 恶意软件(9604.exe)也会在用户不知晓的情况下被运行。
图 2 破解工具
这个恶意软件安装过程相当复杂,具有很多步骤,但只有2个主要部分:
Gatak 恶意软件首先将解密恶意软件的9个代码片段进行组合并放入内存中,随后在内存中对代码进行解密并执行。图 3 展示了这9个代码片段的大小和虚地址,其包含三个部分: .data, .adata 和 sync。
图 3 9个加密代码段的大小和虚地址
解密密钥总计 2 字节大小,且是恶意软件本身的硬编码。解密过程通过交换解密密钥中2个字节并从加密代码中减去这2个字节完成:
解密后的代码会重建自身,首先通过使用 FS:[30] 获取进程环境块(PEB)的位置。随后获取 InLoadOrderModuleList 的地址(见图 4)以找到 ntdll.dll 的虚拟地址。这个 DLL 是用来构建导入 ZwAllocateVirtualMemory,ZwFreeVirtualMemory 和 LdrLoadDll APIs 地址的,而这三个则是用来加载跟多 DLLs 并且通过哈希值来检索所需的 API。
图 4 获取 InLoadOrderModuleList 的代码段
图 5 显示 API 的列表及其对应的哈希值:
图 5 API 的列表及其对应的哈希值
此时,恶意软件通过调用被感染系统的 FindFirstFileA API 接口获取 %USERPROFILE% 文件夹的 ftCreationTime.dwLowDateTime,并将其存储为一个变量以供后续使用。
随后,它通过调用 GetWindowsDirectoryA 和 FindFirstFileA APIs 接口来获取 Windows 文件夹的 ftCreationTime 属性,并尝试与 Windows 时间戳的硬编码数组进行比对,如果找到一个匹配项,则不会感染该系统。与此同时,它还会试图通过检测以下注册表项是否存在,以确定系统不是运行在 Linux 系统上的 wine 程序:
HKEY_CURRENT_USER/Software/Wine
如果此表项存在,则也不会感染此系统,同时终止运行并使用以下命令删除自身:
CMD /C SYSTEMINFO && SYSTEMINFO && SYSTEMINFO && SYSTEMINFO && SYSTEMINFO && DEL "%s"
恶意软件还会试图通过调用带有以下参数的 FindWindowA 和 GetWindowThreadProcessId APIs 接口来得到系统中 explorer.exe 进程的 processID:
如果此方法失败,它将会使用如下命令创建一个 rundll32.exe 进程:
rundll32.exe shell32.dll,Control_RunDLL
然后通过调用 CreateProcessA 和 GetProcessId APIs 接口获取新创建 rundll32.exe 进程的 processID,并通过调用 CreateRemoteThread API 在系统的 explorer.exe 或 新创建的 rundll32.exe 进程中执行注入代码,执行完后会从系统中删除自身。
恶意软件通过检查是否满足以下条件判断是否已经安装到目标系统中:
如图 6 所示,恶意软件会逐步将状态信息更新到 C&C 服务器:
图 6 恶意软件会逐步将状态信息更新到 C&C 服务器
随后调用 InternetOpenA 函数并包含如下 User-Agent 参数:
Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)
和调用 InternetOpenUrlA 函数并包含如下 URL 字符串结构的参数:
http://207.36.---.49/report_[HEX1]_[HEX2]_[COUNTER]_[STATUS]
其中:
恶意软件会尝试下载下列 URL 其中一个链接指向的图片:
图 7 Gatak/Stegoloader下载的包含隐蔽信息的图片
在下载完图片没有执行隐写算法恢复加密数据前,恶意软件还会执行以下过程:
恶意软件通过获取图像像素数据来恢复隐藏在其中的加密数据,像素数据是作为流生成算法中的变量用于还原隐藏的加密数据,“像素数据” 其实是 bitmap 对象里位于 (x,y) 位置的像素颜色,恶意软件通过调用 GdipGetImageHeight、GdipGetImageWidth 和 GdipBitmapGetPixel APIs 来获取图像的像素数据。
图 8 图像中隐藏的加密数据流
其使用 RC4 算法解密图像中隐藏的加密数据,其 8 位硬编码密钥位于偏移位置 0×19:
图 9 开始注入代码
接下来,它会通过校验解密后数据流的 CRC32 值来验证正确性,而解密后的数据流就是 shellcode,其包含如下内容:
图 10 图像中隐藏的解密数据流
命令代码及其描述如下:
其中二进制文件位于:%temp%~XX[random_number].tmp。
图像包含的 shellcode 是用于与如下 C&C 服务器进行通信的后门:
图像中包含的 shellcode 发送的信息的是经过 RC4 算法使用 16 位密钥加密过后的。发送到 C&C 服务器的信息进过解密后的结构如图 11 所示:
图 11 发送到 C&C 服务器的信息进过解密后的结构
如果消息长度超过1024位则会使用 LZMA 算法进行压缩。
发送到 C&C 服务器的消息包含从感染的系统盗取的敏感信息,其格式为: “{“[消息描述]“: “[Base64 编码后的敏感信息]“}”。
图 12 展示了 C&C 服务器接收到信息解密后的结构:
图 12 C&C 服务器接收到信息解密后的结构
下面是 BOT 命令的例子,包括但不限于以下内容:
Gatak/Stegoloader 可能还会安装其他模块或恶意软件以窃取用户敏感信息,发现的一些变种为 Vundo 恶意软件家族的,其会安装广告软件、勒索软件和伪安全软件。这种利用新型数字隐写技术的恶意软件在日后肯定会增强网络犯罪分子隐藏自身代码的效率。
*原文: virusbulletin ,FB小编xiaix编译,转自须注明来自FreeBuf黑客与极客(FreeBuf.COM)