Хакер - Уроки форензики. Ищем неизвестный вредонос и восстанавливаем данные из памяти

Хакер - Уроки форензики. Ищем неизвестный вредонос и восстанавливаем данные из памяти

hacker_frei

https://t.me/hacker_frei

rayhunt454

Содержание статьи

  • Используемые плагины Volatility2 для извлечения данных
  • Исследование образа памяти
  • Выводы

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

В этой статье мы про­ведем рас­сле­дова­ние подоб­ного инци­ден­та на при­мере лабора­тор­ной работы BlackEnergy с ресур­са CyberDefenders. Мы научим­ся извле­кать основные арте­фак­ты из обра­за опе­ратив­ной памяти Windows и вос­ста­новим про­цесс ата­ки.

Сог­ласно сце­нарию, круп­ная кор­порация под­вер­глась кибера­таке, которая при­вела к кра­же кон­фиден­циаль­ных дан­ных. Ата­ка была про­веде­на с исполь­зовани­ем ранее не встре­чав­шей­ся раз­новид­ности вре­доно­са BlackEnergy v2. Груп­па реаги­рова­ния на инци­ден­ты сде­лала дамп памяти ском­про­мети­рован­ного компь­юте­ра для даль­нейше­го изу­чения. Наша задача — про­вес­ти рас­сле­дова­ние и разоб­рать­ся, что все‑таки про­изош­ло.

По резуль­татам решения кей­са необ­ходимо отве­тить на ряд воп­росов, но я покажу толь­ко само решение. Ты смо­жешь пов­торить весь про­цесс самос­тоятель­но, что­бы луч­ше разоб­рать­ся и зак­репить матери­ал.

Для начала заг­рузим файл ар­хива с арте­фак­тами и прис­тупим к его иссле­дова­нию.

Для ана­лиза памяти вос­поль­зуем­ся ути­литой Volatility Framework 2.6.1 — этот инс­тру­мент написан на Python вер­сии 2 и пред­назна­чен для извле­чения арте­фак­тов из образцов энер­гозави­симой памяти.

ИСПОЛЬЗУЕМЫЕ ПЛАГИНЫ VOLATILITY2 ДЛЯ ИЗВЛЕЧЕНИЯ ДАННЫХ

  1. Imageinfo — пла­гин для опре­деле­ния опе­раци­онной сис­темы, пакета обновле­ний и аппа­рат­ной архи­тек­туры иссле­дуемо­го обра­за.
  2. Pstree — пла­гин для прос­мотра спис­ка про­цес­сов в виде дерева.
  3. Handles — пла­гин для прос­мотра откры­тых дес­крип­торов к фай­лам, раз­делам реес­тра, мьютек­сам, име­нован­ным каналам, событи­ям в про­цес­сах. Так­же мож­но отоб­разить дек­срип­торы для кон­крет­ного про­цес­са или отфиль­тро­вав их по кон­крет­ному типу объ­екта.
  4. Consoles — пла­гин для поис­ка команд, которые зло­умыш­ленни­ки вве­ли в cmd.exe. Основным пре­иму­щес­твом это­го пла­гина явля­ется то, что он не толь­ко выводит коман­ды, вве­ден­ные зло­умыш­ленни­ками, но и собира­ет весь экранный буфер (ввод и вывод).
  5. Memdump — пла­гин для извле­чения всех резиден­тных стра­ниц памяти в про­цес­се.
  6. Filescan — пла­гин для поис­ка объ­ектов FILE_OBJECT в памяти с помощью ска­ниро­вания тегов пула. Дан­ный пла­гин най­дет все откры­тые фай­лы.
  7. Dumpfiles — пла­гин для извле­чения кеширо­ван­ных фай­лов из обра­за памяти.
  8. Printkey — пла­гин для поис­ка зна­чений в ука­зан­ном раз­деле реес­тра Windows.
  9. Userassist — пла­гин для получе­ния информа­ции из клю­ча реес­тра UserAssist.
  10. Mftparser — этот пла­гин ска­ниру­ет записи глав­ной таб­лицы фай­лов (MFT) в памяти и выводит информа­цию о вре­мен­ных мет­ках фай­лов.
  11. Malfind — пла­гин для поис­ка скры­того или внед­ренно­го в память про­цес­сов кода.
  12. Timeliner — пла­гин для соз­дания вре­мен­ной шка­лы событий опе­раци­онной сис­темы из раз­личных арте­фак­тов памяти.
  13. Ldrmodules — пла­гин для поис­ка нес­вязан­ных биб­лиотек. 

ИССЛЕДОВАНИЕ ОБРАЗА ПАМЯТИ

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

python2.7 vol.py -f CYBERDEF-567078-20230213-171333.raw imageinfo

Про­филь для Volatility2 иссле­дуемой машины — WinXPSP2x86. Получим пер­вичную информа­цию о сис­теме, имя компь­юте­ра и сетевой адрес. Для это­го вос­поль­зуем­ся пла­гином Printkey, с помощью которо­го выведем дан­ные из клю­чей реес­тра.

python2.7 vol.py -f c79-BE/CYBERDEF-567078-20230213-171333.raw --profile=WinXPSP2x86 printkey -K 'ControlSet001\Control\ComputerName\ActiveComputerName'

Имя компь­юте­ра

Имя компь­юте­ра иссле­дуемой сис­темы — CYBERDEF-567078. Получим сетевой адрес, для это­го необ­ходимо опре­делить иден­тифика­торы сетевых интерфей­сов.

python2.7 vol.py -f /mnt/c/Users/DonNod/Downloads/c79-BE/CYBERDEF-567078-20230213-171333.raw --profile=WinXPSP2x86 printkey -K 'ControlSet001\Services\Tcpip\Parameters\Interfaces'

Иден­тифика­торы сетевых интерфей­сов

Те­перь про­верим каж­дый сетевой интерфейс и получим сетевые нас­трой­ки машины.

python2.7 vol.py -f c79-BE/CYBERDEF-567078-20230213-171333.raw --profile=WinXPSP2x86 printkey -K 'ControlSet001\Services\Tcpip\Parameters\Interfaces\{B35F0A5F-EBC3-4B5D-800D-7C1B64B30F14}'

IP-адрес сетево­го интерфей­са

Се­тевой адрес иссле­дуемой машины 192.168.8.195 выдан динами­чес­ки DHCP-сер­вером 192.168.8.1.

Прис­тупим к поис­ку вре­донос­ной активнос­ти. Нач­нем с ана­лиза про­цес­сов, для это­го вос­поль­зуем­ся пла­гина­ми pstree и pslist. Вывод работы пла­гинов сох­раним в фай­лы для удобс­тва даль­нейше­го иссле­дова­ния.

python2.7 vol.py -f c79-BE/CYBERDEF-567078-20230213-171333.raw --profile=WinXPSP2x86 pslist > pslist.txt

Спи­сок запущен­ных про­цес­сов

Ана­лизи­руя вывод пла­гина pslist, мож­но заметить, что на момент сня­тия обра­за памяти в сис­теме работа­ло 19 про­цес­сов. В стол­бце Exit ука­зано вре­мя завер­шения про­цес­сов, 6 про­цес­сов завер­шили свою работу.

Про­ана­лизи­руем про­цес­сы с помощью пла­гина pstree.

python2.7 vol.py -f c79-BE/CYBERDEF-567078-20230213-171333.raw --profile=WinXPSP2x86 pstree > pstree.txt

Вы­вод пла­гина pstree

Ана­лизи­руя дерево про­цес­сов, мож­но заметить про­цесс с инте­рес­ным име­нем rootkit.exe (иден­тифика­тор 964), а так­же про­цесс cmd.exe (иден­тифика­тор 1960), который явля­ется дочер­ним.

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

По­лучим спи­сок фай­лов в памяти, для это­го вос­поль­зуем­ся пла­гином filescan, сох­раним вывод в файл filescan.txt для даль­нейше­го поис­ка фай­лов.

python2.7 vol.py -f c79-BE/CYBERDEF-567078-20230213-171333.raw --profile=WinXPSP2x86 filescan > c79-BE/filescan.txt

По­иск исполня­емо­го фай­ла rootkit.exe в спис­ке фай­лов не дал резуль­татов. Поп­робу­ем пос­тро­ить вре­мен­ную шка­лу событий опе­раци­онной сис­темы и вос­ста­новим дей­ствия поль­зовате­ля. Для это­го вос­поль­зуем­ся пла­гином timeliner, вывод работы пла­гина сох­раним в файл timeline.txt.

python2.7 vol.py -fc79-BE/CYBERDEF-567078-20230213-171333.raw --profile=WinXPSP2x86 timeliner > c79-BE/timeline.txt

Для удобс­тва ана­лиза заг­рузим файл событий в Excel. Откро­ем прог­рамму MS Office Excel, перей­дем на вклад­ку «Дан­ные → Из тек­сто­вого фай­ла» и выберем файл timeline.txt. Далее отсорти­руем дан­ные по дате и прис­тупим к ана­лизу.

Вре­мен­ная шка­ла событий

13.02.2023 в 18:25:26 (UTC) соз­даны про­цес­сы rootkit.exe (иден­тифика­тор 964) и cmd.exe (иден­тифика­тор 1960). Поп­робу­ем выяс­нить, кто запус­тил файл rootkit.exe. Для это­го про­ана­лизи­руем ключ UserAssist реес­тра Windows. Дан­ный ключ пред­назна­чен для отсле­жива­ния выпол­няемых прог­рамм. Информа­ция пред­став­лена в дво­ичных зна­чени­ях и содер­жит дан­ные о при­ложе­ниях, запущен­ных опре­делен­ным поль­зовате­лем из про­вод­ника Windows.

python2.7 vol.py -f c79-BE/CYBERDEF-567078-20230213-171333.raw --profile=WinXPSP2x86 userassist

Вы­вод пла­гина UserAssist

Поль­зователь CyberDefenders запус­тил файл rootkit.exe. Про­дол­жим ана­лизи­ровать вре­мен­ную шка­лу событий.

Пос­ле запус­ка фай­ла rootkit.exe в сис­теме была соз­дана служ­ба HVKLZDZ. Най­дем парамет­ры служ­бы, для это­го выведем содер­жимое клю­ча реес­тра, исполь­зуя пла­гин printkey.

python2.7 vol.py -f c79-BE/CYBERDEF-567078-20230213-171333.raw --profile=WinXPSP2x86 printkey -K 'CONTROLSET001\SERVICES\HVKLKZDZ'

Па­рамет­ры служ­бы HVKLKZDZ

Служ­ба HVKLKZDZ запус­кает файл драй­вера suzmkbtuoyeki.sys. Выг­рузим этот файл и най­дем его вир­туаль­ный адрес в фай­ле filescan.txt, который был получен из вывода пла­гина filescan.

Ад­рес фай­ла драй­вера

С помощью пла­гина dumpfiles выг­рузим файл suzmkbtuoyeki.sys, ука­жем в качес­тве парамет­ра его адрес в памяти.

python2.7 vol.py -f c79-BE/CYBERDEF-567078-20230213-171333.raw --profile=WinXPSP2x86 dumpfiles -Q 0x000000000994af90 -D c79-BE/

MD5-сум­ма извле­чен­ного фай­ла — 3f35ed5fe80e2c1bf90af5ff3b6688ea, про­вер­ка на VirusTotal показа­ла, что файл — вре­донос.

По­лучим дату соз­дания это­го фай­ла, для чего вос­поль­зуем­ся пла­гином mftparser.

python2.7 vol.py -f c79-BE/CYBERDEF-567078-20230213-171333.raw --profile=WinXPSP2x86 mftparser > c79-BE/mftparser

Да­та соз­дания фай­ла драй­вера

В 18:25:26 (UTC) соз­дан файл драй­вера suzmkbtuoyeki.sys.

Про­дол­жаем ана­лизи­ровать про­цес­сы с помощью пла­гина malfind. Этот пла­гин помога­ет в поис­ке внед­ренно­го кода в про­цес­сах на осно­ве ана­лиза VAD-струк­тур и прав дос­тупа к стра­нице.

python2.7 vol.py -f c79-BE/CYBERDEF-567078-20230213-171333.raw --profile=WinXPSP2x86 malfind > c79-BE/malfind.txt

Вы­вод пла­гина malfind

В сег­менте памяти по адре­су 0x980000 про­цес­са svchost.exe (иден­тифика­тор 880) обна­ружен исполня­емый код, о чем сви­детель­ству­ет сиг­натура MZ. В этот про­цесс внед­рена DLL-биб­лиоте­ка. Най­дем ее.

Поп­робу­ем най­ти фай­лы, откры­тые в ука­зан­ном про­цес­се, для чего вос­поль­зуем­ся пла­гином handles.

python2.7 vol.py -f c79-BE/CYBERDEF-567078-20230213-171333.raw --profile=WinXPSP2x86 handles -t FILE -p 880 > c79-BE/handles_file.txt

Фай­ловый хендл про­цес­са svchost.exe

Ана­лиз хен­длов исполня­емо­го фай­ла показы­вает, что вре­донос обра­щал­ся к фай­лу драй­вера C:\WINDOWS\system32\drivers\str.sys. Поиск фай­ла str.sys в спис­ке фай­лов не дал резуль­татов.

По­лучим дамп внед­ренно­го учас­тка кода с сиг­натурой MZ и прос­каниру­ем анти­вирус­ными средс­тва­ми. Для это­го вос­поль­зуем­ся пла­гином malfind с аргу­мен­том -D.

python2.7 vol.py -f c79-BE/CYBERDEF-567078-20230213-171333.raw --profile=WinXPSP2x86 malfind -p 880 -D c79-BE/

MD5-сум­ма внед­ренной DLL-биб­лиоте­ки — 20020a9d850bd496954d8c21dfa614be, по информа­ции на VirusTotal этот модуль отно­сит­ся к семей­ству вре­доно­сов Rootkit.BlackEnergy.

Про­дол­жаем искать путь к внед­ренно­му DLL-фай­лу. Но для начала раз­берем­ся в методе детек­тирова­ния уда­лен­ного внед­рения DLL-биб­лиоте­ки в про­цесс.

Струк­тура PEB содер­жит све­дения о про­цес­се. В дан­ной струк­туре есть ука­затель _PEB_LDR_DATA, содер­жащий све­дения о заг­ружен­ных модулях для про­цес­са.

Струк­тура _PEB_LDR_DATA

Струк­тура _PEB_LDR_DATA име­ет ука­зате­ли на три двус­вязных спис­ка, в которых хра­нит­ся информа­ция о заг­ружен­ных DLL для это­го про­цес­са.

  • InLoadOrderModuleList — этот спи­сок отсле­жива­ет DLL в зависи­мос­ти от поряд­ка их заг­рузки в память про­цес­са. Исполня­емый файл про­цес­са заг­ружа­ется пер­вым при заг­рузке про­цес­са, чаще все­го это пер­вая запись.
  • InMemoryOrderModuleList — опре­деля­ет порядок, в котором модули появ­ляют­ся в вир­туаль­ной памяти про­цес­са.
  • InInitializationOrderModuleList — не вклю­чает запись для исполня­емо­го фай­ла про­цес­са (.exe), который обыч­но дос­тупен в осталь­ных спис­ках. При­чина кро­ется в том, что InInitializationOrder отсле­жива­ет DLL на осно­ве фун­кции dllmain. Пос­коль­ку исполня­емый файл про­цес­са не име­ет фун­кции dllmain, он заг­ружа­ется не так, как обыч­ная DLL.

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

python2.7 vol.py -f c79-BE/CYBERDEF-567078-20230213-171333.raw --profile=WinXPSP2x86 ldrmodules -p 880

Вы­вод пла­гина ldrmodules

Ана­лизи­руя вывод пла­гина ldrmodules, мож­но заметить имя DLL-фай­ла msxml3r.dll, который име­ет зна­чение False во всех трех спис­ках. Вре­донос­ный код отвя­зыва­ет внед­ренную биб­лиоте­ку от спис­ка _LDR_DATA_TABLE_ENTRY с целью ее сок­рытия.

На этом эта­пе мы вос­ста­нови­ли кар­тину взло­ма информа­цион­ного ресур­са орга­низа­ции. Поль­зователь CyberDefenders 13.02.2023 в 18:25:36 запус­тил файл rootkit.exe, который соз­дал служ­бу HVKLZDZ для запус­ка фай­ла драй­вера suzmkbtuoyeki.sys. Далее служ­ба успешно запус­тилась, и в про­цесс svchost.exe (иден­тифика­тор 880) была внед­рена динами­чес­кая биб­лиоте­ка msxml3r.dll, которая явля­ется основной наг­рузкой вре­доно­са BlackEnergy.

Ана­лизи­руя вре­мен­ную шка­лу событий пос­ле запус­ка фай­ла rootkit.exe, мы обна­ружи­ли откры­тие фай­лов Key.txt и flag.txt.txt. Вос­ста­новим их содер­жимое.

Вре­мен­ная шка­ла событий

В 18:28:25 (UTC) поль­зователь открыл файл Key.txt и поч­ти сра­зу сле­дом — flag.txt.txt. Вос­ста­новим эти фай­лы с помощью пла­гина dumpfiles и рас­шифру­ем содер­жимое фай­ла flag.txt.txt.

Со­дер­жимое фай­ла flag.txt.txt
Со­дер­жимое фай­ла Key.txt

Для написа­ния алго­рит­ма рас­шифров­ки вос­поль­зуем­ся сер­висом CyberChef. Крип­тогра­фичес­кий алго­ритм рас­шифров­ки — AES-256 в режиме ECB, ключ ука­зан в фай­ле Key.txt.

Ал­горитм рас­шифров­ки фай­ла

ВЫВОДЫ

Мы поп­ракти­кова­лись в иссле­дова­нии обра­за опе­ратив­ной памяти, вос­ста­нови­ли вре­мен­ную шка­лу событий и научи­лись детек­тировать уда­лен­ное внед­рение DLL-биб­лиоте­ки в про­цесс. Так­же мы обна­ружи­ли вре­донос­ную прог­рамму и вос­ста­нови­ли фай­лы из обра­за памяти. Подоб­ный метод ата­ки час­то исполь­зует­ся зло­умыш­ленни­ками, поэто­му опи­сан­ные в этой статье при­емы при­меня­ются на прак­тике при рас­сле­дова­нии киберин­циден­тов.

Читайте ещё больше платных статей бесплатно: https://t.me/hacker_frei



Report Page