利用UEFI内存Dump绕过BitLocker加密,支持Windows11(24H2)

admin 2025年1月2日09:41:00评论109 views字数 2814阅读9分22秒阅读模式
摘要

在上一篇文章解密还原被BitLocker加密的数据 中,主要介绍了利用外部硬件设备进行信号截取的方式获取数据, 而本文的实现方式更为方便,只需要一个USB设备就能完成, 实现方法是利用一个名为Memory-Dump-UEFI的工具从内存中提取完整卷加密密钥(FVEK)。

技术背景

如果攻击者可以物理访问设备,则有可能通过突然重启计算机并转储最近运行的 Windows 实例的内存来获取访问权限。捕获的内存可以用来分析定位敏感信息,比如 FVEK 密钥。不过,这种技术并不完全可靠,因为断电后内存内容会迅速退化。如下图:

利用UEFI内存Dump绕过BitLocker加密,支持Windows11(24H2)

有几种技术可以减缓这种内存退化,包括物理冷却内存或使用外部电源保持供电。在本次实现中,主要通过短接设备主板上的复位引脚,使系统在不丢失电源的情况下突然重启。

另一个潜在问题是安全启动(Secure Boot)。这是一个限制设备启动时运行内容的安全标准。此保护也有其局限性,并已经被通过shims或其他多种方式绕过。

实现步骤

第一步: 创建可启动的USB设备

此步骤需要获取一个容量大于目标系统内存的 USB 存储设备。可以直接从这里下载名为flashimage.sh的脚本来简化步骤: https://github.com/NoInitRD/Memory-Dump-UEFI

第二步: 突然重启目标系统

可以通过多种方式实现这一点,目标是最大限度地减少计算机完全断电的时间。在本文经验中,最成功的方法是在 Windows 加载时但登录界面出现之前重启系统,至少在查找 FVEK 密钥的情况下是如此。

第三步: 从USB设备启动

立即从 USB 设备启动到 Memory-Dump-UEFI,将进入 UEFI shell,在这里可以找到并执行 app.efi。有关更多详细信息,请参阅应用程序的 README 文件。所需时间取决于转储的内存量和 USB 设备的速度。建议在此步骤中断开任何其他 USB 存储设备,以避免程序意外写入错误的驱动器。

以下是进入 shell 后的示例。内存转储将开始生成转储文件,直到内存耗尽。完成后,可以像正常一样关闭计算机。

利用UEFI内存Dump绕过BitLocker加密,支持Windows11(24H2)

第四步: 分析dump文件
设置

应用程序可能会生成多个转储文件。这是由于 FAT32 文件系统对文件大小的 4GB 限制。为了满足 UEFI 规范,文件系统必须是 FAT32。工具目录中包含了一个程序 concatDumps,可以按时间顺序将多个转储文件合并为一个。

转储的内容将包括当时内存中的原始数据,因此建议使用类似 xxd 的工具来更容易地阅读它。为了帮助搜索转储,我还包括了一个程序 searchMem,可以在转储中搜索十六进制模式。它会找到该十六进制模式出现的偏移量,你可以使用 xxd -s <offset> <dump> 跳转到该位置。

利用UEFI内存Dump绕过BitLocker加密,支持Windows11(24H2)

内存池标签

内存池标签是 4 个字符长的标识符,用于指示 Windows 内核内存池的位置。这些内存池由 Windows 内核分配,是查找敏感信息的理想场所。有大量此类内存池标签,我包括了一个名为 pooltag.txt 的文本文件,其中列出了这些标签及其用途的详细信息。

在继续之前,这里要感谢下微软,因为他们非常“贴心”地在内存中明确标记了加密密钥的位置。在 Windows 7 中,密钥恢复就像定位 FVEc 内存池标签一样简单,它对应于 fvevol.sys 下的加密分配。在 Windows 8.1 和 10 中,可以在由 Cngb 内存池标签标记的内存池中找到密钥,它对应于 ksecdd.sys 模块。在对 Windows 11 内存转储的研究中,我未能在这些地方找到密钥,但在其他两个位置找到了它。

FVEK密钥恢复

找到 FVEK 密钥的第一个位置是在 dFVE内存池标签下,该标签表示由 dumpfve.sys 分配的内存,与 BitLocker 驱动器加密的完整卷加密崩溃转储过滤器相关联。内存池标签用蓝色下划线标记,而 FVEK 密钥用红色高亮显示。这是我找到密钥的最简单、最一致的位置,并且它以 0x0480 为前缀,表示所使用的加密类型,在本案例中是 XTS-AES-128。

利用UEFI内存Dump绕过BitLocker加密,支持Windows11(24H2)

第二个位置是在 None 标签下,该标签与对 ExAllocatePool 例程的调用有关。这次密钥的前半部分出现了两次,后半部分出现了一次。

利用UEFI内存Dump绕过BitLocker加密,支持Windows11(24H2)

需要注意的是,任何获得的密钥都需要以使用的算法为前缀。例如,如果你的密钥是:

b2cbc06071931b7cc50b59f8789571f4dd815c2008e93c02d5c6cd98c83ef54b

你需要在密钥开头添加 0x8004(或所使用的算法)的小端格式前缀,如下所示:

0480b2cbc06071931b7cc50b59f8789571f4dd815c2008e93c02d5c6cd98c83ef54b

接下来,需要将该十六进制字符串转储到一个文件中,可以通过以下方式完成:

echo "0480b2cbc06071931b7cc50b59f8789571f4dd815c2008e93c02d5c6cd98c83ef54b" | xxd -r -p > output.fvek

强烈建议使用 dislocker 工具套件来确定所需的算法/值,并最终解锁驱动器。如果操作正确,你可以使用 output.fvek 解锁 BitLocker 保护的分区并访问卷上的任何数据。

总结

要了解 Microsoft 如何实现 BitLocker,最好的方法是使用 windbg 进行内核级调试。这可以通过虚拟机或跨接的 USB 3.0 A/A 数据线轻松完成。本文之所以能够找到密钥,是通过逐步研究 Windows 启动过程并观察 BitLocker 的运行方式实现的。尽管 微软 尝试使用类似 SymCryptSessionDestroy 的函数销毁密钥,但仍未能销毁所有密钥,这可以通过其在堆上的存在得到验证。

相关文献

https://tribalchicken.net/recovering-bitlocker-keys-on-windows-8-1-and-10/

https://github.com/libyal/libbde/blob/main/documentation/BitLocker%20Drive%20Encryption%20(BDE)%20format.asciidoc

https://github.com/Aorimn/dislocker

https://github.com/microsoft/SymCrypt

https://github.com/libyal/libbde

https://github.com/zodiacon/PoolMonX/blob/master/res/pooltag.txt

https://techcommunity.microsoft.com/blog/askperf/an-introduction-to-pool-tags/372983

 

原文始发于微信公众号(二进制空间安全):利用UEFI内存Dump绕过BitLocker加密,支持Windows11(24H2)

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年1月2日09:41:00
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   利用UEFI内存Dump绕过BitLocker加密,支持Windows11(24H2)https://cn-sec.com/archives/3582777.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息