• XSS.stack #1 – первый литературный журнал от юзеров форума

Статья Методы форензики для MBR и GPT

Joow

HDD-drive
Пользователь
Регистрация
24.08.2024
Сообщения
25
Реакции
10
Методы форензики для MBR и GPT, используемые для обнаружения атак на стадии загрузки.

Приветствую всех!
Решил поделиться лекцией, которую проходил на одной из образовательных платформ. Часть материала перевел машинным способом, а часть — самостоятельно. Дополнительно добавил свое чуть чуть, благодаря чему получилась довольно объемная и содержательная тема. Думаю, что этот материал будет особенно полезен для начинающих специалистов.


Представьте, что ваш диск – это огромное здание, где хранится вся информация. Данные на диске записаны в двоичном формате, состоящем из единиц и нулей, которые компьютер может интерпретировать. Однако без должной структуры эти данные могли бы превратиться в беспорядок. Для упорядочивания информации диск разделяют на несколько секций, подобно тому, как здание делится на комнаты. Каждый раздел содержит определённый тип данных: например, файлы операционной системы могут находиться в одном разделе, а личные документы – в другом. В Windows разделы обозначаются буквами дисков, такими как C, D или E. В других операционных системах используются свои методы обозначения разделов.
Организация данных на диске требует эффективного управления, и для этого используется так называемая "карта", определяющая расположение разделов, их границы и содержимое. В роли такой карты выступают две основные схемы разметки диска: MBR (Master Boot Record) и GPT (GUID Partition Table). Эти схемы представляют собой своего рода чертеж диска, где подробно указаны все разделы, их структура и характеристики.
MBR и GPT различаются по своей архитектуре и функциональным возможностям. Выбор между ними зависит от множества факторов, таких как объём диска, аппаратная совместимость и другие технические параметры.
Обе схемы разметки размещаются в начальном секторе диска и хранят ключевую информацию о его структуре. Кроме того, они играют важную роль в процессе загрузки операционной системы. Это делает MBR и GPT уязвимыми для атак, можно использовать их для внедрения вредоносного программного обеспечения (например, Bootkits) или модификации данных с целью вывода системы из строя.
Процесс загрузки активирует всю систему. Он включает инициализацию аппаратных компонентов, загрузку операционной системы в память и завершает предоставлением пользователю возможности взаимодействовать с системой. В этом материале мы сосредоточимся на начальной стадии загрузки, вплоть до роли MBR/GPT. Цель состоит в том, чтобы разобраться в основах загрузки системы, прежде чем углубиться в структуру MBR/GPT и изучить их значимость с точки зрения криминалистики.
Общий процесс загрузки системы состоит из нескольких шагов, как это показано на приведенной ниже блок-схеме:
01.png

Power-On the System
Процесс загрузки начинается с активации кнопки питания, которая передает электрический сигнал на материнскую плату, инициируя работу всех ее компонентов. Первым устройством, получающим сигнал, становится центральный процессор (CPU), который ожидает инструкции для выполнения последующих действий. Эти инструкции процессор получает из микросхемы, встроенной в материнскую плату. Эта микросхема, известная как BIOS или UEFI, содержит базовый набор команд, необходимых для начала загрузки системы.
02.png


BIOS (Basic Input/Output System) и UEFI (Unified Extensible Firmware Interface) выполняют важную функцию проверки работоспособности всех аппаратных компонентов системы. Компьютеры могут использовать либо BIOS, либо прошивку UEFI, а ключевое различие между ними заключается в их функциональных возможностях.
BIOS является технологией с многолетней историей, которая до сих пор применяется в некоторых системах. Он функционирует в базовом 16-битном режиме и поддерживает жесткие диски объемом до 2 терабайт, используя схему разбиения MBR, о которой подробнее будет сказано далее.
UEFI разработан как более современная альтернатива BIOS. Он поддерживает 32-битный и 64-битный режимы, а также обеспечивает работу с дисками объемом до 9 зеттабайт. Среди его ключевых функций — Secure Boot, который защищает процесс загрузки системы, и механизмы восстановления из резервной копии, позволяющие избежать проблем при повреждении загрузочного кода. В отличие от BIOS, UEFI использует схему разбиения GPT.
Чтобы определить, используется ли в вашей системе BIOS или UEFI, можно выполнить несколько шагов, зависящих от операционной системы. Для Windows выполните следующее:
Откройте диалоговое окно "Выполнить", нажав сочетание клавиш Windows + R.
Введите msinfo32 и нажмите Enter.
В появившемся окне "Сводка системы" найдите строку BIOS Mode. Если указан режим Legacy, это означает использование BIOS. Если отображается UEFI, значит система работает с прошивкой UEFI.​

03.png

Power-On-Self-Test (POST)
Процедура самопроверки при включении (POST): После включения системы процессор начинает выполнение инструкций, загруженных из прошивки (BIOS/UEFI). Затем BIOS/UEFI инициирует процедуру самопроверки POST для оценки работоспособности всех аппаратных компонентов. В процессе выполнения POST могут воспроизводиться звуковые сигналы, указывающие на наличие аппаратных ошибок. Информация о таких ошибках также выводится на экран в виде сообщений, например: «Клавиатура не обнаружена».​

04.png


Locate the Bootable Device
Определение загрузочного устройства: После завершения проверки POST (Power-On Self-Test) системой BIOS/UEFI начинается поиск загрузочных устройств, таких как SSD, HDD или USB-накопители, содержащих операционную систему. После обнаружения загрузочного устройства BIOS/UEFI приступает к считыванию данных с него. На этом этапе управление процессом загрузки переходит к MBR (Master Boot Record) или GPT (GUID Partition Table). Первый сектор загрузочного устройства содержит либо MBR, либо GPT, которые и инициируют дальнейшие этапы загрузки. В следующих разделах мы подробно рассмотрим процесс загрузки при использовании схемы разметки MBR, а также механизмы работы GPT.​

06.png


Изучение MBR
В предыдущем задании мы разобрали процесс загрузки — от момента включения компьютера до выбора загрузочного устройства. Теперь предположим, что выбранное устройство использует схему разделов MBR. Хотя MBR была стандартом на протяжении многих десятилетий, в современных системах её вытеснил GPT. Однако MBR по-прежнему встречается на некоторых системах, поэтому важно изучить её работу.
Выбранное загрузочное устройство на третьем этапе процесса представлено в виде диска, который разделён на сектора стандартного размера 512 байт. Первый сектор такого диска содержит MBR. Чтобы исследовать MBR, нужно взять образ диска системы и открыть его в шестнадцатеричном редакторе.
Для этого задания мы будем использовать редактор HxD. Запустите HxD, нажмите File в панели меню, выберите Open и укажите путь к файлу, который нужно открыть. Мы подготовили часть MBR из образа диска и сохранили её по адресу C:\Analysis\MBR. Откройте этот файл, чтобы проанализировать содержимое MBR и выполнить задание.​

07.png


Это откроет его в шестнадцатеричном формате.​

08.png


Основная загрузочная запись (MBR) занимает 512 байт и располагается в первом секторе диска. Она начинается с самого начала этого сектора. Чтобы проанализировать код MBR, можно просто начать с его первой строки, но как определить, где заканчивается этот код? Решение очевидно: каждые две цифры в шестнадцатеричном формате представляют собой 1 байт, и как только достигаются первые 512 байт диска, заканчивается и код MBR. В используемом шестнадцатеричном редакторе каждая строка отображает 16 байт, следовательно, первые 32 строки полностью охватывают весь MBR.
Еще один способ определить конец MBR — найти его сигнатуру. Сигнатура MBR представлена значением 55 AA, которое обозначает завершение кода. Для определения конца MBR достаточно найти эту шестнадцатеричную последовательность.
На приведенном ниже скриншоте отображается часть MBR (первые 512 байт), открытая в шестнадцатеричном редакторе. Видно, что это первые 32 строки по 16 байт в каждой, завершающиеся последовательностью 55 AA (сигнатура MBR). Первая часть строки представляет смещение байтов, вторая содержит сами шестнадцатеричные байты, а третья — текстовый вывод в формате ASCII, полученный из этих байтов. Основное внимание в анализе уделяется второй части — шестнадцатеричным байтам. В данном задании мы будем анализировать весь MBR, интерпретируя значения этих шестнадцатеричных цифр.​

09.png


Прежде чем приступать к анализу байтов, важно помнить, что каждая пара шестнадцатеричных символов представляет собой один байт. Эти 512 байт MBR (Master Boot Record) разделены на три части. На следующем скриншоте каждая из этих трёх частей MBR выделена разными цветами.​

10.png



Структура MBR показана ниже:

11.png


Давай разберем каждую из трех частей MBR (Master Boot Record).
Код загрузчика (байты 0-446) Bootloader Code (Bytes 0-446)
Первая часть MBR — это код загрузчика. Он занимает 446 байт из общих 512 байт MBR, как показано на скриншоте ниже:​

12.png


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

Примечание: Для более глубокого понимания работы начального загрузчика можно выполнить его дизассемблирование в ассемблерный код, однако это выходит за рамки текущей задачи.

Таблица разделов (байты 446–509) Partitions Table (Bytes 446-509)
Одним из ключевых элементов MBR является таблица разделов, занимающая 64 байта (байты 446–509). В этой таблице хранится информация о всех разделах диска. Один из разделов содержит все файлы операционной системы, необходимые для загрузки, и называется загрузочным. Начальный загрузчик, загруженный из MBR, идентифицирует загрузочный раздел и загружает из него второй загрузчик. Второй загрузчик, в свою очередь, инициирует загрузку ядра операционной системы. Таблица разделов играет важную роль в процессе загрузки, а также может использоваться для извлечения важной информации в ходе криминалистических исследований. Рассмотрим её подробнее.
MBR может содержать до 4 разделов, каждый из которых занимает 16 байт в таблице. На приведённом ниже скриншоте четыре раздела (по 16 байт каждый) выделены различными цветами.​

13.png

Теперь, для вашего понимания, также показали информацию о разделах того же диска через утилиту управления дисками в операционной системе Windows. Здесь можно увидеть те же четыре раздела:​

14.png


В отличие от загрузочного кода, шестнадцатеричные значения этих разделов содержат много полезной информации. Рассмотрим первый раздел таблицы разделов на приведённом ниже скриншоте, чтобы проанализировать значение каждой шестнадцатеричной цифры.
На скриншоте ниже изображён первый раздел таблицы разделов MBR. Каждый байт имеет своё назначение: некоторые представляют отдельные поля, а другие объединены в группы для формирования полей. Мы выделили эти группы байтов разными цветами для наглядности.​

15.png

Таблица ниже показывает поля, представленные этими байтами.

16.png


Каждое поле предоставляет информацию о разделе. Ниже приводится описание всех этих полей:
Индикатор загрузки:
Этот байт указывает, является ли раздел загрузочным. Загрузочный раздел содержит файлы, необходимые для старта операционной системы. Значение индикатора может быть 80 (раздел загрузочный) или 00 (раздел не загрузочный). Например, в системах Windows раздел C: обычно загрузочный, и его индикатор в таблице разделов будет установлен на 80.
Начальный CHS-адрес:
CHS (Cylinder Head Sector — цилиндр, головка, сектор) представляет собой 3 байта, определяющие начальный физический адрес раздела на диске. Однако, в современных системах вместо CHS чаще используется начальный адрес LBA (о нем ниже), который проще для обработки.
Тип раздела: Этот байт указывает на файловую систему, используемую разделом, например, NTFS, FAT32 и т.д. В нашем примере значение 07 соответствует файловой системе NTFS. Для других файловых систем существуют свои уникальные коды.
Конечный CHS-адрес: Последние 3 байта в CHS-адресе показывают физическое окончание раздела на диске. Как и начальный CHS-адрес, данное поле имеет ограниченное значение в современных системах, где основной акцент делается на логической адресации (LBA).
Начальный LBA-адрес: LBA (Logical Block Addressing — логическая адресация блоков) — это логический адрес начала раздела. В отличие от CHS, который указывает физический адрес, LBA является более удобным для поиска и восстановления данных, особенно в редакторах шестнадцатеричных данных. В нашем примере начальный адрес LBA (00 08 00 00) используется для нахождения раздела на диске.
Количество секторов: Это поле из 4 байтов указывает на количество секторов, занимаемых разделом, что позволяет вычислить его размер.
Таким образом, индикатор загрузки и тип раздела достаточно понятны и не требуют дополнительных пояснений. Начальные и конечные CHS-адреса менее значимы в современных системах. Основное внимание будет уделено использованию начального LBA-адреса для нахождения раздела и расчета его размера на основе количества секторов.

Определение местоположения раздела:
Начальный LBA-адрес раздела, используемый в данном примере, составляет 00 80 00 00. Эти байты представлены в формате little-endian, где первый байт является наименее значимым (LSB), а последний — наиболее значимым (MSB). Поэтому перед обработкой необходимо изменить порядок байтов. После изменения их порядок будет 00 00 80 00.
Далее требуется преобразовать полученные байты в десятичный формат. Для этого можно воспользоваться онлайн-инструментом или использовать шестнадцатеричный редактор HxD, где отображается десятичное значение. Выберите нужные байты, и их значение в десятичной системе будет показано в поле Int32 панели Data Inspector, расположенной справа.

17.png

Теперь, когда у нас есть десятичное значение 2048, мы должны умножить его на размер сектора, который составляет 512 байт.
2048 x 512 = 1 048 576
1 048 576
— это точное значение, по которому хранится раздел. Последний шаг — найти это значение в инструменте HxD, чтобы перейти к началу этого раздела.
Чтобы выполнить поиск, сначала нажмите кнопку "Поиск", а затем выберите опцию "Перейти".

18.png


Теперь введите значение в поле, выберите десятичный формат (dec) и нажмите кнопку "OK".

19.png


Этот процесс позволяет перейти к началу указанного раздела на диске, что может быть полезно для проведения детального анализа конкретного раздела. Также вы можете восстановить скрытые или удаленные данные, которые еще не были перезаписаны. Однако, поскольку предоставленный файл содержит только MBR (Master Boot Record), а не весь диск, прямой доступ к начальному LBA (Логическому Блочному Адресу) раздела, который расположен за пределами MBR, невозможен.

Примечание: Для выполнения данной операции важно учитывать следующий метод: интерпретируйте адрес LBA, перевернув его байты (формат little-endian, где младший байт идет первым), преобразуйте его в десятичный формат, умножьте на размер сектора (512 байт) и используйте полученный адрес в hex-редакторе для перехода к точному расположению. В структуре GPT вы также можете столкнуться с другими Логическими Блочными Адресами (LBA), которые используются для определения разделов.

Расчет размера раздела
Последние четыре байта записи раздела указывают поле "Количество секторов". Например, для рассматриваемого раздела эти байты имеют значение 00 B0 23 03. Преобразовав их из формата little-endian в стандартный порядок, получаем 03 23 B0 00. Следующий шаг — перевод этого значения в десятичный формат. С помощью инструмента, такого как HxD, вы можете выделить эти байты аналогично тому, как определялось начальное значение LBA. В данном случае получаем десятичное значение 52,670,464. Умножив его на размер сектора (512 байт), вычисляем общий размер раздела:
52,670,464 × 512 = 26,967,277,568 байт

Подпись MBR (байты 510–511)

Завершающая часть MBR содержит его подпись (MBR Signature), занимающую два байта. Любое нарушение этих байтов может привести к серьезным сбоям в работе системы. На приведенном ниже изображении показан полный MBR с выделенной подписью в нижней части.​

20.png


Эти два байта (55 AA), также называемые "Магическим числом" (Magic Number), служат индикатором завершения MBR. Если их значение изменить на что-либо, отличающееся от 55 AA, загрузка системы становится невозможной. Данные байты могут быть повреждены из-за наличия плохих секторов на диске или намеренно изменены вредоносным ПО, что нарушает стандартный процесс загрузки.

Итоговый процесс загрузки через MBR включает следующие этапы:
1. Начальный загрузчик запускается из загрузочного кода (первый компонент MBR).
2. Он определяет загрузочный раздел, используя таблицу разделов (второй компонент MBR).
3. После этого из указанного раздела загружается второй загрузчик.
4. Затем загружается ядро операционной системы, вслед за которым в память помещаются драйверы, службы и файловые системы. После завершения этих этапов управление передается пользователю через интерфейс операционной системы.
Таким образом, описанный процесс представляет собой полный цикл загрузки системы, использующей дисковую схему MBR.

Современные угрозы, нацеленные на MBR (Master Boot Record), остаются актуальными, несмотря на снижение его популярности. Сегодня MBR уступил место более современному стандарту GPT (GUID Partition Table), который используется в сочетании с UEFI-прошивкой. Это связано с преимуществами GPT, включая улучшенную производительность и надежность, по сравнению с BIOS, поддерживающим MBR. Однако, MBR всё ещё применяется на некоторых устройствах, что делает важным понимание связанных с ним рисков.
MBR выполняет критически важную функцию в процессе загрузки операционной системы, что превращает его в привлекательную цель для атаки. Всего 512 байт данных в MBR содержат ключевую информацию для запуска системы, и манипуляции с ними могут привести к полному захвату контроля над устройством. Существуют различные виды вредоносного программного обеспечения, специально разработанные для атак на MBR, среди которых наиболее опасны буткиты.

Буткиты (Bootkits)
Буткиты представляют собой особо опасный тип вредоносного ПО, атакующего MBR. Поскольку MBR загружается до операционной системы, буткиты внедряют себя на этом этапе, обходя защитные механизмы ОС. Их коварство заключается в том, что стандартные методы, такие как удаление вредоносного ПО или переустановка ОС, не способны устранить буткиты, поскольку они находятся непосредственно в MBR.

Вымогательское ПО (Ransomware):
MBR (Master Boot Record) — это первый исполняемый элемент на диске, от которого зависит процесс загрузки системы. Вместо шифрования отдельных файлов, модифицируют и шифруют MBR, нарушая работу загрузки системы и выводя на экран сообщение с требованиями выкупа.
Примером такого подхода является вымогательское ПО Petya, обнаруженное в 2016 году, которое шифрует MBR вместо пользовательских данных. Другой случай — Bad Rabbit, которое заменяет оригинальный MBR вредоносным кодом загрузчика. После перезагрузки системы этот код выводит на экран сообщение с инструкциями для выкупа.

Wiper Malware (вредоносное ПО типа "Wiper"):
Этот тип вредоносного программного обеспечения предназначен для повреждения Master Boot Record (MBR), что делает систему неспособной к загрузке. Любое изменение оригинального MBR на диске может полностью нарушить процесс загрузки операционной системы. Например, малварь Shamoon перезаписывает MBR случайными данными, что приводит к полной утрате возможности загрузки. В следующем задании мы проанализируем схожий случай, где вредоносное ПО повредило MBR диска, вызвав сбой загрузки системы.

Сценарий: Повреждение MBR
На критически важном сервере базы данных организации внезапно возникла проблема с загрузкой, что вызвало серьезную панику. Проведенное расследование выявило, что причиной стало вредоносное вложение, открытое одним из сотрудников. После открытия файла система запросила перезагрузку, но больше не смогла загрузиться. Анализ показал, что главная загрузочная запись (MBR) была намеренно повреждена вредоносным ПО.
При диагностике были выявлены два основных повреждения MBR. Первое – измененный логический адрес первого раздела (изначально равный 00 08 00 00). Второе – критический компонент MBR, структура которого должна быть идентичной во всех загрузочных записях. Коррекция этих повреждений позволит восстановить загрузку системы. После внесения исправлений необходимо проверить результат, открыв обновленный образ диска с помощью FTK Imager.

Инструкции
Для выполнения задания используются два инструмента: FTK Imager и HxD
HxD – это редактор шестнадцатеричного кода, позволяющий просматривать и редактировать содержимое MBR. Чтобы исследовать повреждения, необходимо:
Использовать HxD для анализа поврежденных байтов MBR.
22.png


Примечание: При сохранении изменений в HxD может появиться сообщение об ошибке: «На диске недостаточно места». Это связано с тем, что HxD автоматически создает резервную копию исходного файла перед сохранением изменений, однако из-за нехватки места резервная копия не может быть создана. Несмотря на это, файл всё равно можно сохранить. Для продолжения нажмите Yes, и изменения будут сохранены без создания резервной копии.
После внесения и сохранения исправлений поврежденных байтов в образ диска откройте исправленный образ с помощью FTK Imager (инструкции ниже) и проверьте, доступно ли содержимое диска. Если содержимое успешно отображается, это свидетельствует о восстановлении поврежденной MBR, и диск готов к использованию.

FTK Imager — это инструмент для криминалистического анализа, позволяющий создавать и исследовать образы дисков. Образ зараженного диска был изначально сохранен сразу после атаки с использованием загрузочной системы на базе Live USB. Данный образ предоставлен для анализа в FTK Imager.
До восстановления MBR при открытии образа в FTK Imager может отображаться ошибка: «Unrecognized file system». После исправления MBR вы сможете получить доступ ко всему содержимому диска для дальнейшего анализа.

Как открыть образ диска в FTK Imager:
1. В меню нажмите File.
2. Выберите опцию Add Evidence Item.

23.png


Теперь выберите опцию "Image File" и нажмите кнопку "Next".

24.png


Наконец, введите исходный путь к файлу образа и нажмите кнопку "Finish", чтобы просмотреть содержимое образа диска.

25.png


Левая панель отображает образ диска в виде дерева. Вы можете раскрыть содержимое диска, нажав на значок «+». В данный момент отображается «Неопознанная файловая система», так как MBR (главная загрузочная запись) диска повреждена. Правая панель показывает содержимое и детали файлов и папок, которые вы выберете в левой панели.

27.png


Что такое GPT?
Ранее мы рассматривали процесс загрузки системы с использованием схемы разметки MBR. В этом задании мы изучим, как организован процесс загрузки при применении более современной схемы разбиения диска — GPT.
Прошивка UEFI с разметкой GPT пришла на смену BIOS с MBR, что связано с рядом ограничений последней. В частности, GPT поддерживает диски объемом до 9 зеттабайт, тогда как MBR ограничивается 2 терабайтами. Кроме того, GPT позволяет создавать до 128 разделов, в то время как MBR поддерживает лишь 4. Между этими схемами существуют и другие значительные различия.
Сегодня GPT является наиболее распространенной схемой разметки для современных систем, так как она интегрируется с прошивкой UEFI. В рамках задания мы подробнее изучим структуру GPT.
Если MBR занимает только первый сектор диска (512 байт), то структура GPT распределена по нескольким секторам и состоит из пяти компонентов. Мы рассмотрим каждый из них отдельно.​

28.png


Защитная MBR (Protective MBR)
Использование диска с разметкой GPT оптимально в системах с прошивкой UEFI, поддерживающей эту схему. Однако в некоторых устаревших системах всё ещё используется прошивка BIOS, даже если диск размечен с помощью GPT. Это может привести к проблемам, так как BIOS рассчитан на работу с MBR, тогда как UEFI предназначен для GPT. Для решения этой несовместимости в структуре GPT предусмотрена защитная MBR (Protective MBR).
Защитная MBR размещается в первом секторе диска, размеченного по GPT. Её функция заключается в том, чтобы информировать систему с прошивкой BIOS о наличии GPT-разметки и предотвращать попытки интерпретировать такой диск как MBR, что могло бы привести к повреждению данных.
Как и стандартная MBR, защитная MBR включает три основных компонента, но имеет свои отличительные особенности. На иллюстрации ниже показана структура защитной MBR в GPT, где её три компонента выделены разными цветами.​

29.png


Детали данных компонентов описаны ниже:
1. Код загрузчика (Bootloader Code):
Код загрузчика в защитной MBR отличается от стандартной версии MBR. Он не участвует в процессе загрузки системы и выполняет исключительно декоративную функцию, чтобы напоминать стандартный MBR. Обычно этот код полностью заполнен нулями (00), но в некоторых случаях может содержать условный код для обеспечения совместимости с устаревшими системами.
2. Таблица разделов (Partition Table): В защитной MBR таблица разделов содержит только одну запись (первые 16 байт), которая предназначена для перенаправления системы на EFI-раздел (подробно описанный далее). На представленном выше изображении защитной MBR видно, что таблица содержит лишь одну запись, а остальные заполнены нулями. Единственным значимым элементом этого раздела является четвёртый байт, значение которого установлено в EE. Это значение указывает на использование GPT-разметки на диске.​

30.png


3. Подпись MBR (MBR Signature): Подпись MBR идентична стандартной MBR. Она установлена в значение 55 AA и обозначает конец защитной MBR.

Основной заголовок GPT (Primary GPT Header):
Заголовок GPT располагается сразу после завершения защитной MBR на отметке 55 AA (конец сектора 0) и начинается с первого байта сектора 1. Он выполняет функцию схемы разметки разделов на диске. Каждый байт заголовка GPT имеет строго определённое значение. На изображении ниже представлен заголовок GPT, где байты выделены различными цветами для наглядности. Заголовок занимает весь сектор размером 512 байт, однако значимая информация содержится только в первых 92 байтах. Оставшиеся байты сектора заполняются нулями (00) для выравнивания. Таким образом, при работе с основным заголовком GPT необходимо уделять внимание именно первым 92 байтам, содержащим ключевые данные.​

31.png

Таблица ниже показывает положение этих байтов и их названия полей.

32.png

Каждое из 14 полей, упомянутых выше, имеет строго определённое назначение и значение. Ниже приводится детальное описание каждого из них. Перед анализом важно отметить, что некоторые из полей содержат адреса логических блоков (LBA). Для вычисления точного адреса по этим LBA необходимо выполнить те же действия, что и при определении местоположения разделов в задаче с MBR: реверсировать байты в формате little-endian, преобразовать их в десятичное представление и найти их с помощью инструмента HxD для перехода к точному местоположению.

Signature (Сигнатура): Поле содержит значение 45 46 49 20 50 41 52 54, идентифицирующее данный блок как заголовок GPT. Это значение всегда располагается в начале заголовка GPT.
Revision (Ревизия): Это поле длиной 4 байта обозначает версию спецификации GPT. Обычно его значение равно 00 00 01 00, что соответствует версии GPT 1.0.
Header Size (Размер заголовка): Указывает размер заголовка GPT. Как правило, это значение равно 5C 00 00 00 (в формате little-endian). После преобразования в десятичный вид оно составляет 92 байта.
CRC32 of Header (Контрольная сумма заголовка): Это контрольная сумма CRC32 для проверки целостности заголовка GPT. Если значение контрольной суммы изменено, это указывает на повреждение или модификацию заголовка.
Reserved (Зарезервировано): Поле, предназначенное для будущих изменений в спецификации GPT. Оно пока не используется и должно содержать нули.
Current LBA (Текущий LBA): Указывает местоположение текущего заголовка GPT, который всегда располагается в секторе 1. Например, значение 01 00 00 00 00 00 00 00 в десятичном формате подтверждает это местоположение.
Backup LBA (Резервный LBA): Указывает местоположение резервной копии заголовка GPT, размещённой в последнем секторе диска.
First Usable LBA (Первый доступный LBA): Определяет начальный адрес на диске, с которого может быть создан раздел.
Last Usable LBA (Последний доступный LBA): Указывает последний адрес на диске, который может быть использован для размещения разделов. Пространство за пределами этого адреса недоступно для записи.
Disk GUID (GUID диска): Это 16-байтный глобально уникальный идентификатор диска. Он позволяет однозначно идентифицировать диск в системе. Например, значение 1D F1 B0 D6 43 BE 37 4E B1 E6 38 66 EC B1 73 89 представляется в стандартном формате как 1DF1B0D6-43BE-374E-B1E6-3866ECB17389.
Partition Entry Array LBA (LBA массива записей разделов): Указывает начальное местоположение массива записей разделов, который является третьим компонентом структуры GPT.
Number of Partition Entries (Число записей разделов): Поле определяет максимальное количество разделов, поддерживаемых GPT. Например, значение 80 00 00 00 соответствует 128 разделам, что значительно превышает лимит в 4 раздела, установленный для MBR.
Size of Each Partition Entry (Размер каждой записи раздела): Указывает размер одной записи в массиве записей разделов. В большинстве случаев это значение равно 80 00 00 00, что в десятичном представлении составляет 128 байт. Здесь важно понимать, что речь идёт о размере записи, а не о самом разделе.
CRC32 of Partition Array (Контрольная сумма массива разделов): Контрольная сумма CRC32, используемая для проверки целостности массива записей разделов. Её изменение сигнализирует о повреждении или модификации массива.

Массив записей разделов (Partition Entry Array)
Как уже упоминалось, сектор 0 зарезервирован под защитный MBR, а заголовок GPT находится в секторе 1. Начиная с сектора 2, располагается массив записей разделов (Partition Entry Array), который напоминает таблицу разделов в MBR, но имеет ряд отличий. На диске с GPT может быть до 128 разделов, и этот массив содержит данные обо всех из них.
На скриншоте ниже показан массив записей разделов на GPT-диске. Каждая запись раздела занимает 128 байт. Видно только 6 записей из возможных 128, поскольку на данном диске используются лишь 6 активных разделов. Эти 6 разделов представлены в виде блоков по 128 байт в массиве записей. Остальные 122 записи, соответствующие неиспользуемым разделам, заполнены значением 00.​

33.png


Давайте используем первую запись раздела из скриншота выше в качестве примера для анализа значения всех шестнадцатеричных цифр, содержащихся в ней.
На скриншоте ниже показана первая запись раздела из массива записей разделов GPT. Все байты (или их группы) имеют определенное значение. Мы выделили различные группы байтов разными цветами.​

34.png

Таблица ниже показывает поля, представленные этими байтами.

35.png


1. GUID типа раздела (Partition Type GUID)
GUID типа раздела определяет назначение раздела, например, EFI System Partition или Basic Data Partition. Он хранится в записи раздела в виде 16 байтов в смешанном формате (little-endian и big-endian). Для корректного преобразования GUID необходимо выполнить следующие шаги:
1. Инвертировать первые 4 байта (например, 28 73 2A C1 → C1 2A 73 28), так как они в формате little-endian.
2. Инвертировать следующие 2 байта (например, 1F F8 → F8 1F), также представленные в формате little-endian.
3. Инвертировать еще 2 байта (например, D2 11 → 11 D2), поскольку они также в формате little-endian.
4. Оставить следующие 2 байта (например, BA 4B) без изменений, так как они в формате big-endian.
5. Оставить последние 6 байтов (например, 00 A0 C9 3E C9 3B) без изменений, поскольку они также в формате big-endian.

Результирующий GUID после выполнения преобразований будет иметь вид: C12A7328-F81F-11D2-BA4B-00A0C93EC93B. По этому GUID можно определить тип раздела, например, указанный GUID используется для EFI System Partition (ESP).

EFI System Partition (ESP)
ESP представляет собой отдельный раздел на диске с таблицей разделов GPT, выполняющий важную роль в процессе загрузки. В отличие от MBR, где загрузчики хранятся в загрузочном коде и разделе, в GPT они представлены в виде файлов с расширением .efi, которые располагаются в ESP. Загрузчик из этого раздела отвечает за загрузку ядра операционной системы, а затем и необходимых драйверов, служб и файловых систем. После этого управление передается пользователю через интерфейс операционной системы.
1. Уникальный GUID раздела (Unique Partition GUID): Этот GUID представляет собой уникальный идентификатор, присваиваемый каждому разделу для их различения. Для преобразования его в стандартный формат GUID применяются те же шаги, что и для GUID типа раздела.
2. Начальный LBA (Starting LBA): Поле начального LBA указывает начальный адрес раздела на диске.
3. Конечный LBA (Ending LBA): Поле конечного LBA указывает конечный адрес раздела на диске.
4. Атрибуты (Attributes): Данное поле содержит флаги, определяющие характеристики раздела, такие как его загрузочность, скрытость или обычное назначение.
5. Имя раздела (Partition Name): Последнее поле записи раздела, размером 72 байта, используется для хранения имени раздела в строковом формате, закодированном в UTF-16. Это имя можно извлечь, декодировав байты через любой онлайн-конвертер из шестнадцатеричного формата в строку.

Резервная копия заголовка GPT
Одним из главных преимуществ GPT по сравнению с MBR является его надежность, обусловленная наличием резервных копий. Если в случае MBR возникает повреждение или изменение главной загрузочной записи (MBR) из-за аппаратных сбоев или вредоносных атак, восстановление данных становится крайне затруднительным. В отличие от этого, GPT хранит резервные копии своих компонентов. Резервный заголовок GPT находится в последнем секторе диска и может использоваться для восстановления в случае повреждения основного заголовка GPT. Этот заголовок содержит ту же информацию, что и основной заголовок GPT.
Резервная копия массива записей разделов
Кроме того, GPT сохраняет резервную копию массива записей разделов. Она размещается в конце диска непосредственно перед резервным заголовком GPT. Эта копия содержит ту же информацию, что и основной массив записей разделов, и служит механизмом защиты на случай повреждения оригинального массива записей.
Угрозы, связанные с GPT
GUID Partition Table (GPT) обладает значительными преимуществами перед Master Boot Record (MBR) в плане эффективности и надежности. Однако она также подвержена определенным видам атак. Ниже приведены основные виды вредоносного ПО, использующего GPT для своих целей:
Буткиты (Bootkits)
В GPT код загрузчика хранится в разделе EFI System Partition (ESP), который контролируется прошивкой UEFI. Этот код представлен в виде нескольких файлов с расширением .efi в разделе ESP. Злоумышленники могут заменить эти файлы на вредоносные буткиты, позволяющие вредоносному ПО запускаться до загрузки операционной системы. Это позволяет обойти защитные механизмы, действующие на уровне ОС. Для предотвращения подобных атак используется функция Secure Boot в UEFI, которая проверяет целостность загрузочных файлов с помощью цифровых подписей.
Вымогательское ПО (Ransomware)
Вымогательское ПО может также нацеливаться на GPT, чтобы нарушить процесс загрузки. Такая атака может быть сложнее по сравнению с MBR, поскольку избыточность GPT в виде резервной копии заголовка GPT и массива записей разделов препятствует этому. Однако некоторые сложные виды вредоносного ПО могут шифровать раздел ESP, что может привести к сбою загрузочного процесса.
Маскирующее вредоносное ПО (Wiper Malware)
GPT предоставляет резервный заголовок и массив записей разделов, что позволяет системе восстанавливаться с их помощью даже в случае уничтожения основных данных вредоносным ПО. Однако некоторые сложные виды вредоносного ПО используют методы шифрования как основного, так и резервного заголовков GPT и массива записей разделов, чтобы полностью нарушить процесс загрузки. Некоторые вредоносные программы могут непосредственно нацеливаться на раздел EFI System Partition (ESP), что делает восстановление практически невозможным.
Случай с UEFI Bootkit
В случае использования BIOS загрузчик операционной системы запускается из главной загрузочной записи (MBR, Master Boot Record). Однако при переходе на прошивку UEFI, поддерживающую схему разделов GPT, загрузчик работает не из GPT. Вместо этого он размещается в системном разделе EFI (ESP) в виде файлов с расширением .efi, таких как bootmgr.efi, bootx64.efi и других, в зависимости от используемой операционной системы.
Ранее изучался код загрузчика в MBR, который может быть модифицирован для внедрения bootkit. В архитектуре UEFI с GPT аналогичные изменения возможны через модификацию файлов .efi в разделе ESP. Однако это реализуемо только при отключенной функции Secure Boot. При активной Secure Boot цифровые подписи всех загрузочных файлов в разделе ESP проверяются, и выполнение измененных файлов блокируется.
Описание инцидента
В одной из организаций был зафиксирован случай обнаружения bootkit на критически важном сервере с операционной системой Windows. Организация заявила, что инцидент был локализован на ранней стадии, что позволило избежать значительного ущерба. Однако существует подозрение, что bootkit частично модифицировал файлы загрузчика и внедрил закодированную строку в свободное пространство внутри одного из файлов. Модифицированный файл загрузчика, bootmgr.efi, расположен по адресу: C:\Analysis\bootmgr.efi.​
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх