本文介绍了如何绕过 Windows 11(24H2 版本)的 BitLocker 加密。
通过使用名为 Memory-Dump-UEFI 的工具从内存中提取完整卷加密密钥 (FVEK) 来实现。
**背景**
如果攻击者能够物理访问设备,他们可以通过突然重启计算机并转储最近运行的 Windows 实例的 RAM 来获取访问权限。捕获的内存可以进行分析,以查找敏感信息,例如 FVEK 密钥。
这种技术并非万无一失,因为当电源切断时,RAM 的内容会迅速降级。
有几种技术可以减轻这种内存降级问题,包括物理冷却 RAM 或使用外部电源来维持电源供应。在本演示中,我将设备主板上的复位引脚短路,这会导致系统突然重启,而不会丢失电源。
另一个潜在问题是安全启动,这是一种安全标准,限制了设备启动时允许运行的内容。此保护措施本身也存在局限性,并且可以通过垫片或其他各种方法绕过,这些方法不在本演示的范围内。
**步骤 1:创建可启动 USB 设备**
在此步骤中,您必须获取一个 USB 存储设备,其大小大于目标系统上的 RAM 容量。我已包含一个名为 flashimage.sh 的脚本,以简化此步骤。
请按照此处详细说明的步骤创建和使用可启动应用程序。
**步骤 2:突然重启目标系统**
这可以通过多种方式完成,但目标是最大程度地减少计算机完全关闭的时间。根据我的经验,我发现,至少在查找 FVEK 密钥的情况下,在 Windows 加载但登录屏幕出现之前重启系统最有效。
**步骤 3:从 USB 设备启动**
立即从 USB 设备启动 Memory-Dump-UEFI。您将进入 UEFI shell,您可以在其中找到并执行 app.efi。有关如何执行此操作的更多详细信息,请参阅应用程序的 README。所需时间取决于要转储的 RAM 量和 USB 设备的速度。我建议在此步骤中拔掉任何其他 USB 存储设备,以避免程序意外写入错误的驱动器。
当您进入 shell 时,它应该如下所示。内存转储将开始生成转储文件,直到内存用完为止。完成后,您可以像往常一样关闭计算机。
**步骤 4:分析转储**
**设置**
应用程序可能会生成多个转储。这是因为 FAT32 文件系统对文件大小施加了 4GB 的限制。文件系统必须是 FAT32 以满足 UEFI 规范。为了方便起见,我在 tools 目录中包含了一个名为 concatDumps.py 的脚本,它可以按时间顺序将多个转储合并为一个。转储的内容将包含当时内存中的任何原始数据,因此我建议使用像 xxd 这样的工具来更轻松地读取它。为了帮助搜索转储,我包含了一个名为 searchMem.py 的脚本,它允许您在转储中搜索十六进制模式。它将找到该十六进制模式实例的偏移量,然后您可以使用 xxd -s <偏移量> <转储> 跳转到该偏移量。
**池标签**
池标签是 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
**联系方式**
如果您有任何问题,可以通过以下电子邮件与我联系,感谢您的阅读!