-
-
[推荐][原创] 剖析Gorgon APT的新变体GuLoader(CloudEyE)对抗技术
-
发表于: 2022-11-24 11:37 6767
-
1 为什么是 GuLoader
GuLoader,或者也被称为 CloudEye,是一个小型 VB5/6 下载器恶意软件。通常,它会从 Google Drive 下载远程访问工具(RAT)和窃取程序,例如 Agent Tesla,Arkei/Vidar,Formbook,Lokibot,Netwire 和 Remcos。
GuLoader 因其反虚拟机(anti-VM)策略而臭名远扬,对一般的沙箱检测基本百分百绕过。在已知的情报和分析实战中,即使是最著名的在线沙箱之一(run)也无法成功运行起该恶意软件。
2. 逐层刨开 GuLoader 采用的多种“反”策略
2.1
1. NSIS
GuLoader 利用 Nullsoft 可脚本安装系统(NSIS)打包程序来压缩和加密其有效载荷。NSIS 打包程序是一个免费的开源工具,通常用于创建 Windows 安装程序。但是,它也可以打包其他类型的文件,例如可执行文件。正是 GuLoader 对 NSIS 打包程序的使用使防病毒程序更难检测和删除恶意软件。
当 GuLoader 打包其有效负载时,它首先使用 NSIS 打包器压缩文件,然后使用自定义加密算法加密压缩文件。然后将加密文件嵌入到 GuLoader 可执行文件中。当 GuLoader 运行时,它会解密并解压缩有效负载,然后执行它。
2.2
2. 检查常用 vm 工具
GuLoader 检查是否存在常见的 VM 工具,如 VMware,VirtualBox 和 QEMU。如果检测到这些工具中的任何一个,GuLoader 将不会执行。
2.3
3. 检查调试器
GuLoader 检查是否存在调试器,如 OllyDbg 和 WinDbg。如果检测到调试器,GuLoader 将不会执行。
传统的检测可以在一般的之前的文章中找到,比如参考这篇Gorgon APT 组织在行动:从 Google Drive 到 Formbook 窃密木马
2.4
4. 检查沙盒
GuLoader 检查是否存在沙箱,例如 Cuckoo Sandbox 和 Anubis。如果检测到沙盒,GuLoader 将不会执行。
比如 GuLoader 会检查应用程序窗口的数量以检测分析环境。此检查使用函数 EnumWindows 枚举和计数屏幕上的所有顶级窗口。如果窗口数小于 12,恶意软件将使用自己的进程句柄调用 TerminateProcess,作为要终止的参数。这样做可能是为了逃避沙盒或模拟器环境。
2.5
5. API HASH
GuLoader 使用散列技术来解决 API 调用;它是 DJB2 的修改版本 – 请参阅以下示例:
python 复原 hash 代码:
val = 0x1505 inString = "GetProcAddress"for ch in inString: val += (val << 5) val &= 0xFFFFFFFF val += ord(ch) val &= 0xFFFFFFFF print(hex(val).upper().lstrip("0X").rstrip("L"))
2.6
6. 二进制代码混淆技术
最常见的混淆技术之一是“不透明谓词”,它们是始终返回真值或假值的布尔表达式。但是,该值事先并不知道,因此很难理解它的作用。不透明谓词通常与其他混淆技术(如代码排列)一起使用,以使代码更难理解。
2.7
7. GuLoader 使用矢量异常处理程序来更改代码流
GuLoader 的一个有趣功能是它如何在运行时设法更改代码流。这是使用向量异常处理程序 (VEH)(一种软件异常处理机制)完成的。VEH 可用于拦截和处理操作系统或正在运行的程序生成的异常。
发生异常时,操作系统或程序将生成异常代码。然后,VEH 查找与该异常代码关联的异常处理程序的地址并调用它。GuLoader 使用 VEH 在异常处修改扩展指令指针(EIP),以指向下一个合法指令。以下是 VEH 设置:
首先,当异常发生时,_CONTEXTRECORD 结构检查是否存在硬件寄存器,即 x86 调试寄存器:
发生异常的 EIP 与字节 0xcc(即软件断点)进行比较。这是异常继续并生成下一个 EIP 的必要条件。
动态计算EIP:
异常 EIP 后的字节与 0xcb 进行异或运算,并将结果添加到当前 EIP 中,以获取下一个执行位置。异常 EIP 和计算的 EIP 之间的指令充满了垃圾指令,以混淆反汇编器,如下图所示:
3
如何从 GuLoader 自动提取入侵指标(IOC)
由于存在各种硬核反虚拟机、反分析和反调试机制,手动剖析 GuLoader 有效负载成为一个繁琐而乏味的过程。因此,必须自动执行此提取。为了使该过程成功,我们必须首先自动转储,然后编写脚本来提取从 GuLoader 获取 URL 所需的参数。
但 GuLoader 给我们带来了一个很大的障碍,即 anti-dump 保护。这是一种用于防止对代码进行逆向工程和分析的技术。它通过加密或混淆代码来工作,使其特别难以阅读和理解。
GuLoader 在调用任何系统 API 的任何时候都会加密主二进制代码,这总是使转储的代码无用。以下两张图片分别描述了“调用前对代码进行异或”和“在 API 调用后对代码进行异或”。
利用的一个弱点是 GuLoader 进行的初始 API 调用,它没有被包含在执行所有上述“反”检查的子例程代码中。
要利用此弱点,您可以在 OEP 后设置 DLL hook,如下面的代码所示:
转储成功后,我们必须找到密钥。这个过程相当简单,因为 GuLoader 使用与字符串相同的子程序加密僵尸网络命令和控制器(C&C)。下面是字符串解码子例程:
在分析中通过回溯会找到传入栈中的待解密字符串:
后续写脚本即可暴力破解该字符串
:GuLoader c2 = b’http[:]//192.3[.]245[.]147/2022.bin
4
总结
在各种变体 GuLoader 中,不仅包含传统的 anti 技术,还有一些高操作性的反调试功能。
5
ioc
bfa5dba46db1253587058b0392c04c8403846fa55d7dcf1044e94e6a654d4715
6
参考链接
GuLoader: Peering Into a Shellcode-based Downloader ( https://www.crowdstrike.com/blog/guloader-malware-analysis/ )