В этой статье я покажу, как можно обойти шифрование BitLocker в Windows 11 (версия 24H2) и извлечь из памяти ключи шифрования тома (full volume encryption key, FVEK) при помощи моего инструмента Memory-Dump-UEFI.
Существует множество методик замедления этой деградации памяти, например, физическое охлаждение ОЗУ или использование внешних источников питания с целью поддержания подачи энергии. Для своего демо я закоротил контакты сброса на материнской плате устройства, что заставляет систему резко отключаться без потери питания.
Ещё одна потенциальная проблема заключается в secure boot — стандарте безопасности, который ограничивает то, что может выполняться при запуске системы. Эта защита имеет собственные ограничения, и ещё уже обходили при помощи shim и множества других способов, которые для нашего демо несущественны.
Воспользуйтесь инструкциями по созданию и применению загружаемого приложения.
На скриншоте показано, как должно выглядеть успешное попадание в оболочку. Дамп памяти начнёт генерировать файлы дампа, пока у него не закончится память. После завершения можно спокойно отключить компьютер обычным образом.
Прежде чем двигаться дальше, хотелось бы выразить благодарность Microsoft за то, что она чётко отметила, где в памяти находятся криптографические ключи. В Windows 7 для восстановления ключа достаточно было найти pool tag FVEc, соответствующий криптографическим распределениям fvevol.sys. В Windows 8.1 и 10 ключ можно найти в пуле памяти, маркированном Cngb; он соответствует модулю ksecdd.sys. В процессе моего изучения дампа памяти Windows 11 я не смог найти ключ ни в одном из этих мест, но нашёл его в двух других.
Второе место находится под pool tag None, соответствующим вызовам процедуры ExAllocatePool. На этот раз первая половина ключа встречается два раза, а вторая — один раз.
Дальше нужно сдампить это шестнадцатеричное значение в файл. Это можно сделать так:
Я крайне рекомендую использовать набор инструментов dislocker для определения нужного алгоритма/значения и разблокировки диска. Если сделать всё правильно, то можно воспользоваться output.fvek для разблокировки защищённого Bitlocker раздела и доступа к любым данным в томе.
Краткая справка
Если у нападающего есть физический доступ к устройству, то он потенциально может получить доступ, резко перезапустив компьютер и выполнив дамп ОЗУ из недавно выполнявшихся экземпляров Windows. Дамп памяти можно проанализировать, чтобы найти конфиденциальную информацию, например, ключи FVEK. Эта методика не работает гарантированно, потому что после отключения питания содержимое ОЗУ быстро деградирует.Существует множество методик замедления этой деградации памяти, например, физическое охлаждение ОЗУ или использование внешних источников питания с целью поддержания подачи энергии. Для своего демо я закоротил контакты сброса на материнской плате устройства, что заставляет систему резко отключаться без потери питания.
Ещё одна потенциальная проблема заключается в secure boot — стандарте безопасности, который ограничивает то, что может выполняться при запуске системы. Эта защита имеет собственные ограничения, и ещё уже обходили при помощи shim и множества других способов, которые для нашего демо несущественны.
Этап 1: создаём загрузочное USB-устройство
Для этого этапа нам понадобится USB-накопитель, размер которого больше, чем объём ОЗУ целевой системы. Для упрощения этого этапа я написал скрипт flashimage.sh.Воспользуйтесь инструкциями по созданию и применению загружаемого приложения.
Этап 2: резкий перезапуск целевой системы
Этот этап можно реализовать множеством разных способов; наша основная цель — минимизировать временной промежуток, в течение которого питание компьютера полностью отключено. По моему опыту, максимального успеха можно добиться, перезагружая систему, когда Windows ещё загружается, но не достигла экрана логина; по крайней мере, это справедливо в случае поиска ключей FVEK.Этап 3: загружаемся с USB-устройства
Незамедлительно выполняем запуск Memory-Dump-UEFI с USB-устройства. Мы окажемся в оболочке UEFI, в которой можно выполнить app.efi. Подробнее о том, как это сделать, можно прочитать в файле README приложения. Объём требуемого времени зависит от объёма ОЗУ, подвергающегося дампу, и скорости USB-устройства. Я рекомендую на этом этапе отключить все другие USB-устройства, чтобы программа случайно не выполнила запись не на тот накопитель.На скриншоте показано, как должно выглядеть успешное попадание в оболочку. Дамп памяти начнёт генерировать файлы дампа, пока у него не закончится память. После завершения можно спокойно отключить компьютер обычным образом.
Этап 4: анализ дампов
Подготовка
Вероятно, приложение создаст множество дампов. Это вызвано ограничением в 4 ГБ на размер файла, накладываемым файловой системой FAT32. Чтобы соответствовать спецификации UEFI, необходимо использовать эту файловую систему. Для удобства я добавил в папку инструментов программу concatDumps, в хронологическом порядке соединяющую множество дампов в один. Дамп будет состоять из сырых данных, находившихся в памяти на момент его создания, поэтому для удобства чтения я рекомендую воспользоваться инструментом наподобие xxd. В помощь поиску по дампам я написал программу searchMem, позволяющую искать в дампе шестнадцатеричные паттерны. Она находит смещение вхождений таких шестнадцатеричных паттернов, к которым можно затем перейти командой xxd -s <offset> <dump>.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).Второе место находится под pool tag None, соответствующим вызовам процедуры ExAllocatePool. На этот раз первая половина ключа встречается два раза, а вторая — один раз.
Дальнейшие шаги
Важно отметить, что полученному ключу должно предшествовать обозначение применённого алгоритма. То есть если ключ имеет вид b2cbc06071931b7cc50b59f8789571f4dd815c2008e93c02d5c6cd98c83ef54b, то вам нужно добавить в начало ключа 0x8004 (или обозначение другого алгоритма) в формате little endian:
Код:
0480b2cbc06071931b7cc50b59f8789571f4dd815c2008e93c02d5c6cd98c83ef54b
Дальше нужно сдампить это шестнадцатеричное значение в файл. Это можно сделать так:
Код:
echo "0480b2cbc06071931b7cc50b59f8789571f4dd815c2008e93c02d5c6cd98c83ef54b" | xxd -r -p > output.fvek
Я крайне рекомендую использовать набор инструментов dislocker для определения нужного алгоритма/значения и разблокировки диска. Если сделать всё правильно, то можно воспользоваться output.fvek для разблокировки защищённого Bitlocker раздела и доступа к любым данным в томе.