Bitlocker密钥提取之SYSTEM劫持
该漏洞编号CVE-2024-20666,本文实现复现过程,Windows系统版本如下
简介
从Windows10(th1)开始,微软在winload模块中,增加了systemdatadevice字段值的获取,该字段值存储在BCD引导配置文件中。当winload加载SYSTEM注册表文件时,会先尝试从BCD文件中获取systemdatadevice配置项的值,如果存在该项,则从systemdatadevice配置的设备分区中加载SYSTEM注册表文件。使用IDA分析winload.efi模块的相关函数如下
如上图所示,在函数OslpLoadSystemHive中,通过BlGetBootOptionDevice函数获取0x21000150类型值,即systemdatadevice的值,如果获取成功,则从该设备中访问SYSTEM注册表文件,不再从系统所在位置获取SYSTEM注册表文件。
可以通过该网站查询0x21000150类型对应的BCD中字段名信息。
相同的功能适用于WinRE环境中,由此,可以在WinPE下修改系统的引导配置文件BCD,在Recovery项目中增加systemdatadevice字段选项。这样在重启进入Recovery环境时,通过启动一个cmd窗口,即可提取到BitLocker加密磁盘的恢复密钥。
实现步骤
提取SYSTEM注册表文件
首先启动目标电脑到WinPE中,通过Winhex或者其它工具提取目标磁盘中的Recovery分区中的Winre.wim文件。
接下来通过7z工具打开winre.wim文件,提取\Windows\System32\config\SYSTEM注册表文件到U盘。通过regedit系统自带的注册表工具从U盘加载提取到的SYSTEM文件,加载在HKEY_LOCAL_MACHINE项下,然后修改HKEY_LOCAL_MACHINE\【加载SYSTEM自定义名】\SYSTEM\Setup中CmdLine的值,将其修改为cmd.exe,实现启动Recovery时,直接弹出cmd命令行窗口。
修改完成后,卸载该SYSTEM注册表,将其保存在U盘备用。
修改BCD配置
按住Shift键,同时点击目标系统登录窗口右下角重启按钮,随后系统重启到恢复模式,如下图所示
选择“疑难解答”、“高级选项”、“命令行提示符”,提示输入BitLocker恢复密钥时,选择“跳过”,随后将弹出一个cmd命令行窗口。
在命令行窗口中,修改目标系统的BCD配置。
首先挂载EFI分区
mountvol s: /s
枚举BCD中所有的项的配置信息
bcdedit /enum all /raw
在输出结果中找到description的值为Windows Recovery Environment 一项,如下所示
在该项中增加systemdatadevice子项,设置其指向EFI分析所在的分区,即刚才挂载到S:\盘的分区。
bcdedit /set {current} systemdatadevice hd_partition=s:
修改后的内容如下
bcdedit /enum all /raw
接下来,在S:\盘中创建目录S:\Windows\System32\config,拷贝U盘中SYSTEM注册表文件到该目录下,完整路径:S:\Windows\System32\config\SYSTEM
重启目标系统到登录窗口,再次按Shift + 重启按钮,系统重启后进入恢复模式,但这次将直接弹出一个cmd窗口,在该cmd命令行窗口中输入
manage-bde -protectors -get c:
直接提取目标系统BitLocker加密磁盘恢复密钥,如下图所示
完!