翻译自:https://blog.appsecco.com/breaking-full-disk-encryption-from-a-memory-dump-5a868c4fc81e

一台运行全盘加密保护的虚拟机,如何才能使宿主机的root用户获取到其数据的访问权限?这是我们在Appsecco内部讨论时提出的一个问题,同时我们也想知道答案是什么。

我见过许多破解全盘加密保护的办法,最简单的一种是对正在运行的虚拟机进行内存转储,并从中提取解密密钥。我们采取的步骤如下:

  1. 安装一个带全盘加密保护的Ubuntu 16.04虚拟机
  2. 在磁盘解锁的时候转储Virtualbox虚拟机的内存
  3. 使用findaes从转储的内存中提取出主密钥
  4. 使用密钥从虚拟机的磁盘文件中解密加密分区
  5. 挂载分区并访问数据

安装

我们在Virtualbox里安装一个带全盘加密保护的Ubuntu 16.04桌面版来进行试验。

在安装时,使用默认的 "Full disk encryption with LVM" 选项,其使用 dm-crypt/LUKS方式进行加密。cryptsetup默认的配置是aes-xts-plain64:sha256,使用长度为512位的密钥。

当安装完成后,我们启动虚拟机,并输入我们之前配置过的密码。

转储虚拟机的内存

我们首先在磁盘处于解锁状态时获得虚拟机的内存转储。虚拟机必须处于运行或者暂停状态,这样我们才能将内存转储到文件中去。

VirtualBox提供了一个功能丰富的调试器,其中有一个功能就是可以转储虚拟机的内存。

VBoxManage debugvm <vm-name> dumpvmcore --filename=<filename.raw>

这会给我们提供一个原始格式的内存转储文件。转储可能会花上一段时间才能完成。

从内存转储中提取密钥

我们可以使用任何能够从文件中识别出AES字符串的工具。因此,我们选用了findaes

我们可以在这下载到findaes
下载得到的是一个压缩文件,里面是findaes的源码,我们必须先编译才能使用。

解压zip压缩包

unzip findaes-1.2.zip

编译

cd findaes-1.2 ; make

运行findaes破解我们的内存转储文件,看看能不能提取出密钥来。

./findaes /path/to/fdedump2.raw

<center>findaes 的输出</center>

可以看到,从内存转储中识别出了很多密钥。AES算法使用主密钥来产生轮密钥,这些密钥都存储在内存中。即使主密钥因为某些原因不能使用,我们依然能够使用轮密钥计算出主密钥。所以现在我们看到的是主密钥、轮密钥和任何其他能被findaes识别出来的AES密钥。可以参考cryptsetup的文档,以了解有关如何实现全盘加密的更多信息。

我们可以编写一个脚本,尝试使用所有密钥来解密分区。但是,我们知道我们需要的是512位的密钥,而提取出来的密钥都是256位的,所以我们就可以将搜索范围缩小到内存中连续的两个256位密钥。

我们找到了满足要求的两个密钥。把0x34dfcf88和0x34dfcd98组合起来就可以得到主密钥,因为Intel x86-64架构使用的是小端序,所以我们需要以相反的顺序来组合密钥。

<center>识别主密钥</center>

现在我们得到一个可能的主密钥,可以用来尝试解密加密分区。

使用主密钥解密使用LUKS加密过的驱动器

我们使用dmsetup来恢复主密钥,并尝试使用主密钥来解密加密分区。

为了解密分区,首先需要把磁盘挂载上。为此,我们首先复制一份虚拟机的的磁盘,并把它附加到一个新的虚拟机上,在新的虚拟机上运行Ubuntu live环境以挂载并解密分区。完成后,我们使用Ubuntu Live环境启动到新虚拟机。

要手动使用主密钥来解密加密分区的话,我们需要知道分区的大小和使用的加密方案。从cryptsetup FAQ可以知道,dmcrypt 使用的默认加密方案是aes-xts-plain64:sha256。

我们需要找到磁盘从我们的live环境中列出其分区。可以使用fdisk命令。

sudo fdisk -l

<center>加密磁盘中的分区</center>

使用blockdev命令查看加密分区 /dev/sda5的大小。

sudo blockdev --getsz /dev/sda5

解锁并解密分区的命令如下:

echo "0 <size> crypt aes-xts-plain64 <key> 0 </dev/drive> 4096" | sudo dmsetup create luks-volume

如果没有错误信息,那解密就成功了。

访问数据

使用lsblk命令来查看这个解密后可用的LVM分卷。

sudo lsblk


我们可以看到LVM卷是解密分区中的根分区。让我们把它挂载上,看看会发生什么有趣的事情。

```bash
sudo mount /dev/mapper/ubuntu--vg-root /mnt

列出root用户的主文件夹的内容

ls / mnt / root

<center>我们能够在解密后读取到敏感文件</center>

我们成功地做到了从内存转储中提取出加密密钥,并从一个经过全盘加密保护的磁盘中读取文件。

源链接

Hacking more

...