转载

在win 8.1和win 10上恢复bitlocker驱动器加密私钥

在win 8.1和win 10上恢复bitlocker驱动器加密私钥

本文并不打算深入研究磁盘加密的内部运行机制,而注重的是从内存中检索 FVEK(完整的卷加密密钥)。在Windows 7中密钥恢复是一件想当简单的事情(详情参阅文尾的进一步阅读),当在处理一个Windows 7的内存镜像时,我们可以粗暴的在存在FVEK的内存中将FVEc池标签作为一个指标进行搜索,从那里我们能够继续提取到密钥。

然而从Windows 8开始,BitLocker的加密操作似乎就外包给了微软的CNG(Cryptography Next Generation)模块,这是长期替换CryptoAPI的节奏啊,而不是在fvevol驱动内部执行。

这也就意味着在Windows 8及以上版本下搜索FVEc池标签是不会产生任何效果的!

AESKeyFind仍然能够正常工作,当然尽管取决于你的内存镜像,但你还是需要调整阀值设置。

实时内核调试恢复密钥

我不敢肯定你一定会发现附带一个调试器的内核,但依旧不能禁用BitLocker,检索recovery密码,或者添加你自己的密码保护装置,此时会出现一些陌生的东西。另一方面,假设你因为其他原因想要获得FVEK——比如更换持久性访问密钥保护装置(相对于内核调试,这么做更方便我们些)

然而我使用windbg来研究BitLocker 在Windows 8 / 10上的变化,用这个方法来检索FVEK,同时也能证明CNG的存在。

现在开始,这是一个在Windows 7中调用栈的例子——加密/解密函数都在fvevol中进行处理。这个例子使用默认加密方法(AES 128-bit)

在win 8.1和win 10上恢复bitlocker驱动器加密私钥

另一方面,在Windows 8.1例子中CNG开始介入加密/解密函数:

在win 8.1和win 10上恢复bitlocker驱动器加密私钥

事实上此时此刻,我们就可以检索FVEK,从第二个参数传递给SymCryptEcbDecrypt(它包含一个指向内存中密钥位置的指针)。rdx注册表(64-bit机器)包含一个指针指向内存中FVEK位置的指针,所以通过在cng!SymCryptEcbDecrypt设置一个断点,之后获得rdx的值,我们就可以提取FVEK了(注意,这是一个256位的密钥)

在win 8.1和win 10上恢复bitlocker驱动器加密私钥

这是一个Windows 8.1例子,当在XTS-AES模式下玩耍Windows 10,跳转到cng!SymCryptXtsAesDecrypt,并检测rcx注册表(在我的测试中密钥作为第一个参数传递给XTS函数)

在win 8.1和win 10上恢复bitlocker驱动器加密私钥

内存镜像向后偏移一些,我们可以看到这部分内存被标记为Cngb池标签。正如预期,检测池标签定义证实了Cngb用于CNG配置:

Cngb – ksecdd.sys – CNG kmode crypto pool tag

下面进入更实用的阶段!

使用内存池分配恢复密钥

正如前面提到的,大多数加密工作都是围绕着CNG驱动开展的。然而在早期的Windows版本,fvevol驱动包含了它自己的安装启用。搜索Cngb池标签会产生大量结果,因为CNG就是一洪荒野兽,太复杂了。它不仅仅作用于BitLocker,然而池大小想当一致,这也意味着我们可以将他们看作是密钥位置指示器来使用。

Cngb的池大小似乎一直是在672,不论加密的类型——Volatility的poolpeek插件可以帮助你找到这些池 在win 8.1和win 10上恢复bitlocker驱动器加密私钥

虽然我尚未确定一种方法从Cngb池内容中区分BitLocker模式。这里有一个标志似乎能可靠的分辨,池中偏移位置为0×68,密钥的长度不是128-bit就是256-bi。值’10’似乎表示密钥长度为128-bit,’20’表示密钥长度为256-bit

有趣的是,除了FVEK其他的密钥都是相同的格式,这只在系统开启了Bitlocker才有效。这可能是另一个密钥在使用Bitlocker,诸如Volume Master Key (VMK),然而我没能分析出这些密钥的功能。

Volatility插件

该插件目前还属于实验性的测试版本

根据手头的信息,我已经打开了一款能够从Windows 7(理论上还支持Windwos及其以上版本)中提取BitLocker密钥的Volatility插件。对于Windows 8到Windows 10来说这个插件并不是完全可靠的,大多数情况下会存在些许小状况:

  • 除了FVEK,返回AES Keys(见前文,这些密钥只存在于受Bitlocker保护的系统)
  • 对于Windows 10 XTS-AES加密并不是每次都能成功
  • 不能确定Windows 7以上版本中BitLocker操作方式

插件操作如下:

1.从概要文件元数据中获得Windows版本

2.如果版本低于Windows 8

  • 搜索FVEc池标签
  • 分析BitLocker模式
  • 适当长度提取FVEK

3.如果版本高于Windows 8

  • 在池大小672搜索 Cngb池标签
  • 尝试分析密钥长度(在Winodws 10 XTS-AES模式下不能正常工作)
  • 提取128-bit或者256-bit密钥
  • 不能保证它是BitLocker FVEK.

4.打印结果

Windows 7例子:

在win 8.1和win 10上恢复bitlocker驱动器加密私钥

Windows 8.1例子:

在win 8.1和win 10上恢复bitlocker驱动器加密私钥

Windows 10 (CBC)例子:

在win 8.1和win 10上恢复bitlocker驱动器加密私钥

这张截图是上面Windows 8.1保护卷使用的FVEK数据:

在win 8.1和win 10上恢复bitlocker驱动器加密私钥

优秀的 libbde library 可以在Linux下使用FVEK和TWEAK数据用来加载保护卷。

我没有说过该插件就是完美的,但是它是有可能在未来成为一款十分优秀的插件!

GitHub here: https://github.com/tribalchicken/volatility-bitlocker

引用文献

  • Practical Cryptographic Key Recovery – Jesse Kornblum
  • Implementing Bitlocker Drive Encryption for Forensic Analysis – Jesse Kornblum
  • libyal / libbde 
  • Cryptography API: Next Generation – Microsoft

*原文链接: tribalchicken ,鸢尾编译,转载请注明来自FreeBuf黑客与极客(FreeBuf.COM)

原文  http://www.freebuf.com/articles/system/99206.html
正文到此结束
Loading...