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

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

hacker_frei

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

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

Дамп 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 # Ищем пароли

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

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

Сос­тояние ПК перед бло­киров­кой и аппа­рат­ным сбро­сом

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

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

Эн­тро­пия 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

Пе­реза­писы­ваем, нап­ример сло­вом 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



Report Page