转储内存以绕过 Windows 11 上的 BitLocker

科技   2025-01-07 18:08   广东  

简介

在本文中,我将演示如何绕过 Windows 11(版本 24H2)上的 BitLocker 加密。这是通过使用我的工具 Memory-Dump-UEFI 从内存中提取全卷加密密钥 (FVEK) 来实现的。

背景

如果攻击者可以物理访问该设备,他们可以通过突然重启计算机并转储最近运行的 Windows 实例的 RAM 来获得访问权限。可以分析捕获的内存以查找敏感信息,例如 FVEK 密钥。这种技术并非万无一失,因为断电后 RAM 的内容会迅速降级。

有几种技术可以缓解这种内存性能下降,包括物理冷却 RAM 或使用外部电源来维持电力输送。在这个演示中,我短路了设备主板上的复位引脚,这会导致系统突然重启而不会断电。
另一个潜在问题是安全启动,这是一种安全标准,用于限制设备启动时允许运行的内容。这种保护有其自身的局限性,并且已经使用垫片或超出本演示范围的各种其他手段绕过。
步骤 1:创建可启动 USB 设备
对于此步骤,您必须获得一个比目标系统上的 RAM 更大的 USB 存储设备。我已包含一个名为的脚本flashimage.sh来简化此步骤。
按照此处详述的步骤创建和使用可启动应用程序。https://github.com/NoInitRD/MemoryDumpUEFI
第 2 步:突然重启目标系统
可以通过多种方式实现这一点,但目标是尽量减少计算机完全关闭的时间。根据我的经验,在 Windows 加载但登录屏幕出现之前重新启动系统最有效,至少在找到 FVEK 键的情况下。
步骤 3:从 USB 设备启动
立即从 USB 设备启动到 Memory-Dump-UEFI。您将进入 UEFI shell,您可以在其中找到并执行app.efi。有关如何执行此操作的更多详细信息,请参阅应用程序的README 。所需时间取决于转储的 RAM 数量和 USB 设备的速度。我建议在此步骤中拔下任何其他 USB 存储设备,以避免程序意外写入错误的驱动器。

以上是进入 shell 后应该是什么样子的示例。内存转储将开始生成转储文件,直到内存耗尽。完成后,您可以像平常一样关闭计算机。

步骤 4:分析转储

设置

应用程序可能会生成多个转储。这是因为 FAT32 文件系统对文件大小施加了 4GB 的限制。文件系统必须是符合 UEFI 规范的 FAT32。为了方便起见,我在工具目录中包含了一个名为的程序,concatDumps 它可以按时间顺序将多个转储合并为一个。转储的内容将包括当时内存中的任何原始数据,因此我建议使用像这样的工具xxd来更轻松地读取它。为了帮助搜索转储,我包含了一个名为的程序searchMem,它允许您在转储中搜索十六进制模式。它将找到该十六进制模式实例的偏移量,然后您可以使用跳转到该偏移量xxd -s <offset> <dump>。

Pool 标签是 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。

第二个位置位于None标签下,与例程调用有关ExAllocatePool。这次可以看到密钥的前半部分出现了两次,后半部分出现了一次。

下一步

需要注意的是,无论你获得什么密钥,都需要在前面说明所使用的算法。这意味着如果你的密钥是:

b2cbc06071931b7cc50b59f8789571f4dd815c2008e93c02d5c6cd98c83ef54b

您需要将0x8004(或使用的任何算法)以小端格式添加到密钥的开头,如下所示:

0480b2cbc06071931b7cc50b59f8789571f4dd815c2008e93c02d5c6cd98c83ef54b

接下来,您需要获取该十六进制并将其转储到文件中,可以像这样完成:

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

我强烈建议使用这套dislocker工具来确定您需要哪种算法/值,并最终解锁驱动器。如果您正确完成了所有操作,则可以使用它output.fvek来解锁受 Bitlocker 保护的分区并访问卷上的任何数据。

最后说明

了解 Microsoft 如何实现 bitlocker 的最佳方法是使用 进行内核级调试 windbg。使用虚拟机或交叉 USB 3.0 A/A 电缆可以轻松完成此操作。我之所以能够找到密钥,首先是因为我逐步完成 Windows 启动过程并观察 bitlocker 的运行情况。Microsoft 尝试使用类似函数来销毁密钥,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


感谢您抽出

.

.

来阅读本文

点它,分享点赞在看都在这里


Ots安全
持续发展共享方向:威胁情报、漏洞情报、恶意分析、渗透技术(工具)等,不会回复任何私信,感谢关注。
 最新文章