Обходим BitLocker и вытягиваем из памяти ключи в Windows 11

Добро пожаловать на наш форум!

Спасибо за посещение нашего сообщества. Пожалуйста, зарегистрируйтесь или войдите, чтобы получить доступ ко всем функциям.


Gibby

Автор
Команда проекта

Регистрация
Сообщений
1,635
Репутация
45
Сделок
В этой статье я покажу, как можно обойти шифрование BitLocker в Windows 11 (версия 24H2) и извлечь из памяти ключи шифрования тома (full volume encryption key, FVEK) при помощи моего инструмента Memory-Dump-UEFI.


Краткая справка

Если у нападающего есть физический доступ к устройству, то он потенциально может получить доступ, резко перезапустив компьютер и выполнив дамп ОЗУ из недавно выполнявшихся экземпляров Windows. Дамп памяти можно проанализировать, чтобы найти конфиденциальную информацию, например, ключи FVEK. Эта методика не работает гарантированно, потому что после отключения питания содержимое ОЗУ быстро деградирует.

0.jpeg

Существует множество методик замедления этой деградации памяти, например, физическое охлаждение ОЗУ или использование внешних источников питания с целью поддержания подачи энергии. Для своего демо я закоротил контакты сброса на материнской плате устройства, что заставляет систему резко отключаться без потери питания.

Ещё одна потенциальная проблема заключается в secure boot — стандарте безопасности, который ограничивает то, что может выполняться при запуске системы. Эта защита имеет собственные ограничения, и ещё уже обходили при помощи shim и множества других способов, которые для нашего демо несущественны.


Этап 1: создаём загрузочное USB-устройство

Для этого этапа нам понадобится USB-накопитель, размер которого больше, чем объём ОЗУ целевой системы. Для упрощения этого этапа я написал скрипт flashimage.sh.
Воспользуйтесь инструкциями по созданию и применению загружаемого приложения.


Этап 2: резкий перезапуск целевой системы

Этот этап можно реализовать множеством разных способов; наша основная цель — минимизировать временной промежуток, в течение которого питание компьютера полностью отключено. По моему опыту, максимального успеха можно добиться, перезагружая систему, когда Windows ещё загружается, но не достигла экрана логина; по крайней мере, это справедливо в случае поиска ключей FVEK.


Этап 3: загружаемся с USB-устройства

Незамедлительно выполняем запуск Memory-Dump-UEFI с USB-устройства. Мы окажемся в оболочке UEFI, в которой можно выполнить app.efi. Подробнее о том, как это сделать, можно прочитать в файле README приложения. Объём требуемого времени зависит от объёма ОЗУ, подвергающегося дампу, и скорости USB-устройства. Я рекомендую на этом этапе отключить все другие USB-устройства, чтобы программа случайно не выполнила запись не на тот накопитель.

1.png

На скриншоте показано, как должно выглядеть успешное попадание в оболочку. Дамп памяти начнёт генерировать файлы дампа, пока у него не закончится память. После завершения можно спокойно отключить компьютер обычным образом.


Этап 4: анализ дампов

Подготовка

Вероятно, приложение создаст множество дампов. Это вызвано ограничением в 4 ГБ на размер файла, накладываемым файловой системой FAT32. Чтобы соответствовать спецификации UEFI, необходимо использовать эту файловую систему. Для удобства я добавил в папку инструментов программу concatDumps, в хронологическом порядке соединяющую множество дампов в один. Дамп будет состоять из сырых данных, находившихся в памяти на момент его создания, поэтому для удобства чтения я рекомендую воспользоваться инструментом наподобие xxd. В помощь поиску по дампам я написал программу searchMem, позволяющую искать в дампе шестнадцатеричные паттерны. Она находит смещение вхождений таких шестнадцатеричных паттернов, к которым можно затем перейти командой xxd -s <offset> <dump>.

2.png


Pool Tag

Pool tag — это 4-символьные идентификаторы, указывающие, где находятся пулы памяти ядра Windows. Пулы распределяются ядром Windows, это отличное место для поиска конфиденциальной информации. Существует большое множество таких pool tag; я составил текстовый файл pooltag.txt, содержащий список всех pool tag и подробности об их предназначении.

Прежде чем двигаться дальше, хотелось бы выразить благодарность Microsoft за то, что она чётко отметила, где в памяти находятся криптографические ключи. В Windows 7 для восстановления ключа достаточно было найти pool tag FVEc, соответствующий криптографическим распределениям fvevol.sys. В Windows 8.1 и 10 ключ можно найти в пуле памяти, маркированном Cngb; он соответствует модулю ksecdd.sys. В процессе моего изучения дампа памяти Windows 11 я не смог найти ключ ни в одном из этих мест, но нашёл его в двух других.


Восстановление ключа FVEK

Первое местоположение ключа FVEK находилось по pool tag dFVE, обозначающему распределение памяти dumpfve.sys, относящегося к фильтру аварийного дампа шифрования тома для шифрования диска Bitlocker. Этот pool tag выделен синим, а ключ FVEK — краснымм. Это было самое простое местоположение ключа из найденных мной; кроме тому, ему предшествует паттерн 0x0480, обозначающий тип используемого шифрования (в моём случае это XTS-AES-128).

3.png

Второе место находится под pool tag None, соответствующим вызовам процедуры ExAllocatePool. На этот раз первая половина ключа встречается два раза, а вторая — один раз.

4.png


Дальнейшие шаги

Важно отметить, что полученному ключу должно предшествовать обозначение применённого алгоритма. То есть если ключ имеет вид b2cbc06071931b7cc50b59f8789571f4dd815c2008e93c02d5c6cd98c83ef54b, то вам нужно добавить в начало ключа 0x8004 (или обозначение другого алгоритма) в формате little endian:

Код:
0480b2cbc06071931b7cc50b59f8789571f4dd815c2008e93c02d5c6cd98c83ef54b

Дальше нужно сдампить это шестнадцатеричное значение в файл. Это можно сделать так:

Код:
echo "0480b2cbc06071931b7cc50b59f8789571f4dd815c2008e93c02d5c6cd98c83ef54b" | xxd -r -p > output.fvek

Я крайне рекомендую использовать набор инструментов dislocker для определения нужного алгоритма/значения и разблокировки диска. Если сделать всё правильно, то можно воспользоваться output.fvek для разблокировки защищённого Bitlocker раздела и доступа к любым данным в томе.


Выводы

Оптимальнее всего разбираться в том, как Microsoft реализовала Bitlocker, выполнив отладку на уровне ядра при помощи windbg. Это достаточно легко сделать при помощи виртуальных машин или кроссоверного кабеля USB 3.0 A/A. Нахождение ключа в первую очередь стало возможным благодаря пошаговому выполнению процесса запуска Windows и наблюдению за действиями Bitlocker. Microsoft предпринимает усилия по удалению ключей при помощи функций наподобие SymCryptSessionDestroy, но им не удаётся уничтожить все ключи, как видно из того, что они присутствуют в куче.
 
Сверху