Samir Bousseaden

搜索用于执行和防御逃避的可疑 Windows 库

了解更多关于通过搜索 DLL 加载事件来发现威胁的信息,这是一种在嘈杂的进程事件数据中揭示已知和未知恶意软件存在的方法。

Hunting for Suspicious Windows Libraries for Execution and Defense Evasion

动态链接库 (DLL) 映像加载是 Windows 中最嘈杂的事件类型之一,这可能会阻止防御者将其用于检测工程或威胁搜索。即使在某些环境中记录了,它通常也仅限于特定功能的 DLL,例如计划任务 (taskschd.dll)、Windows Management Instrumentation (wmiutil.dll) 以及可能从一些可疑文件夹加载的 DLL。除了数据量问题外,使用 DLL 事件的检测规则的误报率 (FP) 也往往与数据量成正比。

不幸的是,高级对手和普通的恶意软件都在利用这些限制来增加其攻击成功的机会,尤其是在通过各种鱼叉式网络钓鱼程序进行的交付阶段。

最常见的交付技术如下:

  • 使用二进制执行代理 Rundll32 和 Regsvr32 加载恶意 DLL
  • 将恶意 DLL 从虚拟磁盘映像(ISO/VHD 文件)侧加载到方便的签名良性二进制文件中
  • 从恶意的 Microsoft Office 文档(即 Word、Excel)中提取 DLL,并立即通过 Visual Basic for Applications (VBA) 加载它
  • 使用 lolbin 下载或提取 DLL,并通过另一个程序加载它
  • 将从压缩存档(zip、rar 等)中提取的恶意 DLL 侧加载到签名的良性二进制文件中
  • 通过多种方式将恶意 DLL 放入易受 DLL 侧加载攻击的现有程序(例如 OneDrive、Slack、Teams)的当前目录中
  • 不常见但也非常有效的是使用 Windows Installer MSIEXEC 加载恶意 DLL

我们使用 Elastic Endpoint 记录哪些 DLL 事件?

除了以下 Microsoft DLL 之外,Elastic 端点自 7.16 版本起记录所有非 Microsoft 签名的 DLL

我们还在 DLL 和进程事件中添加了一些增强功能,可以记录以下元数据

下面是从已挂载的 ISO 和 VHD 文件中进行 DLL 和进程执行的设备信息示例,这两个文件对象越来越多地用于传递恶意软件

以下是 svchost.exe 的进程执行相对文件创建和修改时间的示例

相对执行时间增强功能将帮助我们创建更少噪音的检测规则(我们可以将我们的规则与第一个或几个映像加载或进程执行实例进行匹配),并且设备信息将允许我们更好地针对 ISO/VHD 文件用于恶意目的的可疑用途。

检测

在本节中,我们将分享一些检测思路,这些思路既是可靠的信号,又有效地匹配了我们前面提到的大多数常见场景。

通过 Rundll32 / Regsvr32 加载 DLL

正如我们在自己的 全球威胁报告 中所捕获的那样,Rundll32 和 Regsvr32 lolbins 是两个最常被滥用的二进制执行代理。这些实用程序可以加载恶意 DLL,并且是许多网络钓鱼攻击(恶意快捷方式、ISO 文件、启用宏的文档)中常见的组件

在最近大约 90 天的时间里,我们的内部恶意软件沙箱看到了大约 21K 个恶意软件警报,其中恶意文件是由 regsvr32 或较少程度的 rundll32 加载的 DLL。

以下两个端点行为保护规则可有效对抗大约 80% 的利用 rundll32 或 regsvr32 执行恶意模块的样本(大约 21K 个中的大约 17K 个):- Rundll32 或 Regsvr32 加载的不寻常 DLL 扩展- RunDLL32/Regsvr32 加载删除的可执行文件

Rundll32 或 Regsvr32 执行超大文件

以下 EQL 查询将创建可执行文件事件与大于或等于 100MB 的文件大小相关联(此阈值可以调整为您的环境),随后通过 rundll32 或 regsvr32 加载为 DLL

以下是大小超过 700MB 的恶意控制面板 (CPL) 文件示例,该技术用于绕过 AV 文件扫描和基于信誉的云服务,这些云服务为上传的文件实施最大文件大小限制

Rundll32 或 Regsvr32 加载具有可疑原始文件名的 DLL

一些恶意 DLL 具有可疑的原始文件名,例如以 .EXE 扩展名结尾或原始文件名的长度与实际 DLL 名称之间存在很大不匹配。这种防御规避不太常见,并且被许多已知的恶意软件家族采用

一些示例

通过磁盘映像加载 DLL

在虚拟磁盘映像中嵌入恶意负载并不新鲜或特别新颖,但该技术在普通恶意软件家族中越来越受欢迎。

来自 ISO 挂载设备的可疑 ImageLoad

以下规则查找执行通常被滥用的 Windows 二进制文件以从挂载的虚拟磁盘映像加载 DLL

以下是一些该技术的示例

从磁盘映像加载的可疑 Microsoft 映像

当可执行文件从挂载的虚拟磁盘映像(.vhd、.iso)运行时,加载可疑的 Microsoft 签名 DLL 时,会触发以下规则,例如与某些常见恶意软件功能(如持久性、凭据访问和规避)相关的 taskschd、bitsproxy 或 vaultclient 模块。

此查询标识通过 ISO 文件传递的许多普通恶意软件家族

通过重命名的签名二进制文件进行潜在的 DLL 侧加载

以下查询标识了从挂载的虚拟磁盘(.iso、.vhd)加载未签名 DLL 并使用重命名的签名二进制文件(原始文件名与进程名称不同)的尝试。

这描述了一些匹配项的示例,其中签名且重命名的程序正在从挂载的磁盘映像加载 DLL

通过 Microsoft 签名二进制文件进行潜在的 DLL 侧加载

此检测标识了从挂载的虚拟磁盘(.iso、.vhd)加载未签名 DLL 并使用 Microsoft 签名二进制文件的尝试

以下示例中,Microsoft OneDrive 和 Windows 控制面板可执行文件被滥用,以侧加载恶意模块以进行初始访问和执行。

来自存档文件的 DLL

与虚拟磁盘映像类似,攻击者还可以使用带有嵌入恶意 DLL 的 ZIP/RAR 存档文件,并与受信任的二进制文件或快捷方式 (LNK) 文件配对来获得访问权限。

以下屏幕截图显示了此查询如何从 RAR 存档中识别恶意文件,该文件被自动提取到临时用户目录中。这种情况相当常见。

通过恶意文档加载 DLL

Microsoft Office 文档也可用于部署和加载恶意 DLL,以避免产生可疑的子进程。以下查询将可执行 (PE) 文件创建事件与 DLL 加载事件相关联。

以下是一些使用此交付技术的恶意 Word 和 Excel 文档的示例。

通过 MSIEXEC 加载 DLL

当您需要执行恶意 DLL 时,MsiExec 是另一个不错的选择,因为此活动与合法的软件安装程序很好地融合在一起。观察到的两种交付方法是

  • 使用命令行参数 /y 或 /z 从随机 DLL 调用 DLLRegisterServer 导出,如 此处 所述
  • 构建一个安装程序,该安装程序使用自定义操作来加载和执行 DLL,如 此处 和 此处 所述

以下查询可用于识别内置 Windows 安装程序 MSIEXEC 的执行,以调用导出的函数并运行代码

以下是使用 MSI 加载恶意 DLL 的示例

通过 Windows Installer 自定义操作交付的 DLL 可以通过关联 DLL 文件创建事件来检测,其中调用进程是 MsiExec,并且该 DLL 随后由同一 MsiExec 进程加载。

值得注意的是,Windows Installer 自定义操作有一些合法的用途,此查询可能需要在使用这些操作的环境中进行一些过滤。

以下查询匹配了 AhnLab 记录的 Gwisin 勒索软件,并且为此创建了 PoC

通过 lolbins 交付 DLL

一些恶意软件依赖可信的 Microsoft 二进制文件来下载、解码或提取 DLL。此查询将常见内置工具的 PE 文件创建或修改与随后的映像加载相关联。

以下是使用此检测方法识别的恶意软件示例

DLL 侧加载到现有程序

以下检测识别尝试通过同一当前目录中已存在的签名进程加载最近创建的未签名 DLL 文件的尝试。通过比较现有程序的创建时间和 DLL 创建时间之间的差异,我们可以发现此类异常情况。

下一个示例匹配了当恶意 secure32.dll 进程(28 秒前创建)写入当前的 OneDrive 目录并由 OneDrive.exe(2.5 年前创建)自动加载时的情况

从可疑目录加载 DLL

将 DLL 放入用户可写目录并使用可信二进制文件进行侧加载也是一种常见的模式。以下查询会查找此行为,并通过利用相对创建和修改时间,可以减少警报量,同时将警报限制在初始执行后的时间窗口内。

最常见的用户可写目录是 ?:\Users\Public?:\ProgramData。包含 70 多个可疑文件夹的完整查询可以在 此处 找到。

以下示例描述了恶意匹配,其中滥用了各种可信二进制文件来加载恶意 DLL

具有异常创建时间的 DLL 加载

另一个有趣的场景是识别 DLL 加载事件,其中 DLL 具有可疑的创建时间,这可能是时间戳伪造的结果。此查询使用 dll.Ext.relative_file_name_modify_time 和 dll.Ext.relative_file_creation_time 比较创建时间和文件名修改时间之间的不一致,然后立即进行映像加载

以下是一个示例,其中恶意软件在可信目录中放置 DLL,然后使用时间戳伪造来确保这些 DLL 与这些目录中的现有文件混合在一起

来自可移动设备的 DLL

从可移动设备侧加载 DLL 仍然是一种有效的感染媒介,尤其是在气隙网络中。最近,Mandiant 分享了一个涉及以间谍活动为导向的威胁的示例。以下 EQL 查询可用于查找类似的行为

以下是一个包含多个匹配项的示例

保护规则

Elastic 提供了强大的功能,可通过利用 Windows Libraries 事件的现有行为保护规则来识别不寻常或恶意的库加载事件

结论

与依赖进程执行事件的检测相比,对手通过命令行标志和父进程关系暴露了更多的检测机会,因此基于 DLL 事件设计检测需要更多的丰富和关联,以降低噪声率并提高置信度。

在本出版物中,我们分享了许多如何使用 DLL 事件识别威胁的示例。您还可以使用 Elastic 端点提供的不同功能来生成更高信号的警报。但是,鉴于以 DLL 形式交付恶意代码的方法众多,仅依赖行为检测是不够的。将此逻辑与恶意软件文件分类、shellcode 检测功能和基于用户实体分析 (UEBA) 相结合,可以提高此元数据用于检测目的的保真度。