
Взлом шифрования BitLocker на основе уязвимости CVE-2023-21563
Воспроизведение на виртуальной машине. На локальной машине (атакующем) используется 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 нужно включить редактирование XML через "Edit -> Preferences -> General -> Enable XML editing", чтобы можно было напрямую редактировать XML-конфигурацию виртуальной машины.
При создании виртуальной машины выберите "Local install media (ISO image or CDROM)" и укажите ранее загруженный ISO-образ Windows 11. Выделите подходящие ресурсы (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", и вы вернётесь к исходному экрану, где можно нажать любую клавишу для загрузки.

Далее установите систему: отметьте отсутствие ключа продукта и ставьте Pro-версию. Дальше идут регистрация учётной записи и прочая возня — рекомендую сразу использовать офлайн-запуск, чтобы избежать лишних проблем. Если такой опции нет, откройте командную строку через 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 напрямую общалась с virtio-сетевой картой через встроенный протокол PXE, избегая лишних помех в процессе загрузки и гарантируя, что мы благополучно попадём в систему для дальнейшей настройки и тестирования.
Зайдите в виртуальную машину, установите драйверы virtio с CD-привода — всё настроится автоматически; можно быстро проверить работу сети. Затем включите шифрование 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
Следующими командами запустите TFTP-сервер для процесса загрузки PXE и SMB-сервер для передачи скрипта с изменённым BCD-файлом; подставьте то, что мы только что выяснили, у меня это 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>