Хакер - Cold boot attack. Дампим оперативную память с помощью флешки
hacker_frei
s0i37
Содержание статьи
- Подготовка
- Эксплуатация
- Извлекаем секреты
- EFI
- Выводы
Даже если ты заботишься о сохранности своих данных, не клеишь листочки с паролями на монитор, шифруешь жесткий диск и всегда блокируешь комп, прежде чем отлучиться в туалет, это совершенно не означает, что твоя информация в безопасности. Содержимое памяти можно легко сдампить с помощью обычной флешки, и сейчас я подробно расскажу, как это сделать.
INFO
Этой статьей мы начинаем серию публикаций о практических приемах взлома и атак с использованием подручных устройств, которые можно собрать дома. Мы раскроем простые способы получения несанкционированного доступа к защищенной информации и покажем, как ее оградить от подобных атак.
Представь, что ты вышел поговорить по телефону, перекусить либо просто погулять и оставил свой компьютер или ноутбук без присмотра на 10–15 минут. Возможно, ты сотрудник офиса или студент вуза и у тебя перерыв. При этом ты, как правильный пользователь, заблокировал свой компьютер. У тебя даже зашифрованный HDD или SSD, стойкий пароль на вход в систему, установлены все необходимые обновления. Кажется, что все отлично и твои данные в безопасности. Но так ли это на самом деле?
Давай подумаем. Представим себя в роли потенциального злоумышленника. Первое и самое простое, что мы можем сделать, когда время ограниченно, — это присоединиться к компьютеру напрямую с помощью витой пары. Ведь для этого не нужно даже входить в систему. Так мы получим сетевой канал взаимодействия, который, возможно, позволит взломать компьютер одним из следующих способов:
- уязвимости (MS17-010, BlueKeep, PrintNightmare);
- NetBIOS/LLMNR spoofing (Responder);
- bruteforce (SMB, RDP);
- MITM (Evilgrade, BDFProxy, MS16-101).
Каждый из перечисленных способов заслуживает отдельного описания, но это не наш случай. Мы считаем, что система достаточно «свежая» и имеет все необходимые обновления, а пароль на вход более‑менее стойкий.
Второе, что мы можем, — перевести машину в спящий режим или гибернацию. Даже в спящем режиме диск не используется, подпитывается только RAM. После этого можно извлечь жесткий диск и подключиться к нему напрямую, например с помощью девайса, изображенного на следующем рисунке.

В большинстве случаев этого окажется достаточно. Если бы перед нами был обычный незашифрованный 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 постепенно утекают на съемный носитель злоумышленника. Демонстрация этой атаки представлена на следующем рисунке.

Как только атака будет завершена, точная копия оперативной памяти сохранится во втором разделе нашей флешки (/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-документы, архивы и прочее.
На следующем рисунке представлен пример того, что было запущено в системе перед блокировкой компьютера и началом атаки.

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

Но извлекать данные из 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 Мбайт, что практически исключит вероятность перезаписи. Энтропия дампа показывает общую картину расположения в ней данных и пустот.

Таким образом, мы расширим простой сигнатурный подход к извлечению секретов из дампа памяти до продвинутого с использованием форензики, который сможет нам многое рассказать о жертве нашей атаки.
ИЗВЛЕКАЕМ СЕКРЕТЫ
И здесь мы плавно переходим к форензике. Используя известные инструменты, такие как Volatility или Rekall, мы можем получить большой объем данных о состоянии ОС на момент нашего вмешательства. Список процессов — это отличная демонстрация того, что мы на верном пути.

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

Подобное можно сделать и для доменных учеток, получая пароли уже открытым текстом:
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, что делает их также уязвимыми к этой атаке.
Читайте ещё больше платных статей бесплатно: https://t.me/hacker_frei