近期,X-Force Red 发布了名为 Windows Feature Hunter 的工具,该工具利用 Frida 识别 Windows 系统中可用于动态链接库 (DLL) 侧加载的目标。为提供针对 DLL 侧加载的防御性应对视角,X-Force 事件响应团队发布了 SideLoaderHunter——这是一个系统分析脚本及 Sysmon 配置方案,专为识别 Windows 系统上的侧加载证据而设计。本文将阐述 IBM X-Force 认为需要此工具的原因,描述其功能并分析若干使用场景。
在 Microsoft Windows 中,程序可通过指定完整路径或使用清单等机制来定义运行时加载的库文件。程序清单是应用程序中的外部文件或嵌入式资源,用于管理应用程序执行时应加载的共享并行程序集的名称与版本。程序清单可包含 DLL 重定向、文件名或完整路径。若清单仅引用库文件名,则被视为弱引用,易受 DLL 侧加载攻击。
若对库文件采用弱引用,Windows 会按预定义的搜索顺序定位 DLL。Windows 首先搜索的位置是加载应用程序的目录。
DLL 侧加载攻击是一种对抗技术,旨在利用弱库引用和 Windows 默认搜索顺序,通过在系统中伪装成合法 DLL 的恶意 DLL 文件,使其被合法程序自动加载。
有关 DLL 侧加载的更多信息,请参考 MITRE ATT& CK Technique T1574.002。
DLL 侧加载并非新技术,自 Windows XP 起就存在搜索顺序劫持漏洞。X-Force 曾观察到 Metamorfo 银行木马使用 DLL 侧加载技术:该木马投放恶意 MSI 文件,提取已签名的二进制文件与恶意 DLL 以执行第二阶段恶意软件加载器。由于 Windows 内置的默认搜索顺序,已签名的二进制文件将加载恶意 DLL 并延续恶意执行流程。
尽管 DLL 侧加载并非威胁行为者最常用的技术,但勒索软件运营者正越来越多地采用此技术。他们利用 DLL 侧加载 执行勒索软件载荷,以规避安全产品的检测。
例如,勒索软件运营者 REvil 曾利用 Windows Defender 可执行文件 (MsMpEng.exe) 中的 DLL 侧加载漏洞,加载名为 mpsvc.dll 的恶意 DLL(内含勒索软件载荷)。
X-Force 观察到多数威胁行为者或恶意软件不会通过覆盖系统现有二进制文件或模块来实施 DLL 侧加载攻击,因为这可能导致系统崩溃或产生可能引发检测的错误。
相反,利用 DLL 侧加载的威胁行为者或恶意软件通常在发动攻击前依赖两种行为模式:
第一种使用场景的检测方法较为直接。虽然二进制文件可能经过签名,但其执行行为在程序执行数据集中仍会被视为异常。在前述 Metamorfo 示例中,恶意软件植入了 Avast 的内存转储工具 AVDump32.exe(重命名为 jesus.exe),并通过其侧加载了名为 dbghelp.dll 的恶意 DLL。
此示例中,通过对程序执行数据集中记录的文件名进行频率分析,即可识别 jesus.exe。
图 1:程序执行数据集中二进制名称频率分析图
第二种使用场景更难检测,因其通常利用受信任的标准 Windows 应用程序执行恶意 DLL,使恶意活动能隐匿于正常程序执行数据中。虽然可通过分析程序执行数据集中二进制文件完整路径的频率来发现检测机会,但未经任何过滤的分析效率极低。
替代方案是:仅筛选程序执行数据集中默认位于 System32 或 SysWow64 目录的可执行文件名称。此时分析将针对所有与 System32 或 SysWow64 可执行文件相关的程序执行数据展开,重点检测二进制文件完整路径与默认路径不匹配的情况。
为执行此分析,需从 Windows 系统创建默认 System32 和 SysWow64 可执行文件的查找表,该表将作为对照数据集,防御人员可据此识别异常。
以下 PowerShell 脚本将枚举 System32 和 SysWow64 目录内的可执行文件,并将结果导出为 CSV 文件。
将 sysbins.csv 用作对照组,既能识别进程执行,又能为 Windows 应用程序出现在其默认 System32 或 SysWow64 目录之外提供证据。
| $SysBinList = Get-ChildItem $env:SystemRoot\system32\ ,$env:SystemRoot\syswow64\ -Recurse -ErrorAction SilentlyContinue | Where-Object {($_.Extension -like “.exe”)} -ErrorAction SilentlyContinue | Select Name;$SysBinLobj = $SysBinList.Name | select -Unique | Select-Object @{Name=’Name’; Expression={$_}};$SysBinLobj | export-csv sysbins.csv -NoTypeInformation |
图 2:System32 二进制文件完整路径频率分析图
需重点注意的是,威胁行为者可通过重命名二进制可执行文件来规避基于文件名匹配的检测,因为无论可执行文件名称如何更改,侧加载技术本身依然可行。
图 3:侧加载 mspaint.exe(重命名为 notmspaint.exe)与 msftedit.dll
检测重命名可执行文件的一种方法是对 Windows 主机上 System32 和 SysWow64 可执行文件的哈希值进行进一步画像分析,或从目标系统收集可执行文件的内部名称。部分进程执行监控解决方案(如 Sysmon)会在执行时捕获可执行文件的内部名称。此外,PowerShell 具备在可执行文件重命名后枚举其原始文件名的能力。
图 4:在 PowerShell 中列出原始文件名属性
以下脚本将枚举 System32 和 SysWow64 目录中的可执行文件哈希值列表,该列表也可作为对照组数据集,用于识别非标准位置中的标准 Windows 可执行文件。
$binarray=@()$SysBinList = Get-ChildItem $env:SystemRoot\system32\,$env:SystemRoot foreach($bin in $SysBinList) { $binhash = Get-FileHash $bin.FullName -Algorithm SHA1 $binobject = New-Object psobject $binobject | Add-Member -MemberType NoteProperty -Name “Name” -Value $bin.Name $binobject | Add-Member -MemberType NoteProperty -Name “Hash” -Value $binhash.Hash $binarray += $binobject } $binarray | export-csv sysbinhash.csv -NoTypeInformation |
图 5:用于收集文件哈希值的 PowerShell 脚本
然而,上述检测方法在具备集中化进程执行数据且能建立环境内长期活动基线时更为有效。这在调查过程中极为罕见。
为克服这一挑战,X-Force 部署了数据收集工具来大规模收集端点元数据。其中一款工具是 SideLoadHunter,该工具将对端点进行分析,收集用户配置文件夹、System32 和 SysWow64 目录中的 DLL 和可执行文件信息。完成可执行文件和 DLL 的分析后,X-Force 通过文件名、哈希值和内部名称进行对比分析,以识别可能的 DLL 侧加载证据。同时,还会分析程序执行痕迹,寻找磁盘上已不存在的侧加载可执行文件证据。该工具已移植到 PowerShell 平台,可在 此处下载。
SideLoadHunter 的主要功能包括:
图 6:Side-Loadhunter.ps1 执行
图 7:源自 Side-Loadhunter.xml 的 Sysmon 事件
虽然恶意软件与攻击者常以 System32 和 SysWow64 目录内的可执行文件为侧加载目标,但 DLL 侧加载的潜在目标并不限于这些目录。例如,通过 X-Force 事件响应与 X-Force Red 的协同研究发现,Windows 10 系统默认位于 %userprofile%\appdata\local\Microsoft\OneDrive 目录的可执行文件OneDriveStandaloneUpdater.exe,可通过位于 %windir%\system32\ 的 WofUtil.dll 实现侧加载。
图 8:通过 WofUtil.dll 侧加载 OneDriveStandaloneUpdater.exe
X-Force 目前正深入开展研究,旨在建立更全面的可执行文件及 DLL 侧加载目标清单,敬请关注后续更新。