随着网络攻击技术的不断演变,恶意代码加载器逐渐成为恶意代码执行的关键组成部分。此类加载器是一种用于将各种恶意代码加载到受感染的系统中的恶意工具,通常负责绕过系统安全防护,将恶意代码注入内存中并执行,为后续的特洛伊木马类型恶意代码的部署奠定基础。加载器的核心功能包括持久性机制、无文件内存执行以及多层次规避技术。
安天CERT
将近几年历史跟踪储备的典型恶意加载器家族有关信息汇总成专题报告,在未来几个月依次发布,并持续追踪新的流行加载器家族。本项目专题将聚焦加载器技术细节,深入挖掘其在攻击链中的核心功能,包括其混淆技术、加密机制以及注入策略等。此外,我们也会不断完善自身安全产品能力,采取有效技术方案进一步提升针对加载器的识别率和准确率,帮助用户组织提前发现并阻止潜在威胁。
DBatLoader加载器最初于2020年被发现,主要被用于投放包括Snake Keylogger、Formbook和Agent Tesla在内的多种恶意代码家族。DBatLoader加载器的加载过程分为两个阶段,其中第一阶段主要用于规避反病毒引擎的检测,并在内存中解密运行第二阶段载荷。在第二阶段过程中,DBatLoader加载器采用“DDR”(Dead Drop Resolvers)技术,从公共代码托管网站上下载并解密待投递的恶意代码家族,而后通过多种手法将其注入到其他程序内以实现隐蔽运行。
DBatLoader加载器通过不断更新其生存技巧来规避反病毒引擎的检测。它大量运用了混淆技术,从加密和隐藏特征两个维度对程序进行隐蔽处理。DBatLoader加载器使用异或加密和移位加密对字符串和不同阶段的载荷加密处理。为了提高隐蔽性,该加载器还采用了图片隐写术和在代码中穿插无用字符串的方法以隐藏恶意代码特征。除此之外,DBatLoader加载器还会将指定扩展名的文件加入Windows Defender白名单来规避查杀,以便实施后续攻击行为。
该加载器详细信息参见安天病毒百科
[1]
。
图2‑1 长按识别二维
码查看XLoader加载器详细信息
DBatLoader加载器为了逃避和绕过安全检测,使用了多种生存技术,其中包括:混淆技术、注入技术、提权技术、持久化技术和反调试技术。
3.1 混淆技术分析
为了减少文件特征,阻碍分析人员逆向分析,DBatLoader加载器采用了多种文件混淆技术,其中包括技术如下:穿插无用指令、图片隐写、脚本字符串拼接、载荷多层加密、去除文件魔术头、字符串加密、动态加载函数。
3.1.1 穿插无用指令
在DBatLoader加载器的每个阶段载荷中,均有大量重复的尝试hook AMSI(即Antimalware
Scan Interface,Windows 反恶意软件扫描接口)的代码,这些代码使原本的程序执行流程变得分散,即增加了逆向分析的难度,又减少了程序执行流程本身带来的二进制特征。
图3‑1 DBatLoader加载器使用大量重复的指令填充程序
3.1.2 使用图片隐写术
DBatLoader加载器通过图片隐写术,可以将恶意载荷信息写入到图片中,使其从计算机视角来看和普通图片别无二致,进而达到隐藏目标载荷的目的。当需要获取目标载荷时,该加载器通过特定的算法读取图片,从而将信息还原出来。
图3‑2 DBatLoader隐写载荷后的图片
3.1.3 脚本字符串拼接
DBatLoader加载器通过将bat脚本指令进行分割,并在其中穿插无用变量,在运行时使用拼接变量的方式进行还原,以降低文件特征并实现干扰逆向人员分析的目的。
图3‑3 DBatLoader加载器混淆过后的bat脚本
3.1.4 多层加密载荷
DBatLoader加载器通过多层加密载荷,以去除载荷特征并增加逆向难度。
图3‑4 DBatLoader加载器加密函数
3.1.5 破坏文件特征
DBatLoader加载器通过故意在加密的载荷中去除一个字节以破坏载荷解密后的文件特征,去除的字节由加载器运行时还原,以避免载荷被解密后检测。
图3‑5 DBatLoader加载器第一阶段解密后的载荷
3.1.6 加密字符串
DBatLoader加载器通过将部分字符串(如注入的程序名,自启动注册表路径等)进行加密以防止字符串被作为特征进行识别检测。
图3‑6 DBatLoader字符串加密算法
3.1.7 函数动态加载
DBatLoader加载器通过调用GetProcAddress来动态加载函数以防止导入函数所带来的文件特征。
图3‑7 DBatLoader加载器动态加载函数
3.2 注入技术分析
DBatLoader加载器提供了三种注入方式,分别为线程注入、APC注入和进程镂空,并且最终会根据载荷的配置文件选择注入方式。
其中调用的API如表3‑1所示,DBatLoader加载器在注入过程中都尽量使用了ntdll.dll的导出函数,而不是直接使用kernel32.dll的导出函数,以减少调用链的长度,降低被hook的可能性。
表
3‑1 DBatLoader加载器注入过程使用的API
创建进程
|
CreateProcessAsUserW
|
WinExec
|
|
修改内存
|
NtOpenProcess
|
NtUnmapViewOfSection
|
ZwAllocateVirtualMemory
|
NtReadVirtualMemory
|
WriteVirtualMemory
|
RtlMoveMemory
|
执行载荷
|
NtCreateThreadEx
|
NtQueueApcThread
|
GetThreadContext
|
SetThreadContext
|
ResumeThread
|
|
3.3 提权技术分析
DBatLoader加载器为了绕过UAC实现提权,需要让程序在受信任的目录中执行,并且程序还需要带有有效的数字签名。
其中DBatLoader加载器为了在受信任的目录中执行,使用了模拟受信任目录技术。该技术将会创建一个新的目录,该目录和受信任的目录之间有一个空格的区别,但是却能欺骗UAC让其以为程序在受信任的目录中运行。
图3‑8 DBatLoader加载器模拟的受信任目录
之后DBatLoader加载器使用了易受DLL劫持的可执行文件,该程序具有合法的数字签名并且能够自动提权,但是会优先加载同目录下的DLL。DBatLoader加载器通过这种白加黑的方式,绕过UAC的限制实现提权。
图3‑9 DBatLoader加载器用于白加黑的白文件
3.4 持久化技术分析
DBatLoader加载器通过向HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run写入注册表项实现持久化。
图3‑10 DBatLoader加载器写入注册表
3.5 反调试技术分析
DBatLoader加载器在第二阶段会通过IsDebuggerPresent和CheckRemoteDebuggerPresent检测是否有调试器的存在。
图3‑11 DBatLoader加载器通过IsDebuggerPresent检测是否存在调试器
DBatLoader
加载器主要通过钓鱼邮件进行传播。攻击者通过投递钓鱼邮件,诱导受害者运行邮件附件中的恶意程序加载器。当加载器运行时,该加载器会先从自身资源文件中读取包含第二阶段载荷的图片,通过图片隐写术进行解密并运行DBatLoader加载器第二阶段。在第二阶段中,加载器会从公共的文件托管网站下载加密的配置文件。之后DBatLoader加载器会根据该配置文进行持久化并篡改Windows Defender白名单。最后DBatLoader加载器会从配置文件中解密待投递的恶意代码家族并通过注入的方式运行。
图4‑1 DBatLoader攻击流程
5.1 样本标签
病毒名称
|
Trojan/Win32.DBatLoader
|
原始文件名
|
Crane Motor Specification,Docx.exe
|
MD5
|
23434BF113A4651076ECD2898A6C1069
|
处理器架构
|
Intel 386 or later processors and
compatible processors
|
文件大小
|
1.15 MB (1,209,856字节)
|
文件格式
|
BinExecute/Microsoft.EXE[:X86]
|
时间戳
|
1992-06-19 22:22:17
(
Delphi程序默认时间戳
)
|
数字签名
|
无
|
加壳类型
|
无
|
编译语言
|
Borland Delphi(2006)
|
VT
首次上传时间
|
2024-10-14 04:26:54
|
VT
检测结果
|
52/73
|
5.2 DBatLoader加载器第一阶段
DBatLoader加载器第一阶段中存在大量劫持AMSI API的函数的代码以规避反病毒引擎的扫描,但是此部分代码存在缺陷,该功能并未实现。
图5‑1 DBatLoader加载器有缺陷的hook API实现
DBatLoader加载器第一阶段对下一阶段载荷采取了多层加密。该加载器首先从资源文件中加载包含下一阶段载荷的图片,并通过图片隐写术把加密的载荷读取出来。
图5‑2 DBatLoader加载器读取资源文件
其中DBatLoader加载器会从图片中逐行以蓝绿红的顺序读取字节以获取隐写信息,其中图片隐写所占用的bit数记录在了读取的前3个字节上。随后该加载器通过隐写术的方式读取了32bit信息,用来获取加密载荷的总字节数。之后该加载器将继续从图片中读取信息直到获得全部的加密载荷。
图5‑3 DBatLoader加载器读取隐写图片
随后DBatLoader加载器逐字节对第二阶段载荷加0x80并在载荷头部添加一个字符“M”成对第二阶段载荷的解密。
图5‑4 DBatLoader加载器解密第二阶段载荷
最后DBatLoader加载器将二阶段载荷映射进内存并调用入口点进入第二阶段。
图5‑5 DBatLoader加载器加载二阶段载荷
5.3 DBatLoader加载器第二阶段
DBatLoader加载器第二阶段通过在主函数逻辑中设置一个计时器来触发第二阶段恶意逻辑。
图5‑6 DBatLoader加载器设置计时器
在DBatLoader加载器第二阶段中,有着和第一阶段一样的规避反病毒引擎逻辑,但是因为设计缺陷导致功能未能实现。
图5‑7 第二阶段规避反病毒引擎逻辑
在DBatLoader加载器第二阶段,部分字符串被一种异或算法加密。当需要解密字符串时,加载器会先逐字符拼接形成一个异或密钥,随后加载器会逐字节地将加密字符串的低8位与密钥的低8位异或解密,以获得明文字符串。
图5‑8 DBatLoader加载器解密字符串算法
在DBatLoader加载器第二阶段,程序会将要投递的载荷下载地址存放在第一阶段载荷当中。在第二阶段,DBatLoader加载器会在第一阶段载荷文件中搜索特定的字符串,以定位加密配置的位置。