[学习笔记]Windows Downdate 漏洞挖掘和利用学习
简述
在这篇文章中,作者通过检查 Windows Update 的结构及流程,发现了其中存在的漏洞。在 Administrator 的权限下,攻击者可以通过修改注册表键值,任意控制系统文件,对其进行替换并绕过系统检查。由于系统缺乏对降级文件的检测,在这种能力下,可以进一步实现更多越权操作。
原理
Windows Update Architecture
思路一:在上图的结构中,从 Administrator 到 Trusted Installer 有提权的可能,因此仅向 Trusted Installer 提供权限无法保证安全。
问题:提权过程会被 EDR 拦截,无法绕过检测。
Windows Update Flow
- 客户端请求服务端进行升级,并提供升级目录;
- 服务端验证升级目录完整性;
- 验证过程中,服务端会对升级目录中的文件进行处理,得到升级文件,保存在服务端控制的文件夹中
%WinDir%/WinSxs/
,客户端无法访问; - 服务端会在该目录下保存一个行动清单,
Pending.xml
,文件中包含了执行更新时要进行的操作。例如更新哪个文件,源文件和目的文件等; - 最后,系统重启,系统在重启的过程中,按照行动清单对系统进行更新。
思路二:整个流程中,可控的只有一开始的升级目录,需要检查修改该目录是否可以控制后续流程,导致升级文件降级。
🎯 Target 升级目录
升级目录由以下文件组成
- MUM 文件:Microsoft Update Metadata,元信息、组件依赖、安装顺序……
- Manifest 文件:安装相关信息,例如文件路径、注册表……
- 差异文件:基础文件 + 差异文件 → 完整的更新文件
- 目录文件:MUM 和 manifest 文件的电子签名。不是在文件中包含其电子签名,而是同时对多个文件进行签名,同时目录文件自身也进行了签名。因此无法篡改目录文件或被其签名的文件。
因此,差异文件并没有任何签名……但是,它的哈希信息保存在了 manifest 文件中
🎯 Target 行动清单
行动清单是保存在 Trusted Installer 控制的目录下的,很难想到要考虑这个文件,但是作者考虑到更新过程经历了多次重启,因此行动清单的缓存一定保存在某个位置上。
我下意识觉得会直接读取目录下的文件内容,但是更合理的是类似于数据从硬盘读到内存,更新过程中会保存一份清单的实时信息
怎么找到这个位置?作者选择去搜索注册表!!!!我就想不到
在注册表中搜索 pending.xml
可以定位到相关键值:
这个键值可能在系统需要更新重启的时候才有
poqexec.exe
全名叫做 基元操作队列执行程序,网上找不到太多信息,但是从命令行看也知道这个程序可以解析 pending.xml
文件。
作者提到他检查了这个键的安全属性,我不知道怎么检查……或者说我没有意识到注册表有权限这个东西。
注册表权限可以通过 编辑→权限 检查:
这个键值并没有限制仅由 Trusted Installer 控制,因此可以通过修改该键值控制更新时行为。
可以自己写一个 pending.xml
文件,然后将注册表中的路径修改为自己写的 pending.xml
文件的路径。
pending.xml
文件中的 <POQ postAction=”reboot”>
字段控制了重启时的行为,可以修改 HardlinkFile
中的 source
,这样重启时它就会替换 destination
指向的文件。
这里我有点儿疑问,问什么不能修改 MoveFile
的 source
和 destination
,根据字段中的数值猜测,不同行为都是更新过程中的一环,MoveFile
是在对升级目录中的文件进行移动,之后会基于这个移动进一步对文件进行修改,最后通过 HardLinkFile
将更新文件放入系统目录中。因此如果修改 MoveFile
,相当于修改了中间环节,会导致后续环节出错,而如果修改 HardLinkFile
,相当于修改了更新的最后一步,不会造成其他影响。
文章中还提到一个键值 HKLM\COMPONENTS\PendingXmlIdentifier
这个键值我没找到,不知道出现的条件是什么,根据文章所述,这个键值用于和 pending.xml
中的 identifier
****进行比较,以保证文件的完整性。
因此想要进行可控更新,只需要:
- 设置 Trusted Installer 服务为自启动;
- 在注册表中添加
PoqexecCmdline
键并设置pending.xml
文件路径; - 在注册表中添加
PendingXmlIdentifier
键并设置对应Identifier
数值。
行动清单文件是在更新最后,重启之前才生成的,因此生成该文件的时候所有完整性检查已经完成了,因此这个时候修改注册表中的 pending.xml
文件路径并不会影响更新过程。
除此之外,通过 pending.xml
中的设置,可以对 poqexec.exe
、SFC.EXE
文件进行替换,这几个文件和更新相关,且都没有数字签名,可以进行篡改。修改 poqexec.exe
使其在更新文件时实际并不进行任何更新,这样被降级的文件也不会进行更新;SFC.exe
文件用于系统完整性检查和修复,修改该文件使系统不在进行相关行为。
到此为止,我们可以控制系统上的任何文件,将其替换成内容可控的文件。
可实现功能
可能是没有想到有这样的攻击方式,Windows 中的很多功能都没有检测降级文件的功能,在拥有可以替换任何系统文件的能力之后,可以实现很多越权功能。
Windows Virtualizaition-based security, VBS
Windows 的 VBS 功能利用现代 CPU 中的虚拟化技术,在操作系统中创建一个隔离的安全环境。这个环境将操作系统和关键系统组件与潜在的恶意软件隔离开来,从而提供额外的安全层。
VBS 功能包括 Credential Guard,HVCI,System Guard Secure Launch,Shielded VMs 等。
- Credential Guard 是 Windows 10 及更高版本(如 Windows 11)中提供的一项安全功能,它利用基于虚拟化的安全(VBS)技术来隔离和保护敏感的凭据信息,如 NTLM 密码哈希、Kerberos票证授予票证(TGT)等。Credential Guard 通过创建一个隔离的虚拟环境来存储和保护凭据,确保只有特权系统软件才能访问这些敏感信息。这种隔离机制有助于防止非法的凭据窃取,从而保护系统免受凭据被盗攻击,如传递哈希和传递票证等;
- HVCI,即 Hypervisor-Enforced Code Intergrity,也被称为内存完整性。HVCI 利用虚拟化技术,在操作系统和硬件之间创建了一个隔离层,即虚拟机监控程序(Hypervisor),来监控和保护代码执行过程中的完整性。通过HVCI,Windows能够确保只有经过验证和签名的代码才能在系统的关键部分(如内核模式)执行。这有助于防止恶意软件通过篡改内存或使用未经验证的驱动程序来攻击系统;
- System Guard Secure Launch是Windows 10及更高版本中引入的一个安全启动过程,它利用最新的硬件安全功能和虚拟化技术来确保系统从启动到运行的整个过程都保持安全。System Guard Secure Launch会在系统启动时验证系统固件、驱动程序和操作系统的完整性,确保它们未被篡改;
- Shielded VMs(屏蔽虚拟机)是一种增强的虚拟机安全解决方案,旨在提供更高的安全性,以保护虚拟机免受包括 guest 系统固件、恶意guest-VM 内核或用户模式漏洞的 guest 操作系统,以及恶意客户内部人员篡改 guest-VM 映像等攻击媒介的侵扰。
VBS 结构
VBS 将系统分成了不同的 Virtual Trust Levels(VTLs),VTL 等级越高,权限越大,低等级 VTL 无法访问高等级 VTL,目前 Windows 中存在两层 VTL。
UEFI lock
为了保护 VBS 功能不会被轻易关闭,VBS 实现了一个叫做 UEFI lock 的功能。如果想要关闭 VBS,用户需要启动一个微软签名的 EFI 应用,该应用会在计算机启动的时候询问用户关闭 VBS 功能。由于 Secure Boot 功能,只有经过签名的代码能够在计算机启动的时候执行,因此如果无法物理接触计算机,就无法关闭 VBS 功能。
绕过 UEFI lock
作者发现,如果使用上述攻击方式替换 Secure Kernel 或者 hypervisor powering VBS 相关文件,计算机仍旧会正常启动,并且放弃 VBS 功能。
作者替换了:
- MsMpEng.exe:Antimalware Service Executable
- securekernel.exe:NT Secure Kernel
- ntoskrnl.exe:NT Kernel & System
- ntfs.sys:NT 文件系统驱动程序
- fltMgr.sys:Microsoft 文件系统筛选器管理器
- ci.dll:Code Integrity Module
通过以上文件替换,可以绕过 Windows 的 PPL(Protected Process Light)、Crendential Guard、Windows Defender 功能,并绕过 UEFI Lock,实现凭据窃取。
绕过 VBS 安全边界
上面介绍 VBS 结构的时候提到 VBS 会将系统分成不同的 VTL,通过将相关系统文件降级,可以利用历史漏洞绕过 VTL 边界。
降级之前:
降级:
降级之后: