神刀安全网

隐藏在图片中的恶魔:揭秘“数字隐写术”工作原理

简介

在过去的一年里,我们团队发现恶意软件正使用一些新型隐写技术来躲避常规安全工具的检测,而且我们相信这种技术在日后会更加普及,这种技术就是使用新型的“数字隐写术”。

数字隐写术是一种将一个文件、信息、图像或者视频隐藏在另一个文件、信息、图像或者视频中的技术。而使用这种技术的一个典型代表就是 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个主要部分:

  1. 初始化解密和安装恶意软件;
  2. 下载图片并使用隐藏在图片中的数据建立与 C&C 服务器的加密通信,然后上传或下载更多的恶意软件。

步骤1:初始化安装恶意软件

Gatak 恶意软件首先将解密恶意软件的9个代码片段进行组合并放入内存中,随后在内存中对代码进行解密并执行。图 3 展示了这9个代码片段的大小和虚地址,其包含三个部分: .data, .adata 和 sync。

隐藏在图片中的恶魔:揭秘“数字隐写术”工作原理

图 3 9个加密代码段的大小和虚地址

解密密钥总计 2 字节大小,且是恶意软件本身的硬编码。解密过程通过交换解密密钥中2个字节并从加密代码中减去这2个字节完成:

  1. 将加密代码减去解密密钥的 2 个字节。
  2. 调整解密密钥使用另外的字节密钥。
  3. 将解密的代码存储到分配的缓冲区中。
  4. 增加一个指向下一个加密代码的指针。
  5. 增加一个指向下一片缓冲区位置的指针。
  6. 重复第 1 步。

解密后的代码会重建自身,首先通过使用 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:

  • lpClassName = “Shell_TrayWnd”
  • lpWindowName = NULL

如果此方法失败,它将会使用如下命令创建一个 rundll32.exe 进程:

rundll32.exe shell32.dll,Control_RunDLL 

然后通过调用 CreateProcessA 和 GetProcessId APIs 接口获取新创建 rundll32.exe 进程的 processID,并通过调用 CreateRemoteThread API 在系统的 explorer.exe 或 新创建的 rundll32.exe 进程中执行注入代码,执行完后会从系统中删除自身。

恶意软件通过检查是否满足以下条件判断是否已经安装到目标系统中:

  • 通过调用 GlobalFindAtomA API 查找 AtomName = “1234554321″
  • 打开注册表键:HKEY_CURRENT_USER/Software/Microsoft[unique_string_through_hash_of_computer_name]

如图 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] 

其中:

  • [HEX1] 是计算机名称的十六进制字符串
  • [HEX2] 是 %USERPROFILE% 文件夹的 ftCreationTime.dwLowDateTime 属性值
  • [COUNTER] 是过程状态计数器
  • [STATUS] 是表示状态的字符串

步骤2:下载带有加密信息的图片

恶意软件会尝试下载下列 URL 其中一个链接指向的图片:

隐藏在图片中的恶魔:揭秘“数字隐写术”工作原理

图 7 Gatak/Stegoloader下载的包含隐蔽信息的图片

在下载完图片没有执行隐写算法恢复加密数据前,恶意软件还会执行以下过程:

  1. 通过检测文件头部是否具有 ’0x89PNG’ 字节来判断图片为 PNG 文件。
  2. 通过调用 GdiplusStartup API 查看是否已正确初始化 Windows GDI。
  3. 通过调用 CreateStreamOnHGlobal 和 GdipCreateBitmapFromStream APIs 检查是否可以创建 bitmap 对象以用于从下载的图像中恢复像素数据。

恶意软件通过获取图像像素数据来恢复隐藏在其中的加密数据,像素数据是作为流生成算法中的变量用于还原隐藏的加密数据,“像素数据” 其实是 bitmap 对象里位于 (x,y) 位置的像素颜色,恶意软件通过调用 GdipGetImageHeight、GdipGetImageWidth 和 GdipBitmapGetPixel APIs 来获取图像的像素数据。

隐藏在图片中的恶魔:揭秘“数字隐写术”工作原理

图 8 图像中隐藏的加密数据流

其使用 RC4 算法解密图像中隐藏的加密数据,其 8 位硬编码密钥位于偏移位置 0×19:

隐藏在图片中的恶魔:揭秘“数字隐写术”工作原理

图 9 开始注入代码

接下来,它会通过校验解密后数据流的 CRC32 值来验证正确性,而解密后的数据流就是 shellcode,其包含如下内容:

  • 位于偏移位置 0×4 的命令代码指示如何处理远程注入的代码。
  • 长度(位于偏移位置0×0 DWORD 的长度)和 shellcode 的CRC32 值作为 CRC32 校验函数的变量(位于偏移位置 [length_of_shellcode + 4] DWORD 的大小)。
  • 硬编码字节密钥(位于偏移位置 0xb)用于加/解密恶意软件与 C&C 服务器的通信数据。
  • 图像 shellcode 的硬编码字节密钥 ID 位于偏移位置 0×21。

隐藏在图片中的恶魔:揭秘“数字隐写术”工作原理

图 10 图像中隐藏的解密数据流

命令代码及其描述如下:

  • 0×10:在内存中执行 payload
  • 0×20:创建并执行 payload 代码(二进制文件)
  • 0×21:创建然后执行在删除 payload 代码(二进制文件)

其中二进制文件位于:%temp%~XX[random_number].tmp。

图像包含的 shellcode 是用于与如下 C&C 服务器进行通信的后门:

图像中包含的 shellcode 发送的信息的是经过 RC4 算法使用 16 位密钥加密过后的。发送到 C&C 服务器的信息进过解密后的结构如图 11 所示:

隐藏在图片中的恶魔:揭秘“数字隐写术”工作原理

图 11 发送到 C&C 服务器的信息进过解密后的结构

  • @ Offset 0 = shellcode 的 16 位密钥。
  • @ Offset 0×10 = 4 比特的 CRC32 校验码,校验内容从偏移位置 0×14 开始直到消息结束。
  • @ Offset 0×14 = shellcode 16 位命令 ID,通过调用 SystemFunction036 API 随机生成。
  • @ Offset 0×24 = shellcode 16 位函数 ID,在 shellcode 开始执行时通过调用 SystemFunction036 API 随机生成。
  • @ Offset 0×34 = 消息头部。
  • @ Offset 0×35 = 8 位的消息会话 ID,初始化与 C&C 服务器进行通信。
  • @ Offset 0x3D = BOT 命令。
  • @ Offset 0x3E = 成功/错误标识,操作成功时为0。
  • @ Offset 0x3F = 消息标识,当消息成都超过1024位时置为1。
  • @ Offset 0×40 = 消息长度。
  • @ Offset 0×44 = 消息起始。

如果消息长度超过1024位则会使用 LZMA 算法进行压缩。

发送到 C&C 服务器的消息包含从感染的系统盗取的敏感信息,其格式为: “{“[消息描述]“: “[Base64 编码后的敏感信息]“}”。

图 12 展示了 C&C 服务器接收到信息解密后的结构:

隐藏在图片中的恶魔:揭秘“数字隐写术”工作原理

图 12 C&C 服务器接收到信息解密后的结构

  • @ Offset 0 = 4-byte CRC32 value starting at offset 4 until the end of the message.
  • @ Offset 4 = C&C 服务器的 16 位命令 ID。
  • @ Offset 0×14 = 消息头部。
  • @ Offset 0×15 = 8 位的消息会话 ID。
  • @ Offset 0x1D = BOT 命令。

下面是 BOT 命令的例子,包括但不限于以下内容:

  • 0×01 = 无操作,只用于与 C&C 服务器进行通信。
  • 0×02 = 执行 payload 通过 shellcode 或二进制文件。
  • 0×03 = 检索系统信息 (例如:IP地址、域名、进程信息等)。
  • 0×04 = 检索软件安装情况。
  • 0×05 = 检索 web 浏览器历史记录。
  • 0×64 = 执行 shellcode。
  • 0xDC = 检索 Windows 文件夹时间戳。

总结

Gatak/Stegoloader 可能还会安装其他模块或恶意软件以窃取用户敏感信息,发现的一些变种为 Vundo 恶意软件家族的,其会安装广告软件、勒索软件和伪安全软件。这种利用新型数字隐写技术的恶意软件在日后肯定会增强网络犯罪分子隐藏自身代码的效率。

*原文: virusbulletin ,FB小编xiaix编译,转自须注明来自FreeBuf黑客与极客(FreeBuf.COM)

转载本站任何文章请注明:转载至神刀安全网,谢谢神刀安全网 » 隐藏在图片中的恶魔:揭秘“数字隐写术”工作原理

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址