野外 Windows LPE 0-day:洞察与检测策略

admin 2024年7月3日08:16:15评论6 views字数 9114阅读30分22秒阅读模式

野外 Windows LPE 0-day:洞察与检测策略

根据微软、谷歌、卡巴斯基、Checkpoint和其他行业参与者的披露,很明显,在野的 Windows 本地特权提升 (LPE) 零日漏洞越来越普遍,并且是复杂网络犯罪和 APT 武器库中不可或缺的组成部分。检测工程师必须仔细检查这些可公开访问的样本并评估可能的检测途径。

本文不会深入探讨漏洞的根本原因或具体细节;但是,我们确实提供了相关漏洞研究文章的链接。我们将使用Elastic Defend功能评估基于动态行为分析的检测方法。

案例1 - 通用日志文件系统

通用日志文件系统 (CLFS)是一种通用日志记录服务,可供需要高性能事件日志记录的软件客户端使用。Microsoft安全更新指南显示,自 2018 年以来,已有 30 多个 CLFS 漏洞得到修补,其中 5 个是在 2023 年勒索软件攻击中发现的。2024 年初也出现了针对同一 CLFS 驱动程序的漏洞报告(由多位研究人员提交)。

您可以在此处找到一系列深入探讨 CLFS 漏洞内部机制的优秀文章。这些漏洞的共同点在于,它们利用一些clfsw32.dllAPI(CreateLogFile和AddLogContainer)来创建和操纵 BLF 日志,从而允许它们写入或破坏内核模式地址。结合其他漏洞利用原语,这可以成功提升权限。

根据这些漏洞的具体情况,可以设计高级检测来识别异常进程。例如,以低或中等完整性运行的进程可以创建 BLF 文件,然后意外执行系统完整性级别的活动(生成系统子进程、API 调用、文件或使用系统权限进行注册表操作)。

以下 EQL 查询可用于关联 Elastic Defend 文件事件,其中调用堆栈包含用户模式 API 的引用CreateLogFile或AddLogContainerSet,特别是在以普通用户身份运行时,然后创建以 SYSTEM 身份运行的子进程:

sequence with maxspan=5m  by process.entity_id [process where event.action == "start" and user.id : "S-1-5-18"] by process.parent.entity_id

以下是 CVE-2022-24521 上的匹配示例,cmd.exe以 SYSTEM 身份启动:

野外 Windows LPE 0-day:洞察与检测策略

CLFS LPE 漏洞检测

以下 EQL 查询使用与上一个类似的逻辑,但它不会生成子进程,而是在 BLF 文件事件之后查找具有 SYSTEM 权限的 API、文件或注册表活动:

sequence by process.entity_id   [any where event.category : ("file", "registry", "api") and user.id : "S-1-5-18"] until [process where event.action:"end"]

以下截图与 CLFS 利用提升权限(使用系统权限删除文件)后工件的清理阶段相匹配:

野外 Windows LPE 0-day:洞察与检测策略

CLFS LPE 漏洞检测

除了前两种行为检测之外,我们还可以利用 YARA 来寻找导入用户模式 APICreateLogFile或AddLogContainerSet非典型数量函数的未签名 PE 文件clfsw32.dll(正常的 CLFS 客户端程序会从同一个 DLL 导入更多函数):

import "pe" rule lpe_clfs_strings {    strings:     $s1 = "NtQuerySystemInformation"     $s2 = "clfs.sys" nocase    condition:     uint16(0)==0x5a4d and (pe.imports("clfsw32.dll", "CreateLogFile") or pe.imports("clfsw32.dll", "AddLogContainer")) and all of ($s*)}rule lpe_clfs_unsigned {    condition:     uint16(0)==0x5a4d and pe.number_of_signatures == 0 and filesize <= 200KB and       (pe.imports("clfsw32.dll", "CreateLogFile") or pe.imports("clfsw32.dll", "AddLogContainer")) and       not (pe.imports("clfsw32.dll", "ReadLogRecord") or pe.imports("clfsw32.dll", "CreateLogMarshallingArea"))}

以下是使用 Elastic 的 YARA 规则针对CVE-2023-2825进行VT 匹配的示例:

野外 Windows LPE 0-day:洞察与检测策略

YARA 规则匹配 CVE-2023-2825

YARA 规则匹配 CVE-2023-2825

案例 2 - Windows DWM 核心库 EoP

自 Windows Vista 以来,桌面窗口管理器 ( dwm.exe) 一直是 Microsoft Windows 中的合成窗口管理器。此程序启用硬件加速来渲染 Windows 图形用户界面,并具有高权限;但是,具有低权限的用户可以与 DWM 进程交互,这大大增加了攻击面。

安全研究员Quan Jin报告了CVE-2023-36033的在野漏洞利用,Google Project Zero 随后发布了一份详细说明该漏洞利用阶段的文章。

根据我们的理解,DWM Core Library ( dwmcore.dll) 漏洞利用很可能会dwm.exe在以 Window ManagerDWM 用户权限运行时触发进程中的 shellcode 执行。请注意,这是高完整性级别,但还不是 SYSTEM 级别。

在 Elastic Defend 上引爆 ITW 公共样本确实会触发自注入 shellcode 警报。如果没有事先了解和上下文,人们可能会将其与通用代码注入警报或误报混淆,因为它是由 Microsoft 受信任的系统二进制文件发出的自注入警报,具有正常的父进程,并且没有加载恶意库。

以下 KQL 搜索可用于查找类似的 shellcode 警报:

event.code : "shellcode_thread" and process.name : "dwm.exe" and user.name : DWM*

野外 Windows LPE 0-day:洞察与检测策略

CVE-2023-36033 的 Shellcode 检测警报

dwm.exe除了 shellcode 执行之外,我们还可以通过对子进程和文件活动进行基准测试来查找异常活动。下面,我们可以看到由于利用而dwm.exe产生的一个示例:cmd.exe

野外 Windows LPE 0-day:洞察与检测策略

由于 LPE 漏洞,DWM 生成 cmd.exe

根据我们的遥测可见性,很少会产生合法的子进程。可以使用dwm.exe以下检测来查找异常进程:

process where event.action == "start" and process.parent.executable : "?:\Windows\system32\dwm.exe" and user.id : ("S-1-5-90-0-*", "S-1-5-18") and process.executable : "?:\*" and  not process.executable : ("?:\Windows\System32\WerFault.exe", "?:\Windows\System32\ISM.exe", "?:\Windows\system32\dwm.exe")

野外 Windows LPE 0-day:洞察与检测策略

为了进一步将权限从 Window ManagerDWM 用户提升到 SYSTEM,shellcode 将 DLL 放入磁盘并在进程kernelbase!MapViewOfFile内的调用上放置 JMP 挂钩dwm.exe。然后它通过执行命令触发注销shutdown /l。

LogonUI.exe注销操作会触发以 SYSTEM 用户身份运行的进程的执行。该LogonUI.exe进程将与桌面窗口管理器进程进行通信,类似于任何桌面 GUI 进程,后者将编组/解组 Direct Composition 对象。

MapViewOfFile内部钩子会监视映射的堆内容。当资源堆数据在进程内解组时,dwm.exe它会使用另一组精心设计的小工具来修改它,这些小工具用于执行对投放的 DLL 的调用。LoadLibraryALogonUI.exe

这里的两个主要检测点发生在dwm.exe将 PE 文件放入磁盘时以及LogonUI.exe加载 DLL 时,调用堆栈指向dcomp.dll- 编组/解组直接组合对象的指示器。

dwm.exe下面是一个 KQL 查询,通过将 PE 文件拖放到文件事件和恶意软件警报中的磁盘来进行查找:

(event.category :"file" or event.code :"malicious_file") and process.name :"dwm.exe" and user.id:S-1-5-90-0-* and (file.extension :(dll or exe) or file.Ext.header_bytes :4d5a*)

野外 Windows LPE 0-day:洞察与检测策略

DWM 在漏洞利用执行后将反射 DLL 放入磁盘

下面是查找 LogonUI DLL 加载劫持的检测EQL 查询:

library where process.executable : "?:\Windows\System32\LogonUI.exe" and  user.id : "S-1-5-18" and  not dll.code_signature.status : "trusted" and  process.thread.Ext.call_stack_summary : "*combase.dll|dcomp.dll*"

野外 Windows LPE 0-day:洞察与检测策略

LogonUI.exe 加载 dwm.exe 释放的 DLL

案例 3 - Windows 激活上下文 EoP

CVE-2022-41073是另一个有趣的野外漏洞。核心漏洞是用户可以C:在模拟期间为特权进程重新映射根驱动器 ()。此特定示例通过在客户端服务器运行时子系统 (CSRSS) 中的激活上下文生成期间将驱动器重定向到来printfilterpipelinesvc.exe诱骗进程加载任意 DLL 。然后它伪装成目录,并且非特权用户无法写入。C:C:OneDriveRootC:WindowsWinSxS

从行为角度来看,它属于由 SYSTEM 完整性进程加载由低/中完整性进程丢弃的 DLL 的类别。还有伪装成合法 Windows WinSxS 文件夹的痕迹。

以下 EQL 搜索可用于查找伪装成受信任的系统文件夹进行重定向的类似尝试:

any where (event.category in ("file", "library") or event.code : "malicious_file") and (  file.path : ("C:\*\Windows\WinSxS\*.dll", "C:\*\Windows\system32\*.dll", "C:\*\Windows\syswow64\*.dll", "C:\*\Windows\assembly\NativeImages*.dll") or   dll.path : ("C:\*\Windows\WinSxS\*.dll", "C:\*\Windows\system32\*.dll", "C:\*\Windows\syswow64\*.dll", "C:\*\Windows\assembly\NativeImages*.dll") )

野外 Windows LPE 0-day:洞察与检测策略

CVE-2022-41073 EoP 尝试伪装成受信任的系统文件夹

这也与此通用端点检测相匹配,它寻找由提升的系统本机进程加载的不受信任的模块:

野外 Windows LPE 0-day:洞察与检测策略

警报 - 系统 Windows 进程加载不受信任的 DLL

通用行为检测

上述示例表明,每个漏洞都具有不同的特征。利用方法因原语的灵活性而异,例如写入地址、执行 shellcode、加载任意 DLL 或创建文件。某些系统组件可能比其他组件存在更多漏洞,需要专门的检测工作(例如 CLFS、win32k)。

尽管如此,这些漏洞的最终目的和影响仍然保持一致。这凸显了设计更有效检测策略的机会。

权限提升可以表现为多种形式:

  • 低/中完整性进程生成高完整性级别的子进程

  • 低/中完整性进程将代码注入到提升的进程中

  • 系统完整性进程意外加载不受信任的 DLL

  • 系统本机进程意外删除 PE 文件

  • 低/中完整性进程将文件放入受系统保护的文件夹中

  • 用户模式进程写入内核模式地址

利用 Elastic Defend 的功能,我们可以设计检测并寻找上述每一种可能性。

低/中完整性进程产生提升的子进程:

sequence with maxspan=5m [process where event.action == "start" and  process.Ext.token.integrity_level_name in ("medium", "low")] by process.entity_id [process where event.action == "start" and  process.Ext.token.integrity_level_name == "system" and user.id : "S-1-5-18"] by process.parent.entity_id

利用易受攻击的驱动程序(Zemana )作为 SYSTEM权限运行的样本的匹配示例:zam64.sys cmd.exe

野外 Windows LPE 0-day:洞察与检测策略

检测异常的父子进程完整性级别

低/中完整性进程将代码注入提升的进程:

以下是一个ES|QL查询,用于查找罕见的跨进程 API 调用:

from logs-endpoint.events.api*| where process.Ext.token.integrity_level_name in ("medium", "low") and Target.process.Ext.token.integrity_level_name == "system" and process.Ext.api.name in ("WriteProcessMemory", "VirtualProtect", "VirtualAllocEx", "VirtualProtectEx", "QueueUserAPC", "MapViewOfFile", "MapViewOfFileEx")| stats occurrences = count(*), agents = count_distinct(host.id) by process.Ext.api.name, process.executable, Target.process.executable| where agents == 1 and occurrences <= 100

当我们运行此查询时,我们通过令牌交换将 LPE 漏洞注入到winlogon.exe提升后:

野外 Windows LPE 0-day:洞察与检测策略

检测从 Medium IL 到以 SYSTEM 身份运行的 winlogon.exe 的跨进程注入
系统完整性进程意外加载不受信任的 DLL
下面是一个 ES|QL 查询,用于查找已被提升的 Microsoft 二进制文件加载的罕见未签名 DLL:
from logs-endpoint.events.library-*| where host.os.family == "windows" and event.action == "load" and  starts_with(process.code_signature.subject_name, "Microsoft") and          user.id in ("S-1-5-18", "S-1-5-19", "S-1-5-20") and   process.code_signature.status == "trusted" and   dll.Ext.relative_file_creation_time <= 500 and  (dll.code_signature.exists == false or dll.code_signature.trusted == false) and     /* excluding noisy DLL paths */     not dll.path rlike """[C-F]:\Windows\(assembly|WinSxS|SoftwareDistribution|SystemTemp)\.+.dll""" and /* excluding noisy processes and potentially unrelated to exploits - svchost must be covered by a dedicated hunt to exclude service dlls and COM */not process.name in ("rundll32.exe", "regsvr32.exe", "powershell.exe", "msiexec.exe", "svchost.exe", "w3wp.exe", "mscorsvw.exe", "OfficeClickToRun.exe", "SetupHost.exe", "UpData.exe", "DismHost.exe")| stats occurrences = count(*), host_count = count_distinct(host.id) by dll.name, process.name/* loaded once and the couple dll.name process.name are present in one agent across the fleet */| where occurrences == 1 and host_count == 1

野外 Windows LPE 0-day:洞察与检测策略

LogonUI 通过 dcomp 解组加载恶意 DLL

系统本机进程意外删除 PE 文件

以下 ES|QL 查询可用于搜索具有少量可执行文件创建历史记录且在受监控主机群中仅限于一个代理的 Microsoft 签名特权二进制实例:

from logs-endpoint.events.file-*| where  @timestamp > now() - 30 day| where host.os.family == "windows" and event.category == "file" and event.action == "creation" and user.id in ("S-1-5-18", "S-1-5-19", "S-1-5-20", "S-1-5-90-0-*") and starts_with(file.Ext.header_bytes, "4d5a") and process.code_signature.status == "trusted" and starts_with(process.code_signature.subject_name, "Microsoft") and  process.executable rlike """[c-fC-F]:\Windows\(System32|SysWOW64)\[a-zA-Z0-9_]+.exe""" and not process.name in ("drvinst.exe", "MpSigStub.exe", "cmd.exe")| keep process.executable, host.id| stats occurrences = count(*), agents = count_distinct(host.id) by process.executable| where agents == 1 and occurrences == 1

野外 Windows LPE 0-day:洞察与检测策略

SYSTEM 进程创建不寻常的 PE 文件

用户模式进程写入内核模式地址

破坏PreviousMode是一种广为流行的漏洞利用技术。覆盖KTHREAD结构中的这一个字节可绕过系统调用(例如NtReadVirtualMemory或 )内的内核模式检查NtWriteVirtualMemory,从而允许用户模式攻击者读取和写入任意内核内存。

在 x64 上,虚拟地址空间分为从0x00000000 00000000- 的用户模式地址0x0000FFFF FFFFFFFF和从0xFFFF0000 00000000- 的内核模式地址0xFFFFFFFF FFFFFFFF。以下 EQL 查询可用于检测目标地址为内核模式地址的APINtReadVirtualMemory或调用,这是一种异常行为:NtReadVirtualMemory

api where process.pid != 4 and process.Ext.api.name : "WriteProcessMemory" and process.executable != null and    /*  kernel mode address range - decimal */   process.Ext.api.parameters.address > 281474976710655

以下是利用此原语的漏洞触发警报的示例

野外 Windows LPE 0-day:洞察与检测策略

检测 PreviousMode 滥用

结论

检测特定漏洞的特权提升需要深入了解漏洞及其利用方法,这并不是常识。因此,投资于通用行为检测机制,重点关注系统的漏洞利用效果以及常用的原语,如KASLR 绕过、令牌交换、PreviousMode 滥用等,效果更为显著。但是,对于 CLFS 和 win32k 等高度针对性的 Windows 系统组件,专用检测始终很有价值 - 理想情况下是行为和 YARA 的组合。

尽管技术复杂且缺乏常见原语的日志,蓝队不应忽视漏洞利用和漏洞研究内容;相反,他们应该努力理解和应用它。此外,通过 VirusTotal 或类似的野外 LPE 漏洞利用样本与防御社区共享将进一步促进检测控制的测试和增强。

In- the- Wild Windows LPE 0- days: Insights & Detection Strategieshttps://www.elastic.co/security-labs/itw-windows-lpe-0days-insights-and-detection-strategies

原文始发于微信公众号(Ots安全):野外 Windows LPE 0-day:洞察与检测策略

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年7月3日08:16:15
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   野外 Windows LPE 0-day:洞察与检测策略https://cn-sec.com/archives/2846197.html

发表评论

匿名网友 填写信息