Unit 42 研究揭示了 GootLoader 复杂的沙箱规避策略


Unit 42 研究揭示了 GootLoader 复杂的沙箱规避策略

执行摘要

本文将介绍如何在 Visual Studio Code 中使用 Node.js 调试时绕过 GootLoader 恶意软件的反分析技术。GootLoader JavaScript 文件使用的这种规避技术可能会给试图分析恶意软件的沙箱带来巨大挑战。

计算资源有限的沙盒很难分析大量二进制文件。恶意软件经常利用这一点,通过延迟恶意行为(通常被称为“休眠”)来逃避分析。

GootLoader 是一款后门和加载器恶意软件,其运营者通过虚假论坛帖子积极传播。GootLoader的感染过程从 JavaScript 文件开始。

Palo Alto Networks 客户可以通过我们的下一代防火墙和云端交付安全服务(包括Advanced WildFire)以及Cortex XDR更好地抵御这些威胁。如果您认为自己可能已受到攻击或遇到紧急问题,请联系Unit 42 事件响应团队。

背景

Gootkit于 2014 年首次被报道,随着时间的推移,它经历了许多变化。2020 年,至少有一位消息人士发现了一种名为 Gootkit Loader 的基于 JavaScript 的恶意软件,其运营商通过虚假论坛帖子进行传播。该活动背后的组织一直保持着相同的传播策略,截至 2024 年,他们继续使用外观几乎相同的虚假论坛帖子。

许多安全供应商在提及这些 JavaScript 文件时,都会将 Gootkit Loader 简称为 GootLoader。尽管最初的 Gootkit 恶意软件是 Windows 可执行文件,但 GootLoader 是基于 JavaScript 的恶意软件,它可以传播其他类型的恶意软件,包括勒索软件。

自2024年1月以来,我们调查了多个GootLoader样本。感染链如下图1所示。

Unit 42 研究揭示了 GootLoader 复杂的沙箱规避策略

图 1. 我们在 2024 年 3 月看到的 GootLoader 感染流程图。

沙盒是一种广泛采用的识别恶意二进制文件的方法,该方法涉及分析受控环境中二进制文件的行为。在计算资源有限的情况下分析大量二进制文件时,沙盒会遇到障碍。

恶意软件通常会利用这些挑战,故意延迟沙盒内的恶意操作来隐藏其真实意图。这些延迟操作通常被称为恶意软件休眠。

JavaScript 恶意软件的常见休眠方式

恶意软件进入休眠的最常见方式是简单地调用Wscript.sleep()或setTimeout()方法。但是,许多沙箱很容易检测到这些方法。在下文中,我们将剖析 GootLoader 用来逃避检测的最少提及的方法之一。

深入代码

在本节中,我们利用Visual Studio Code 中的 Node.js 调试来分析 Windows 主机上的以下 GootLoader 文件:

SHA256:c853d91501111a873a027bd3b9b4dab9dd940e89fcfec51efbb6f0db0ba6687b文件大小:860,920 字节文件名:what cards are legal in goat format 35435.js首次提交至 VirusTotal:2024 年 1 月 9 日

在调试 GootLoader 文件的过程中,我们使用安装了Node.js JavaScript 运行时和Visual Studio Code 的Windows 主机。在此环境中,我们可以使用Visual Studio Code 编辑器中的Node.js 调试逐步执行代码。

这种环境提供了一种有效的方法来理解恶意软件的流程控制和执行逻辑。通常,Windows Script Host ( wscript.exe ) 在 Windows 环境中运行独立的 JavaScript 文件。但是,通过使用 Node.js 和 Visual Studio Code,我们可以逐步执行 JavaScript 文件的执行,在代码中设置断点并使用即时窗口来评估表达式。虽然这种方法具有显着的优势,但某些 JavaScript 函数可能不受 Node.js 支持。

作为一种混淆技术,GootLoader 的作者将 GootLoader 代码与合法的 JavaScript 库代码交织在一起。在整个调试过程中,我们观察到代码执行似乎卡在了某个特定循环的范围内。下面的图 2 显示了其中一个循环的代码片段。

Unit 42 研究揭示了 GootLoader 复杂的沙箱规避策略

图 2. 使用 Visual Studio Code 中的 Node.js 调试分析文件时,GootLoader 示例的代码执行似乎陷入了循环。

为了更好地理解这些循环,让我们深入研究图 2 中循环周围的代码。下面的图 3 显示了我们将重点关注的原始代码的独立版本。

Unit 42 研究揭示了 GootLoader 复杂的沙箱规避策略

图 3. 图 2 中的代码循环。

在图 3 中,代码中的while函数导致无限循环,因为变量jobcv始终被赋值为1。此外,变量oftenfs充当计数器,已使用值8242进行初始化。

此循环中的关键行是rangez=(horseq7[oftenfs](oftenfs));。此行的成功执行依赖于函数数组horsqe7指向实际函数。循环持续进行,直到计数器oftenfs达到值2597242,此时函数数组horsqe7引用休眠函数。

这使得代码似乎陷入了循环,因为在我们的分析环境中,计数器oftenfs花了 10 多分钟才达到值2597242。

接下来,我们进入sleepy函数。在sleepy函数内部,我们从图 3 中看到了一个熟悉的函数数组名称。该函数数组horseq7被分配了一个名为indication6的函数,如下图 4 所示。

Unit 42 研究揭示了 GootLoader 复杂的沙箱规避策略

图 4.在sleepy函数中查找horseq7函数数组名称。

经过更多延迟后,代码执行将进入indicator6函数内部。这次lclft4函数被分配到函数数组horseq7中,如下图 5 所示。

Unit 42 研究揭示了 GootLoader 复杂的沙箱规避策略

图 5. indicator6 函数内部。

再次经过更多延迟,代码执行将到达图 6 所示的course83函数。函数course83是实际恶意代码开始执行的地方。

Unit 42 研究揭示了 GootLoader 复杂的沙箱规避策略

图 6. course83函数内部。

最后,通过对course83函数的调试,我们可以发现并反混淆了启动GootLoader恶意功能的JavaScript代码。图7显示了反混淆后的恶意GootLoader代码的一部分。

Unit 42 研究揭示了 GootLoader 复杂的沙箱规避策略

图7. 反混淆后的恶意GootLoader代码片段。

GootLoader 的创建者利用耗时的while循环和函数数组来故意延迟恶意代码的执行。这种方法有效地实施了一种逃避技术,通过诱导睡眠期来掩盖 GootLoader 的恶意性质。

表 1 按照从 GootLoader JavaScript 代码调用的顺序列出了计数器值及其指定的功能。

Unit 42 研究揭示了 GootLoader 复杂的沙箱规避策略

表 1. GootLoader 示例中的计数器值及其指定的功能。

结论

利用分析 GootLoader 使用的规避技术所获得的见解,我们可以增强检测、分析和开发有效恶意软件对策的能力。通过持续合作和知识共享,我们可以共同领先于网络犯罪分子,帮助保护我们的数字系统和网络。

GootLoader JavaScript 文件的 SHA256 哈希值

b939ec9447140804710f0ce2a7d33ec89f758ff8e7caab6ee38fe2446e3ac988c853d91501111a873a027bd3b9b4dab9dd940e89fcfec51efbb6f0db0ba6687b



感谢您抽出

Unit 42 研究揭示了 GootLoader 复杂的沙箱规避策略

.

Unit 42 研究揭示了 GootLoader 复杂的沙箱规避策略

.

Unit 42 研究揭示了 GootLoader 复杂的沙箱规避策略

来阅读本文

Unit 42 研究揭示了 GootLoader 复杂的沙箱规避策略

点它,分享点赞在看都在这里

原文始发于微信公众号(Ots安全):Unit 42 研究揭示了 GootLoader 复杂的沙箱规避策略

版权声明:admin 发表于 2024年7月5日 下午2:03。
转载请注明:Unit 42 研究揭示了 GootLoader 复杂的沙箱规避策略 | CTF导航

相关文章