Gootkit是一款复杂的多阶段银行恶意软件,于2014年被Doctor Web公司(世界著名的反病毒产品和解决方案提供商)首次发现。最初,它是通过Spelevo和RIG等垃圾邮件和漏洞工具包传播的。在垃圾邮件活动的配合下,攻击者后来转向了被感染的网站,在这些网站上,访问者被诱骗下载恶意软件。
Gootkit 能够从浏览器窃取数据、执行浏览器中间人攻击、键盘记录、截屏和许多其他恶意操作。它的加载程序执行各种虚拟机和沙箱检查,并使用复杂的持久性算法。 2019 年,Gootkit 在经历数据泄露后停止运营,但自 2020 年 11 月以来再次活跃。
Gootkit 的受害者主要分布在德国、意大利等欧盟国家。在本文中,研究人员分析了最近的 Gootkit 样本。
技术细节
Gootkit 由一个用 C++ 编写的加载程序组件和用 JS 编写并由 Node.js 解释的主体组成,主体为模块化框架,包含注册、间谍软件、VMX检测等模块。
加载程序
样本 (MD5 97713132e4ea03422d3915bab1c42074) 由自定义的多级打包程序打包,该打包程序逐步解密最终的有效载荷。最后一个阶段是一个 shellcode,它解密原始加载程序可执行文件并将其映射到内存中。映射后,调用原始入口点。因此,研究人员可以轻松地解压原始可执行文件并对其进行分析。研究人员使用下表中列出的结果来检测 Gootkit 加载程序。
大多数字符串使用 XOR 加密进行加密,并在运行时解密。没有其他技术用于使静态分析复杂化。
字符串解密
然而,为了使动态分析更加困难,Gootkit 加载程序采用了许多不同的方法来检测虚拟环境或调试器。如果任何一个虚拟机检查成功,加载程序将进入无限循环。
样品名称检查
恶意软件使用的 VM 检测技术的完整列表:
执行流程
当示例启动时,它会检查命令行参数。下面列出了可用的参数:
处理命令行参数后,示例会检查它是在虚拟机内运行还是正在调试。如果没有,它会解密配置并启动四个线程。
hread 启动例程
Update_from_c2
启动的第一个线程尝试从 < CnC host >/rpersist4/< crc > 下载加载程序更新,其中 < CnC host > 是命令和控制服务器地址,< crc > 是前 0x200 字节的 CRC32当前文件的十进制格式。
browser_inj
该线程解密两个嵌入式 MZPE 可执行文件(x64 和 x86 DLL),遍历正在运行的进程并尝试使用 。NtCreateSection/NtMapViewOfSection API 将解密的 DLL 注入指定进程的进程内存中。进程名的匹配是通过计算进程名的CRC32值来完成的。有关支持的浏览器列表,请参阅下表。
注入的代码从主体 Web 注入和流量嗅探例程中调用,以执行浏览器中的攻击。为此,代码修补负责证书验证的标准浏览器功能以允许自签名证书。因此,攻击者能够注入自定义 JS 代码并修改或重定向流量。
Persistence_service
如果示例在 LOCAL_SYSTEM 帐户下运行,则 Gootkit 持久性机制会滥用挂起的 GPO Windows 功能。当用户修改 Pending GPO 注册表值时,必须指定以下参数:
count ——待处理 GPO 的数量;
path1, path2, ... – 包含有关如何加载 GPO 的说明的特殊 .inf 文件的路径;
Section1, Section2, ... – INF 文件中的部分名称;
因此 Gootkit 在与示例相同的目录中创建了一个 .inf 文件,并将以下值写入 。Software\Microsoft\IEAK\GroupPolicy\PendingGPOs 注册表项:
count —— 0x1;
path1 —— .inf 文件位置;
Section1——默认安装;
INF 文件内容
现在,explorer.exe 将在加载时加载组策略对象 (GPO)。 Gootkit 为 Internet Explorer 管理工具包 (IEAK) 创建一个挂起的 GPO,它直接指向 INF 文件。在运行时加载 explorer.exe 时,它将执行创建的文件中的 [DefaultInstall],该文件将运行 Gootkit 可执行文件。
如果该示例在另一个帐户下运行,它会使用从 %SystemRoot% 中选择的随机名称创建一个服务,将其自身复制到具有所选名称的 %SystemRoot% 文件夹中,然后将自身从磁盘中删除。
Stop_switch
该线程在 \AppData\Local\Temp 和 \Local Settings\Temp 文件夹中查找名为 uqjckeguhl.tmp 的文件。找到文件后,恶意软件将停止。
主体下载
在从 C&C 下载主体之前,加载程序尝试使用以下格式查找注册表项:HKCU\Software\AppDataLow\< pr_string >_< i >,其中 i 是从 0 开始的数字,而pr_string是木马启动时生成的伪随机字符串。生成是基于受害者的PC参数,所以每次生成相同的值为相同的PC。
每个密钥包含最大 512,000 字节 (500KB) 的加密数据块。如果找到上述密钥,它们的内容将保存在新分配的缓冲区中(用于解密和解压缩)。然后使用用于解密配置的相同函数解密缓冲区,然后解压缩缓冲区。
在解包程序之后,加载程序将从 C&C 下载主体,计算其 CRC32 并将其与注册表负载 CRC(如果存在)进行比较。如果 CRC 不同,加载程序将执行从 C&C 下载的较新版本。如果没有硬编码到样本中的适当 UserAgent 标头,C&C 服务器将不会发送 DLL 模块。当前的硬编码值为:Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:25.0) Gecko/21006101 Firefox/25.0。
解密函数
主体
主体(MD5 20279d99ee402186d1e3a16d6ab9398a, verdict HEUR:Trojan.Win32.Generic)是一个Node.js解释器,捆绑了加密的JS文件。在启动时,主体使用带有硬编码密钥流的类似 RC4 的算法解密 JavaScript 文件。
有关嵌入式模块的信息存储在具有以下格式的特殊文件结构数组中:BYTE* name_pointer、BYTE* encrypted_data、DWORD data_size、DWORD encr_flag。这些结构在从encrypted_data 开始读取data_size 字节的解密例程中使用。如果设置了 encr_flag,此例程将解密 encrypted_data,并将结果写入名为 *name_pointer 的文件中。解密例程迭代文件信息数组中的所有条目。然后解密执行被转移到 Node.js 解释器。
文件信息数组
该数组包含 124 个加密文件,包括 Node.js 系统库和开源包,以及恶意软件模块。奇怪的是,JS 入口点是一个名为 malloc.js 的文件。
Malware.js 初始化全局木马变量,收集保存的 cookie(IE、Firefox、Chromium)并遍历服务器列表以查找可用的 C&C。
当恶意软件找到 C&C 服务器时,它会启动一个无限循环,侦听不同的内部恶意软件事件(一些例程,如 cookie 收集在木马启动时没有 C&C 请求的情况下开始),并通过特殊格式的数据包将收集到的数据发送到 C&C。恶意软件还会侦听 C&C 命令并对每个命令调用适当的处理程序。为了与模块通信,恶意软件使用以下数据包类型:
有六种类型的内部事件处理程序和相应的数据包格式
事件处理程序
一般的数据包结构如下:
Length + 8 (4 bytes);
Packet magic (0xEDB88320 XOR length+8);
Packet data (不同的包类型,使用protobuf序列化);
Packet magic;
数据包生成样本
卡巴斯基产品将此家族命名为 Trojan-Downloader.Win32.Injecter、HEUR:Trojan.Win32.Generic、Trojan-Downloader.Win32.Gootkit、Trojan-Banker.Win32.Gootkit。
本文翻译自:https://securelist.com/gootkit-the-cautious-trojan/102731/如若转载,请注明原文地址