原文始发于Seebug(知道创宇404实验室翻译组):利用新的 IDAT Loader 执行信息窃取程序分析
原文链接:Fake Update Utilizes New IDAT Loader To Execute StealC and Lumma Infostealers
译者:知道创宇404实验室翻译组
最近,我们观察到了一种名为”Fake Browser Update”的诱骗策略,让用户执行恶意二进制文件。在分析这些二进制文件时,我们确定使用了一个新的加载程序,用于在受感染的系统上执行信息窃取程序,其中包括StealC和Lumma。
IDAT 加载程序是我们于2023 年 7 月首次发现的一种新型、复杂的加载程序。在较早版本的加载器中,它被伪装成一个7-zip安装程序,传送SecTop RAT。现在,我们观察到该加载器被用来传送Stealc、Lumma和Amadey等信息窃取程序。它采用了几种逃避技术,包括 Process Doppelgnging、DLL Search Order Hijacking和Heaven’s Gate。IDAT加载器得名于威胁行为者将恶意载荷存储在PNG文件格式的IDAT块中。
在采用这种技术之前,我们观察到背后的黑客利用恶意JavaScript文件来与命令和控制(C2)服务器建立联系,或者传送Net Support远程访问木马(RAT)。
从SocGholish恶意软件,到黑客手中的窃取信息,下面的分析涵盖了整个攻击流程。
技术分析
黑客经常通过安全工具无法检测到的方式发起攻击,而安全研究人员也很难对其进行调查。
第一阶段:ClearFake
ClearFake是一种近期才被发现的新型恶意软件。其攻击活动始于2023年7月19日,这与我们发现新的IDAT加载器分发时间吻合。最初我们将这个攻击流程归因于SocGolish恶意软件,但ClearFake似乎不太复杂。
在此次攻击活动中,ClearFake恶意软件使用base64对恶意JavaScript进行混淆,通过CyberChef轻松解密。正如Randy McEoin所提到的:与SocGholish的一个明显区别是,没有对IP或Cookie的访问进行跟踪。分析者可以反复从同一IP地址访问被攻击的网站,且可以不清除浏览器缓存,这也意味着网站所有者更有可能察觉到感染。
这个提示冒充浏览器更新,但由于它看上去源自于预期域名,也增加了其可信度。
一旦用户点击“更新Chrome”按钮,浏览器将重定向到另一个URL,其中一个二进制文件会自动下载到用户的默认下载文件夹中。用户双击假更新的二进制文件后,它将继续下载下一个阶段的有效负载。在这项调查中,发现了一个名为ChromeSetup.exe的二进制文件,该文件名在先前的SocGholish攻击中被广泛使用。
第二阶段:MSI下载器
ChromeSetup.exe从hxxps://ocmtancmi2c5t[.]xyz/82z2fn2afo/b3/update[.]msi 下载并执行Microsoft Software Installer (MSI)包。
在类似的调查中,我们观察到当用户访问受损网页时,初始的加载程序可执行文件的外观和文件名可能会根据用户访问受感染网页时的浏览器而有所不同。在所有情况下,可执行文件都包含无效签名,并试图下载和安装一个MSI包。
执行MSI包所需的几个开关,旨在避免被检测:
- /qn:避免安装 UI
- /quiet:防止用户交互
- /norestart:在感染过程中防止系统重新启动
当执行时,MSI下载器将写入一个合法的VMwareHostOpen.exe可执行文件、多个合法的依赖文件、以及恶意的动态链接库(DLL)文件vmtools.dll。它还会删除一个加密的vmo.log文件,该文件具有PNG文件结构,并且稍后会被恶意的DLL解密。
我们发现了攻击的另一个版本,其中MSI删除了一个合法的pythonw.exe、合法的依赖文件,以及恶意的DLL文件python311.dll。在这种情况下,加密文件的被命名为pz.log,执行流程保持不变。
第三阶段:解密器
执行时,合法的VMWareHostOpen.exe会从执行VMWareHostOpen.exe的同一目录加载恶意vmtools.dll 。这种技术被称为DLL搜索顺序劫持。
在执行vmtools.dll期间,我们观察到该DLL使用API哈希从kernel32.dll和ntdll.dll加载API库,并将它们映射到内存中。在将API函数映射到内存后,DLL读取十六进制字符串83 59 EB ED 50 60 E8并使用秘钥F5 34 84 C3 3C 0F 8F进行按位异或运算解密,从而显示字符串vmo.log。该文件类似于存储虚拟机日志的Vmo\log目录。
然后,DLL将vmo.log的内容读入内存,并搜索字符串…IDAT。DLL获取…IDAT之后的4个字节,并将其与十六进制值C6 A5 79 EA进行比较。如果…IDAT后面的4个字节等于十六进制值C6 A5 79 EA,DLL将继续将…IDAT之后的所有内容复制到内存中。
一旦所有数据都被复制到内存中,DLL将尝试使用关键字F4 B4 07 9A进行按位 XOR 运算来解密复制的数据。在对其他样本进行进一步分析后,我们确定了XOR密钥始终存储在十六进制字符串C6 A5 79 EA之后的4个字节中。
DLL在内存中解密数据后,使用RTLDecompressBuffer函数对其进行解压缩。传递给该函数的参数包括:
- 压缩格式
- 压缩数据的大小
- 压缩缓冲区的大小
- 未压缩数据的大小
- 未压缩缓冲区的大小
vmtools.dll 利用LZNT1压缩算法对vmo.log文件中的解密数据进行解压缩。
数据解压缩后,DLL将mshtml.dll加载到内存中,并用解压缩的代码覆盖其.text节。在覆盖完成后,vmtools.dll调用解压缩的代码。
第四阶段:IDAT注入器
与vmtools.dll类似,IDAT加载器使用动态导入。然后,IDAT注入器通过使用ExpandEnvironmentStringsW API调用来扩展%APPDATA%环境变量。它在%APPDATA%下创建一个新文件夹,并根据QueryPerformanceCounter API调用的输出命名,并随机化其值。
MSI删除的所有文件都被复制到新创建的文件夹中。然后,IDAT使用CreateProcessW从%APPDATA%创建VMWareHostOpen.exe的新实例并退出。
第二个VMWareHostOpen.exe实例的行为与之前相同,直到从mshtml.dll内存空间调用IDAT注入器代码的阶段。IDAT立即开始实现Heaven’s Gate逃避技术,该技术用于大多数 API 调用,直到信息窃取程序加载完成。
Heaven’s Gate广泛用于威胁行为者逃避安全工具。它指的是在32位进程中执行64位进程,或者反之亦然,允许32位进程在64位进程中运行。这是通过使用保留选择器发起调用或跳转指令来实现的。在我们的案例中,分析这种技术的关键点是将进程模式从32位更改为64位,需要指定选择器“0x0033”,并在执行远程调用或远程跳转之后进行操作,如图8所示。
接下来,IDAT注入器使用ExpandEnvironmentStringsWAPI调用扩展了%TEMP%环境变量。它根据QueryPerformanceCounter API调用的输出创建一个字符串,并随机化其值。
然后,IDAT加载器通过调用GetComputerNameW API获取计算机名称,并使用rand和srand API调用对输出进行随机化处理。它使用该随机化值通过SetEnvironmentVariableW设置一个新的环境变量。该变量被设置为之前创建的随机化字符串与%TEMP%路径的组合。
现在,加载器执行了新的cmd.exe进程,然后创建并写入%TEMP%\89680228文件。
接下来,IDAT使用NtCreateSection + NtMapViewOfSection Code Injection技术将代码注入到cmd.exe进程中。使用此技术,恶意软件执行以下操作:
- 通过使用NtCreateSection API调用,在远程进程内部创建一个新的内存段
- 通过使用NtMapViewOfSection API调用,将新创建的部分视图映射到具有 RW 保护的本地恶意进程上
- 通过使用NtMapViewOfSection API调用,将先前创建的部分的视图映射到具有 RX 保护的远程目标进程
- 通过使用NtWriteVirtualMemory API调用,使用 shellcode 填充本地进程中映射的视图
在我们的案例中,IDAT加载器使用NtSuspendThread API调用挂起了cmd.exe进程上的主线程,然后使用NtResumeThread API调用恢复线程。 完成注入后,第二个VMWareHostOpen.exe实例退出。
第五阶段:IDAT加载器
注入的加载器代码以与IDAT注入器完全相同的方式实现了Heaven’s Gate逃逸技术。它检索了TCBEDOPKVDTUFUSOCPTRQFD环境变量,并将%TEMP%\89680228文件中的数据读入内存,然后将数据与3D ED C0 D3密钥进行递归异或运算。
解密后的数据包含配置数据,包括应加载信息窃取程序的进程、应该动态检索哪些API调用、附加代码等。然后,加载器使用DeleteFileW删除初始恶意DLL(vmtools.dll)。最后,加载器使用Process Doppelgnging注入技术将infostealer注入到explorer.exe进程中。
Process Doppelgnging方法利用了Windows操作系统中的事务性NTFS功能。该功能旨在确保在出现意外错误时的数据完整性。例如,当应用程序需要写入或修改文件时,如果在写入过程中发生错误,则存在数据损坏的风险。为了防止此类问题,应用程序可以以事务模式打开文件进行修改,然后提交修改,从而防止任何潜在的损坏。
Process Doppelgnging利用这一特性来将合法文件替换为恶意文件,从而进行进程注入。恶意文件在事务中创建,然后提交到合法文件,并随后执行。在我们的样本中,Process Doppelg?nging的执行步骤包括:
- 使用NtCreateTransactionAPI调用启动一个事务
- 使用NtCreateFileAPI调用创建一个新文件
- 使用NtWriteFileAPI调用写入新文件
- 使用NtCreateSectionAPI调用向本地进程的某个节写入恶意代码
- 使用NtRollbackTransactionAPI调用放弃事务
- 使用NtCreateProcessExAPI调用运行explorer.exe进程的新实例
- 使用NtCreateThreadExAPI调用在explorer.exe进程中运行恶意代码
如果在事务中创建的文件被回滚(而不是提交),但文件的部分已经映射到进程内存中,则仍将执行进程注入。
最终注入到explorer.exe进程中的有效负载被识别为Lumma Stealer。
在整个攻击流程中,恶意软件通过使用NtDelayExecution延迟执行,这是一种通常用于逃避沙箱的技术。
正如前面提到的,我们调查了几个IDAT加载器样本。主要区别包括:
- 加载恶意DLL的合法软件
- 在%APPDATA%中创建的分段目录名称。
- IDAT注入器注入加载器代码的进程。
- 将信息窃取工具/远程访问工具(RAT)加载到的进程。
- 我们观察到IDAT加载器已被用于加载以下信息窃取工具和RAT:Stealc、Lumma和Amadey信息窃取工具以及SecTop RAT。
结论
IDAT加载器是一种新的复杂加载器,利用多种逃避技术来执行各种通用恶意软件,包括InfoStealers和RAT。虚假更新活动背后的黑客将IDAT加载器打包到由诸如VMWarehost、Python和Windows Defender等合法程序加载的DLL中。
MITRE ATT&CK Techniques
Initial Access | Drive-by Compromise (T1189) | The SocGholish Uses Drive-by Compromise technique to target user’s web browser |
---|---|---|
Defense Evasion | System Binary Proxy Execution: Msiexec (T1218.007) | The ChromeSetup.exe downloader (C9094685AE4851FD5A5B886B73C7B07EFD9B47EA0BDAE3F823D035CF1B3B9E48) downloads and executes .msi file |
Execution | User Execution: Malicious File (T1204.002) | Update.msi (53C3982F452E570DB6599E004D196A8A3B8399C9D484F78CDB481C2703138D47) drops and executes VMWareHostOpen.exe |
Defense Evasion | Hijack Execution Flow: DLL Search Order Hijacking (T1574.001) | VMWareHostOpen.exe loads a malicious vmtools.dll (931D78C733C6287CEC991659ED16513862BFC6F5E42B74A8A82E4FA6C8A3FE06) |
Defense Evasion | Deobfuscate/Decode Files or Information (T1140) | vmtools.dll (931D78C733C6287CEC991659ED16513862BFC6F5E42B74A8A82E4FA6C8A3FE06) decrypts vmo.log(51CEE2DE0EBE01E75AFDEFFE29D48CB4D413D471766420C8B8F9AB08C59977D7) file |
Defense Evasion | Masquerading (T1036) | vmo.log(51CEE2DE0EBE01E75AFDEFFE29D48CB4D413D471766420C8B8F9AB08C59977D7) file masqueraded to .png file |
Execution | Native API (T1106) | The IDAT injector and IDAT loader are using Heaven’s Gate technique to evade detection |
Defense Evasion | Process Injection (T1055) | IDAT injector implements NtCreateSection + NtMapViewOfSection Code Injection technique to inject into cmd.exe process |
Defense Evasion | Process Injection: Process Doppelg?nging (T1055.013) | IDAT loader implements Process Doppelg?nging technique to load the InfoStealer |
Defense Evasion | Virtualization/Sandbox Evasion: Time Based Evasion (T1497.003) | Execution delays are performed by several stages throughout the attack flow |
IoCs
IOC | SHA-256 | Notes |
---|---|---|
InstaIIer.exe | A0319E612DE3B7E6FBB4B71AA7398266791E50DA0AE373C5870C3DCAA51ABCCF | MSI downloader |
ChromeSetup.exe | C9094685AE4851FD5A5B886B73C7B07EFD9B47EA0BDAE3F823D035CF1B3B9E48 | MSI downloader |
MlcrоsоftЕdgеSеtuр.exe | 3BF4B365D61C1E9807D20E71375627450B8FEA1635CB6DDB85F2956E8F6B3EC3 | MSI downloader |
update.msi | 53C3982F452E570DB6599E004D196A8A3B8399C9D484F78CDB481C2703138D47 | MSI dropper, dropped pythonw.exe, python311.dll and pz.log files |
update.msi | D19C166D0846DDAF1A6D5DBD62C93ACB91956627E47E4E3CBD79F3DFB3E0F002 | MSI dropper, dropped VMWareHostOpen.exe, vmtools.dll and vmo.log files |
DirectX12AdvancedSupport.msi | B287C0BC239B434B90EEF01BCBD00FF48192B7CBEB540E568B8CDCDC26F90959 | MSI dropper, dropped MpCopyAccelerator.exe, MpClient.dll, and virginium.flac file |
python311.dll | BE8EB5359185BAA8E456A554A091EC54C8828BB2499FE332E9ECD65639C9A75B | Malicious dll loaded by pythonw.exe |
vmtools.dll | 931D78C733C6287CEC991659ED16513862BFC6F5E42B74A8A82E4FA6C8A3FE06 | Malicious dll loaded by VMWareHostOpen.exe |
MpClient.dll | 5F57537D18ADCC1142294D7C469F565F359D5FF148E93A15CCBCEB5CA3390DBD | Malicious dll loaded by MpCopyAccelerator.exe |
vmo.log | 51CEE2DE0EBE01E75AFDEFFE29D48CB4D413D471766420C8B8F9AB08C59977D7 | Encrypted payload decrypted by vmtools.dll |
pz.log | 8CE0901A5CF2D3014AAA89D5B5B68666DA0D42D2294A2F2B7E3A275025B35B79 | Encrypted payload decrypted by python311.dll |
virginium.flac | B3D8BC93A96C992099D768BEB42202B48A7FE4C9A1E3B391EFBEEB1549EF5039 | Encrypted payload decrypted by MpClient.dll |
ocmtancmi2c5t[.]xyz | Host of the MSI package | |
lazagrc3cnk[.]xyz | Host of the MSI package | |
omdowqind[.]site | Domain that facilitated download of the MSI downloader | |
weomfewnfnu[.]site | Domain that facilitated download of the MSI downloader | |
winextrabonus[.]life | Domain that facilitated download of the MSI downloader | |
bgobgogimrihehmxerreg[.]site | Domain that facilitated download of the MSI downloader | |
pshkjg[.]db[.]files[.]1drv[.]com | Domain that facilitated download of the MSI downloader | |
ooinonqnbdqnjdnqwqkdn[.]space | Domain that facilitated download of the MSI downloader | |
hello-world-broken-dust-1f1c[.]brewasigfi1978[.]workers[.]dev | Domain that facilitated download of the MSI downloader | |
doorblu[.]xyz | C&C server | |
costexcise[.]xyz | C&C server | |
buyerbrand[.]xyz | C&C server | |
94.228.169[.]55 | C&C server | |
gapi-node[.]io | C&C server | |
gstatic-node[.]io | C&C server |
References