freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

新版本 Redline 使用 Lua 字节码逃避检测
2024-05-17 20:23:45

近日,研究人员观察到 Redline Stealer 木马的新变种,开始利用 Lua 字节码逃避检测。

遥测分布

根据遥测数据,Redline Stealer 木马已经日渐流行,覆盖北美洲、南美洲、欧洲和亚洲甚至大洋洲。

感染链

1715947302_66474726062e1c41868c3.png!small?1715947300416

感染链

微软官方账户的 vcpky 仓库被攻击者滥用部署了恶意文件,恶意 URL 为 https[:]//github[.]com/microsoft/vcpkg/files/14125503/Cheat.Lab.2.7.2.zip

该压缩文件中包含 MSI 安装程序:

1715947324_6647473ca71cb0f35710d.png!small?1715947322526

MSI 文件

MSI 安装程序包含两个 PE 文件和一个文本文件。

1715947346_66474752306c22b707c30.png!small?1715947344121

文件内容

Compiler.exe 和 lua51.dll 都是 Lua 开发的二进制文件,攻击者会稍微定制化修改这些文件。而 readme.txt 其中包含 Lua 字节码,配合使用可以在运行时编译和执行。

Lua JIT 是 Lua 编程语言的即时编译器(JIT):

1715947366_664747662913f91f0e847.png!small?1715947367098

字节码

通常来说,1B 4C 4A 02也就表示着是 Lua 5.1 字节码。这种方式可以将恶意攻击进行混淆,避免安全软件检测到好识别的脚本文件(如 wscript、JScript 或 PowerShell 脚本),进一步增强了攻击的规避能力。

用户点击执行 MSI 安装程序后,就会显示一个用户界面:

1715947401_66474789a2cf2c4fc3f73.png!small?1715947399646

安装界面

安装过程中会提示用户将恶意软件安装到其他朋友的计算机上,就可以获得完整的应用程序。

1715947416_664747982d5254ce122aa.png!small?1715947414547

提示信息

在安装过程中,可以发现有三个文件被写入 C:\program Files\Cheat Lab Inc\ Cheat Lab\中。

1715947440_664747b03e89f290f4770.png!small?1715947438718

写入文件

后续这三个文件会被移动到指定路径中:

1715947458_664747c20d39897db3273.png!small?1715947456065

特定路径

可以看到,compiler.exe 由 msiexec.exe 执行,并以 readme.txt 作为参数。而 lua51.dll 会被加载到 compiler.exe 中,lua51.dll 是 compiler.exe 运行需要的 DLL,攻击者将该 DLL 文件与程序文件放在一起。

1715947476_664747d445c2b4d3a3770.png!small?1715947474488

操作行为

安装过程中,msiexec.exe 会创建一个计划任务来执行 compiler.exe,并将 readme.txt 作为参数。

1715947574_6647483624611ff34303b.png!small?1715947572191

计划任务

除了上述持久化技术外,恶意软件还使用另一种备用方式确保恶意软件能够得到执行。恶意软件会将前述三个文件复制到另一个文件夹中,路径非常长而且很随机。

1715947599_6647484f575105d6d742c.png!small?1715947597891

文件移动

请注意,compiler.exe 已经改名为 NzUW.exe。随后在 C:\Windows\Setup\Scripts\ 中释放文件 ErrorHandler.cmd。文件的内容如下所示,攻击者以新名称 NzUw.exe 执行 compiler.exe,并以 Lua 字节码作为参数。

1715947615_6647485f16d7a72441348.png!small?1715947613557

执行命令

执行 ErrorHandler.cmd 会调用 system32 文件夹中的恶意文件。

1715947627_6647486be6f40a57a0a99.png!small?1715947626648

进程创建

为此还会创建另一个计划任务,程序不带任何参数启动 C:\Windows\system32\oobe\Setup.exe。

1715947641_6647487935776a86e1474.png!small?1715947639301

计划任务

事实证明,如果将 Payload 放在 c:\WINDOWS\Setup\Scripts\ErrorHandler.cmd 中,则 c:\WINDOWS\system32\oobe\Setup.exe 将在发生错误时加载它。

1715947657_664748890a22d71aaf16a.png!small?1715947655296

官方文档

c:\WINDOWS\system32\oobe\Setup.exe 的执行需要参数,如果不提供参数就会触发错误。从而执行 ErrorHandler.cmd 调用 compiler.exe 加载恶意 Lua 代码。

1715947674_6647489a2ead7358160b3.png!small?1715947672109

进程树

可以确认 c:\WINDOWS\system32\oobe\Setup.exe 以 ErrorHandler.cmd 脚本作为参数启动 cmd.exe,该脚本运行 NzUw.exe。

继续通过 API 查看所在 IP 的信息:

1715947685_664748a543fe2c2b5287e.png!small?1715947683586

IP 信息

IP 相关信息会以 JSON 形式写入 inetCache 文件夹中。

1715947698_664748b25b7120ef11f2b.png!small?1715947696462

写入文件

文件内容如下所示:

1715947712_664748c0b9365d7874709.png!small?1715947713225

文件内容

C&C 通信

恶意软件的 C&C 通信使用 HTTP 协议:

1715947727_664748cfcb450899b22fb.png!small?1715947727173

C&C 流量

C&C 服务器响应了名为 OTMsOTYs 的任务 ID,包含在 base64 编码的字符串中:

1715947740_664748dcc2926ad4c4f91.png!small?1715947742017

响应信息

1715947772_664748fc130da876a71ed.png!small?1715947770244

响应信息

通过 /loader/screen 的 HTTP PUT 请求发送到攻击者控制的服务器。服务器 IP 地址归属于 Redline,许多引擎都将其标记为恶意。

1715947793_664749114962a2430254d.png!small?1715947791819

IP 地址

进一步查看,该数据包传输的是名为 Screen.bmp 的图片文件。值得注意的是,请求使用的 User-Agent 为 Winter。

1715947805_6647491de2d47bd52f721.png!small?1715947804255

PUT 请求

图片如下所示,为回传的受害者的屏幕截图。

1715947820_6647492c21f1c87916a9e.png!small?1715947818500

屏幕截图

字节码

字节码的分析很有挑战,使用很多开源的反编译器可以得到不同的 Lua 脚本。

1715947835_6647493b1cd40d2abd9dc.png!small?1715947833834

反编译

调试过程如下所示:

1715947852_6647494c16f5329eaf79f.png!small?1715947850594

调试信息

通过将数据值传递给两个函数来填充 var_0_19,调试时可以发现 base64 编码的值存储在 var_0_19 中。这些 base64 字符串多是编码数据,而不是字符串。

1715947860_66474954870eb1c774a7b.png!small?1715947858547

函数传递

var_0_19 中的所有数据都会被分配给 var_0_26:

1715947875_66474963a5495a432e5b2.png!small?1715947873693

调试信息

同样的方式填充第二个 table(var_0_20),其中包含编码数据的替换密钥:

1715947886_6647496eac38bfdc0db6d.png!small?1715947885028

解密代码

解密代码如上所示,逐个元素迭代 var_0_26 并进行解密。循环很长并且包含很多垃圾代码,循环结束时将解密的值还给 var_0_26。

1715947900_6647497ca9b5ba62f5077.png!small?1715947898949

恶意代码

1715947912_664749881fdaf2b0056df.png!small?1715947910304

调试信息

断点设置在 1174 行并监测 var_0_26:

1715947924_664749945d86b22cab0f4.png!small?1715947922321

调试信息

当多次命中断点时,监视窗口可以看到更多加密数据:

1715947935_6647499f57daf4d192eb5.png!small?1715947933855

调试信息

解密的字符串例如 var_0_26 中的 Tamper Detected!

加载 LuaJIT 字节码

在加载 LuaJIT 字节码前,会创建一个新状态。每个 Lua 状态都维护其全局环境、堆栈与加载的库,从而在不同的 Lua 代码间提供隔离。

1715947947_664749abc73e690361a6d.png!small?1715947945644

恶意代码

恶意软件使用 Lua_openlib 函数加载库,并加载 debug、io、math、ffi 和其他支持的库。

1715948350_66474b3ebb29fb0e9c085.png!small?1715948348694

恶意代码

使用 lua51 的导出函数 luaL_loadfile 加载 LuaJIT 字节码,会使用 fread 函数读取 JIT 字节码,然后使用 memmove 函数移动到分配的内存。

1715948365_66474b4d03213551e20bb.png!small?1715948362883

调试信息

1715948379_66474b5bc861009ad5ec4.png!small?1715948377758

调试信息

文件中的字节码使用 memmove 函数将字节码从一个偏移量更改为另一个偏移量。使用 memmove 函数复制 JIT 字节码中 200 字节定长数据。

1715948390_66474b668c2489c0b8bb7.png!small?1715948388477

调试信息

获取 table 的值并使用浮点算术或异或指令对其进行处理:

1715948404_66474b746ae305638fd5c.png!small?1715948404084

调试信息

使用 memmove 函数将字节从源缓冲区移动到目标缓冲区。

1715948420_66474b84b46f97fbc9389.png!small?1715948418516

调试信息

进一步分析后,该脚本中将使用变量和参数进行定义:

1715948442_66474b9a8ada11ea1c8ad.png!small?1715948440554

调试信息

API 会使用 ffi 从 Lua 代码中直接访问 Windows API,定义 API 函数如下所示:

1715948462_66474bae20fd1cf7c2c53.png!small?1715948460572

函数信息

它会使用 CreateMutexExW 创建名为 Winter750 的互斥量:

1715948477_66474bbd08d77ff996d53.png!small?1715948475369

调试信息

也会使用 ntdll.dll 中的 LdrLoaddll 函数在运行时加载 dll,使用 LuaJIT ffi 调用该函数。

1715948492_66474bcc93cb80257ed97.png!small?1715948490745

调试信息

使用 ffi 使用 RegQueryValueEx 函数从 Windows 注册表检索 MachineGuid 项。使用 RegOpenKeyExA 打开注册表项SOFTWARE\Microsoft\Cryptography 并从打开的注册表项查询 MachineGuid 的值。

1715948505_66474bd9c23b069bb79fb.png!small?1715948503882

调试信息

使用 ffi 的 GetComputerNameA 函数从 Windows 注册表中检索 ComputerName。

1715948521_66474be97072f6b09585a.png!small?1715948519377

调试信息

收集以下信息并将其发送到 C&C 服务器:

1715948535_66474bf78b8deadf31a04.png!small?1715948534276

回传信息

1715948550_66474c0697b21ae336db4.png!small?1715948548758

回传信息

微软已经从官方存储库中删除了存在问题的文件。

IOC

5e37b3289054d5e774c02a6ec4915a60156d715f3a02aaceb7256cc3ebdc6610 873aa2e88dbc2efa089e6efd1c8a5370e04c9f5749d7631f2912bcb640439997 751f97824cd211ae710655e60a26885cd79974f0f0a5e4e582e3b635492b4cad dfbf23697cfd9d35f263af7a455351480920a95bfc642f3254ee8452ce20655a 213[.]248[.]43[.]58 hxxps://github.com/microsoft/STL/files/14432565/Cheater.Pro.1.6.0.zip https[:]//github[.]com/microsoft/vcpkg/files/14125503/Cheat.Lab.2.7.2.zip

参考来源

Mcafee

# lua # luaJIT # 窃密木马 # Redline Stealer
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录