执行摘要
本文重点介绍了一种新的混淆技术,威胁参与者正在使用这种技术,通过隐写技术将恶意软件隐藏在嵌入在原本无害的 32 位 .NET 应用程序中的位图资源中。这些文件在执行时会启动一个多阶段的攻击链,包括提取、反混淆、加载和执行辅助有效载荷(动态链接库),最终引爆最终有效载荷(可执行文件)。
我们将演示如何利用内部遥测数据中观察到的近期恶意垃圾邮件 (malspam) 活动中提取的恶意软件,从嵌入原始文件的初始位图资源中恢复最终有效载荷。安全从业人员可以通过了解该技术的内部工作原理来更好地防御它。
初步发现
我们在 2024 年底至 2025 年初期间观察到了多波恶意垃圾邮件攻击活动,这些垃圾邮件攻击活动使用电子邮件附件。其中最引人注目的一波攻击针对的是土耳其共和国的金融行业组织。另一波恶意垃圾邮件攻击针对的是亚洲的物流行业。在此次攻击活动中,攻击者在目标地区传播了超过 250 封电子邮件,每封邮件都包含相同的恶意软件。
攻击者使用目标地区的母语撰写电子邮件主题。原始恶意软件样本是一个 Windows 可执行文件 ( .exe ),其文件名与以下内容相关:
-
采购——报价请求(RFQ)或采购订单(PO)
-
发送恶意垃圾邮件的受感染组织的名称
-
感兴趣的特定金融交易的日期
此次活动中,恶意垃圾邮件的共同点在于,它们使用嵌入在原本无害的 32 位 .NET 应用程序中的位图资源,将攻击引向目标行业、部门和地区。例如,我们为本文分析的恶意软件样本使用了名为Windows Forms OCR 的应用程序的合法.exe文件的副本。
除了将恶意负载隐藏为位图资源外,其他常见的 .NET 混淆技术还包括:
-
元数据混淆:重命名或删除类、方法或属性名称以阻碍静态分析
-
操作码替换:将标准中间语言 (IL) 指令替换为功能相同但识别度较低的指令(例如,将callvirt操作码替换为call ,以混淆分析师在检查 .NET 恶意软件样本时经常使用的 .NET 反编译器)
-
被盗字节:删除或重新定位 IL 代码段,在运行时动态重建代码,以便 .NET 反编译器将反编译的代码呈现为不完整或无效
-
控制流混淆:使用不透明谓词、状态机或调度循环重新排序、重构或替换执行路径(例如,控制流平坦化)
-
基于虚拟化的混淆:用只能由附带的自定义解释器执行的自定义字节码替换 IL 代码(参见《揭开被加密和虚拟化混淆的 .NET 恶意软件》)
-
字符串加密:静态加密字符串,运行时仅在必要时解密
-
动态代码生成:通过反射在运行时生成和执行代码
攻击者可以单独使用每一种技术,也可以以某种组合使用,以增强恶意 .NET 应用程序抵御逆向工程的能力。
技术分析
以下部分详细分析了我们如何从初始位图资源中恢复最终有效载荷。
此分析针对具有以下 SHA-256 哈希值的恶意软件样本:
ac5fc65ae9500c1107cdd72ae9c271ba9981d22c4d0c632d388b0d8a3acb68f4
第一阶段:初始有效载荷
本示例的 .NET 代码中使用的MainForm类对其方法和参数采用了与特定主题一致的命名约定。
例如,它将海洋研究和海洋学与如下名称配对:
-
AbyssalScan(海洋底部、海洋生命、最大样本)
-
海洋探索(海底、海洋生物、最大标本)
-
验证血氧饱和度(水平)
图 1 描述了原始恶意软件样本进程xgDV.exe将其 .NET 位图资源sv解压到TL.dll程序集中。
图 1. 恶意软件脱壳过程第 1 阶段的概念概述。
MainForm .NET 类的 InitializeComponent() 方法负责对名为sv的恶意位图资源的前 71,168 个字节进行反混淆和加载,如图 2 所示。
图2.加载恶意位图资源。
第二阶段:TL.dll
名为sv的位图资源完全加载为TL.dll。此TL.dll程序集是另一个加载器,它本身不包含任何资源。图 3 展示了TL.dll程序集将嵌入在原始恶意软件样本进程xgDV.exe中的.NET 位图资源rbzR解压到Montero.dll程序集中的过程。
图 3. 恶意软件脱壳过程第 2 阶段的概念概述。
然后,原始进程通过LateBinding.LateCall()函数调用使用反射。此调用会调用TL.dll程序集中名为Justy()的方法。原始样本中嵌入了第二个位图资源rbzR ,该资源被编码为十六进制字符串72627A52,并作为参数传递给此Justy()方法,如图 4 所示。
图 4.执行加载的位图资源。
第 3 阶段:Montero.dll
图 5 描述了Montero.dll程序集将其 .NET 字节数组资源uK5APqTdSG解压到最终有效载荷Remington.exe中。
图 5. 恶意软件脱壳过程第 3 阶段的概念概述。
TL.dll将名为rbzR的位图资源反混淆并加载为Montero.dll(另一个加载器)。该文件反混淆、加载并执行其自身的名为uK5APqTdSG的字节数组资源。
Montero.dll通过应用减法 XOR 加密来完成反混淆,如图 6 所示。使用 XOR 密钥opIaZhYa ,此过程生成名为Remington.exe的最终有效载荷。
图 6. 使用减法算法的 XOR 加密。
此外,许多标志决定了最终有效载荷执行的性质(例如,最终有效载荷是否作为子进程分叉)。
第四阶段:最终有效载荷
这种混淆的目的是逃避检测并成功引爆流行的恶意软件家族(例如 Agent Tesla 变体、XLoader 和 Remcos RAT),从而在受害者系统中取得初步立足点。
本例中,最终的payload属于Agent Tesla家族。其配置提取如下:
感染后 SMTP 数据泄露:
-
服务器:hosting2[.]ro.hostsailor[.]com:587
-
发件人:packagelog@gtpv[.]online
-
密码:7213575aceACE@@
-
收件人:package@gtpv[.]online
分析方法
克服这种混淆技术的一种有效方法是使用 .NET Framework 的ICorDebugManagedCallback接口来创建一个挂钩以下 API 函数的调试器:
-
System.Resources.ResourceManager::GetObject(字符串名称)
-
拦截.NET 应用程序读取的嵌入式资源(包括位图)
-
System.AppDomain::Load(byte[] rawAssembly)和System.Reflection.Assembly::Load(byte[] rawAssembly)
-
拦截从原始字节数组加载 .NET 程序集
挂钩是放置断点的行为,它会在某些时间点暂时暂停程序执行以提取感兴趣的值。
结论
使用位图资源隐藏恶意负载是一种在恶意垃圾邮件活动中普遍使用的隐写技术。通过将恶意负载隐藏为位图资源,威胁行为者有可能绕过传统的安全机制并逃避检测。
本文的分析重点阐述了威胁行为者如何利用这种传递方式隐秘地执行恶意代码。安全从业人员务必了解这种混淆技术,以防范此类威胁。
原文始发于微信公众号(Ots安全):隐秘的.NET恶意软件:将恶意负载隐藏为位图资源
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论