Хакер - Таймлайн всего. Используем Plaso для сбора системных событий

Хакер - Таймлайн всего. Используем Plaso для сбора системных событий

hacker_frei

https://t.me/hacker_frei

sUzU

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

  • Создание событий
  • Plaso
  • Установка
  • Набор инструментов
  • Использование
  • Заключение

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

СОЗДАНИЕ СОБЫТИЙ

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

INFO

Все опи­сан­ные экспе­римен­ты я про­вожу на VMware Workstation 14 Pro. Соот­ветс­твен­но, зависи­мые от гипер­визора коман­ды в статье при­веде­ны для нее.

Для под­готов­ки тес­товых событий нам понадо­бит­ся две вир­туаль­ные машины: на одной будет работать Windows 10, на вто­рой — Kali Linux 2021.2. Если будешь собирать тес­товую сре­ду самос­тоятель­но, рекомен­дую не делать боль­шой диск для вин­ды, хва­тит и 40 Гбайт — потом все про­цес­сы будут про­текать быс­трее. Плюс для боль­шей наг­ляднос­ти при ана­лизе рекомен­дую уста­новить на подопыт­ную машину Sysmon. Про эту ути­литу в руб­рике «Админ» была статья «Sysmon для безопас­ника». Ког­да мы пой­дем по сле­дам зло­умыш­ленни­ка, ты пой­мешь, в чем цен­ность этой ути­литы.

Опи­сывать зараже­ние и пос­тэкс­плу­ата­цию сис­темы не буду, что­бы в даль­нейшем нам было инте­рес­нее добывать из обра­за ули­ки. Все рав­но, если ты вни­матель­но чита­ешь статьи из руб­рики «Взлом», ничего нового я тебе не рас­ска­жу.

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

INFO

Де­лать имен­но так, как опи­сано ниже, необя­затель­но. В статье я при­вожу общий под­ход для всех подоб­ных ситу­аций, в том чис­ле на реаль­ном железе. Инс­тру­мент Plaso, которым мы будем поль­зовать­ся, успешно ску­шает и образ от вир­туал­ки, если он у тебя хра­нит­ся одним фай­лом .vmdk.

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

Вык­лючим обе вир­туал­ки, под­кинем в Kali вто­рым жес­тким дис­ком вир­туаль­ный диск от Windows и нас­тро­им для Kali Shared Folder на жес­тком дис­ке тво­его хос­тового ком­па, где будет дос­таточ­но сво­бод­ного мес­та, что­бы сде­лать побай­товую копию дис­ка вин­ды. Если ты выделил на нее 40 Гбайт, то на дис­ке дол­жно быть минимум столь­ко же сво­бод­ного мес­та.

Заг­рузим­ся в Kali, соз­дадим точ­ку мон­тирова­ния и под­монти­руем Shared Folder:

$ sudo mkdir /mnt/hgfs

$ sudo /usr/bin/vmhgfs-fuse .host:/ /mnt/hgfs -o subtype=vmhgfs-fuse,allow_other

На­ходим инте­ресу­ющий нас жес­ткий диск:

$ sudo fdisk -l

В нашем слу­чае это sda. Запус­каем соз­дание побай­товой копии:

$ sudo dd if=/dev/sda of=/mnt/hgfs/dd/disk1.dd bs=8M

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

PLASO

Plaso (рекур­сивный акро­ним от исланд­ско­го Plaso Langar Að Safna Öllu, или для тех, кто не очень понима­ет исланд­ский, «Plaso хочет соб­рать все») — инс­тру­мент, раз­работан­ный на Python, основная задача которо­го — пос­тро­ить супер­тай­млайн‑все­го‑воз­можно­го‑что‑про­исхо­дило‑в-сис­теме и вып­люнуть все это в один гигабай­тный CSV.

Ре­лиз 1.0.0 сос­тоял­ся 5 декаб­ря 2012 года, хотя если смот­реть глуб­же, на ути­литу log2timeline, написан­ную на Perl, то пер­вое упо­мина­ние на Forensics Wiki датиру­ется аж 28 августа 2009-го. В те вре­мена некото­рые нынеш­ние компь­ютер­ные хулига­ны еще толь­ко начали посещать час­тные дет­ские дош­коль­ные учрежде­ния, в которых им, к сожале­нию, ничего про уго­лов­ный кодекс не рас­ска­зыва­ли.

Установка

Для уста­нов­ки Plaso (на момент написа­ния статьи акту­аль­ный релиз 20210606) осо­бых скил­лов не тре­бует­ся, на Linux так и вооб­ще все, что тебе нуж­но, — тер­минал и дос­туп в интернет. На слу­чай, если тебе захочет­ся покопать­ся в исходни­ках, кло­нируй ре­пози­торий, если не захочет­ся — исполь­зуй pip.

$ sudo apt-install python3-pip

$ pip install plaso elasticsearch

Да­лее уста­нав­лива­ем все тре­буемые зависи­мос­ти:

$ pip install -r requirements.txt

В фай­ле requirements.txt отсутс­тву­ют опци­ональ­ные зависи­мос­ти chardet, fakeredis и mock, поэто­му еще одна коман­да, и все успешно заведет­ся:

$ pip install chardet fakeredis mock

На вин­де дела обсто­ят пос­ложнее толь­ко лишь из‑за того, что тебе при­дет­ся доус­тановить в сис­тему Build Tools for Visual Studio. Но проб­лема реша­ется эле­мен­тарно, если у тебя есть в загаш­нике уста­новоч­ный пакет Visual Studio 2017 (имен­но с ним у меня все получи­лось). Запус­ти уста­нов­ку и выбери в раз­деле Individual components ком­понент VC++ 2015.3 v14.00 (v140) toolset for desktop. Пос­ле это­го все зависи­мос­ти уста­новят­ся через pip.

Набор инструментов

В сос­тав Plaso вхо­дит нес­коль­ко ути­лит, они находят­ся в катало­ге tools.

image_export — ути­лита для извле­чения из устрой­ства или его обра­за фай­лов по раз­личным кри­тери­ям: начиная c рас­ширения и путей, закан­чивая сиг­натура­ми и вре­менем соз­дания или модифи­кации. Кро­ме того, дан­ный инс­тру­мент пос­ле извле­чения фай­лов сге­нери­рует файл hashes.json, в который попадут хеш‑зна­чения всех извле­чен­ных фай­лов для даль­нейшей про­вер­ки, нап­ример на VirusTotal.

При­меры запус­ка:

py image_export.py disk1.dd

Па­рамет­ры --names--extensions и --date-filter не дол­жны выз­вать у тебя никаких воп­росов, рас­смот­рим под­робнее толь­ко извле­чение по сиг­натурам.

py image_export.py --signatures list

Эта коман­да выведет все опи­сан­ные в data\signatures.conf сиг­натуры, которые мож­но поис­кать сре­ди иссле­дуемых фай­лов для извле­чения. Понят­ное дело, в кон­фиге записа­ны толь­ко базовые сиг­натуры на все слу­чаи жиз­ни, но ник­то не меша­ет самос­тоятель­но добавить в кон­фиг стро­ку с необ­ходимой тебе спе­цифи­чес­кой сиг­натурой фай­ла, глав­ное при этом — выб­рать уни­каль­ный иден­тифика­тор.

Нап­ример, извлечь все фай­лы Windows PE мож­но с исполь­зовани­ем готовой сиг­натуры exe_mz:

py image_export.py --signatures exe_mz disk1.dd

log2timeline — основной инс­тру­мент, с которо­го, собс­твен­но, две­над­цать лет назад все и началось. Он исполь­зует­ся для извле­чения раз­ных событий из фай­лов, катало­гов (нап­ример, точек мон­тирова­ния), устрой­ства или его обра­за. В резуль­тате работы ути­лита фор­миру­ет файл в фор­мате Plaso, в даль­нейшем он и будет исполь­зовать­ся для ана­лиза.

Вот как выг­лядит стан­дар­тный запуск:

py log2timeline.py --storage-file output_file disk1.dd

Все виды фай­лов, из которых может быть извле­чена полез­ная для фор­миру­емо­го тай­млай­на информа­ция, находят­ся в катало­ге test_data, а непос­редс­твен­но сами пар­серы раз­мещены в катало­ге plaso/parsers. Так что, если понадо­бит­ся дорабо­тать либо раз­работать новый пар­сер для какого‑то осо­бен­ного фор­мата фай­ла, ты зна­ешь, где начинать копать! 
От­дель­но сто­ит отме­тить исполь­зование опции --process-archives. Она может силь­но уве­личить вре­мя работы ути­литы, одна­ко, как ты понима­ешь, в каком‑нибудь архи­ве может быть слу­чай­но обна­руже­на важ­ная ули­ка, забытая зло­умыш­ленни­ком.

За­меча­тель­ное свой­ство log2timeline — интегра­ция с пра­вила­ми YARA. Что­бы добавить в резуль­таты тай­млай­на све­дения о сра­баты­вани­ях пра­вил YARA, необ­ходимо запус­тить инс­тру­мент с клю­чом --yara_rules.

py log2timeline.py --storage-file output_file --process-archives --yara_rules rules.yar disk1.dd

где rules.yar — пред­варитель­но под­готов­ленный тобой файл с пра­вила­ми YARA.

Ес­ли пред­варитель­но добыть опен­сор­сные пра­вила (к при­меру, от Clam AV) и скон­верти­ровать их в фор­мат YARA, то в ито­ге из незамыс­ловатой ути­литы log2timeline начина­ет прев­ращать­ся в мощ­ный инс­тру­мент.

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

При ана­лизе быва­ет полез­на опция -v, которая допол­нитель­но выведет под­робную информа­цию об име­ни компь­юте­ра, точ­ную вер­сию ОС и информа­цию о поль­зовате­лях.

psort — ути­лита, которая поз­волит выпол­нить допол­нитель­ную обра­бот­ку и скон­верти­ровать получен­ный ранее файл Plaso в фор­мат, в котором будет вес­тись его даль­нейший ана­лиз. При его запус­ке не забывай исполь­зовать опцию --output-time-zone для того, что­бы потом в ходе ана­лиза к вре­мен­ным мет­кам (которые по умол­чанию в UTC) не при­бав­лять нуж­ный тебе часовой пояс.

За­пус­кая ути­литу с опци­ей --analysis plugin и на осно­вании обра­ботан­ных событий ты получишь высоко­уров­невую информа­цию от пла­гина, нап­ример о наличии сре­ди всех иссле­дуемых фай­лов вре­доно­сов, ког­да‑либо заг­ружен­ных на VirusTotal. При­чем запус­кать этот пла­гин мож­но без бояз­ни слить в обла­ко какую‑то чувс­тви­тель­ную для заказ­чика информа­цию, пос­коль­ку про­вер­ка идет исклю­читель­но по хеш‑зна­чени­ям, пос­читан­ным на эта­пе сбо­ра дан­ных. Понят­но, что для работы с этим пла­гином пот­ребу­ется API-ключ от сер­виса. Так­же есть под­дер­жка работы с фрей­мвор­ком Viper, в котором у тебя могут быть собс­твен­ные накоп­ления мал­вари.

Оп­ции --slice и --filter поз­воля­ют выб­рать опре­делен­ные события в диапа­зоне нес­коль­ких минут от момен­та инте­ресу­юще­го тебя события, одна­ко их под­робно рас­смат­ривать в этой статье не будем.

Кон­верти­ровать события мож­но в раз­ные фор­маты, в том чис­ле в CSV, XLSX и JSON, для выбора фор­мата исполь­зуй опцию -o.

psteal — ути­лита, объ­еди­няющая в себе фун­кции log2timeline и psort. Лич­но я поль­зовал­ся ей все­го один раз, и то чис­то из любопытс­тва. Спи­сок опций неболь­шой. Одна­ко как экс­пресс‑средс­тво в каких‑то опре­делен­ных ситу­ациях впол­не может подой­ти.

Использование

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

Для начала запус­тим сбор логов:

py log2timeline.py --storage-file "d:\Work\!Статья\test_case_1.plaso" "d:\Work\!Статья\dd\disk1.dd"

Ес­ли Plaso обна­ружит теневые копии томов, то он радос­тно отра­пор­тует о том, что готов выг­рести все дос­тупные события в том чис­ле и из них. Сог­лаша­емся со все­ми его пред­ложени­ями и идем пить кофе и читать «Хакер». Отве­ден­ное на это вре­мя зависит от ресур­сов тво­его ком­па и объ­ема дан­ных, которые пос­тупили на вход.

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

INFO

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

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

По окон­чании работы ути­литы (в моем слу­чае сбор логов занял при­мер­но час) мож­но перехо­дить к ана­лизу.

Да­вай запус­тим pinfo и пос­мотрим, что он ска­жет нам об иссле­дуемом обра­зе.

py pinfo.py -v d:\Work\!Статья\test_case_1.plaso

Кро­ме парамет­ров, с которы­ми выпол­нялся сбор дан­ных из обра­за, мы видим спи­сок всех пар­серов и пла­гинов, которые были при­мене­ны. Если вдруг какого‑то типа событий в обра­зе обна­ружить не уда­лось, хотя ты уве­рен, что они там точ­но дол­жны при­сутс­тво­вать, при­дет­ся переза­пус­тить log2timeline и при­нуди­тель­но ука­зать инте­ресу­ющий тебя пар­сер (такое, нап­ример, быва­ет, если нуж­но собирать логи из сис­темы в фор­мате evt).

Так­же pinfo опре­делил вер­сию уста­нов­ленной ОС и ее хос­тнейм и вывел информа­цию о поль­зовате­лях и путях к их домаш­ним катало­гам. Эта информа­ция может быть полез­на в слу­чаях, если какой‑то домаш­ний каталог хра­нит­ся на уда­лен­ном сер­вере. Тог­да при­дет­ся допол­нитель­но скар­мли­вать Plaso отдель­но ско­пиро­ван­ную с сер­вера пап­ку с поль­зователь­ским катало­гом.

Ито­го за поч­ти что час работы Plaso вытащил из обра­за 1 116 040 событий. Гля­дя на вывод pinfo, уже сей­час мож­но при­мер­но пред­положить, сколь­ко событий из какой катего­рии нам пред­сто­ит про­ана­лизи­ровать и какие модули для авто­мати­чес­кого ана­лиза дадут наибо­лее инте­рес­ный резуль­тат.

Для срав­нения давай пос­мотрим на диаг­рамму событий, извле­чен­ных из обра­за, в котором я затирал логи с помощью clearev. Как видишь, Plaso смог извлечь все­го на три тысячи мень­ше событий типа winevtx, и если пос­мотреть раз­ницу в диаг­раммах, то ста­нет понят­но, что кар­тина изме­нилась несиль­но, сви­детель­ств ком­про­мета­ции сис­темы, веро­ятно, ста­ло даже боль­ше.

Да­вай запус­тим psort и поп­робу­ем порабо­тать с резуль­татами его ана­лиза безо вся­ких рас­ширений.

py psort.py --output-time-zone Europe/Moscow --output-format l2tcsv -w d:\Work\!Статья\test_case_1.csv d:\Work\\!Статья\test_case_1.plaso

Один взгляд на CSV объ­емом более 300 Мбайт вызыва­ет у неис­кушен­ного зри­теля смер­тель­ную тос­ку. Давай пока нем­ного поп­рокрас­тиниру­ем и пос­мотрим, что еще мож­но сде­лать, преж­де чем встав­лять себе спич­ки в гла­за.

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

$ py image_export.py --date-filter "atime,2021-08-25 09:00:00,2021-08-25 18:30:00" --signatures exe_mz -w d:\Work\!Статья\extracted d:\Work\!Статья\dd\disk1.dd

Вне­зап­но в катало­ге Downloads поль­зовате­ля обна­ружи­вает­ся исполня­емый файл с край­не подоз­ритель­ным наз­вани­ем free_bitcoins_from_Musk.exe. Давай нач­нем поис­ки в нашем тай­млай­не имен­но с это­го события. Вос­поль­зуем­ся grep.

$ grep free_bitc test_case_1.csv > free_bitc.csv

Так уже нам­ного луч­ше. Я поз­волил из получен­ного вывода в 55 событий отоб­рать шесть наибо­лее любопыт­ных.

В спис­ке событий перед нами вид­но, что поль­зователь в 16:07:44 с помощью бра­узе­ра Edge дей­стви­тель­но ска­чал подоз­ритель­ный бинарь и спус­тя пару мгно­вений запус­тил его. Сле­дующим событи­ем мы наб­люда­ем уста­нов­ление сетево­го соеди­нения от запущен­ного про­цес­са на уда­лен­ный адрес 192.168.79.131:7788. И бук­валь­но через 30 секунд видим вза­имо­дей­ствие при­ложе­ния с про­цес­сом vmtoolsd.exe.

Та­кая пос­ледова­тель­ность событий очень харак­терна и сви­детель­ству­ет о том, что запущен­ный в кон­тек­сте про­цес­са Meterpreter успешно переко­чевал в кон­текст про­цес­са допол­нений гос­тевой ОС. Пос­ледняя запись на скри­не сви­детель­ству­ет о том, что в 17:08:59 при оче­ред­ной попыт­ке вхо­да в сис­тему шелл был заново запущен. То есть, пока поль­зователь не заподоз­рил что‑то нелад­ное, наш зло­дей успел зак­репить­ся в сис­теме одним из извес­тных ему спо­собов.

Для инте­реса ищем инте­ресу­ющие нас шесть событий в тай­млай­не с «затер­тыми сле­дами» и вне­зап­но обна­ружи­ваем, что все шесть из шес­ти событий ока­зались на мес­те. It’s a trap!

Как минимум мы получи­ли внят­ные вре­мен­ные отрезки, в которые шло про­ник­новение в сис­тему, и можем теперь отоб­рать события за этот пери­од.

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

py psort.py --output-time-zone Europe/Moscow --output-format dynamic -w d:\Work\!Статья\test_case_1_attack_time.csv -q d:\Work\\!Статья\test_case_1.plaso "date < '2021-08-25 14:20:00' and date > '2021-08-25 13:07:00'"

Ждем пару минут и смот­рим на резуль­тат.

Неп­лохо, мы сумели умень­шить физичес­кий объ­ем в 16 раз, а смыс­ловой в 20 раз (57 тысяч событий про­тив 1,1 мил­лиона).

Да­вай нем­ного пос­крол­лим этот файл.

На­чиная при­мер­но с записи под номером 1500 и до 30 000 мы наб­люда­ем одни и те же события. Такая кар­тина сви­детель­ству­ет о том, что наш про­тив­ник с исполь­зовани­ем авто­мати­чес­кого инс­тру­мен­та обхо­дил содер­жимое дис­ка в поис­ках чего‑то его инте­ресу­юще­го (под­сказ­ка: фай­лов с подс­тро­кой passw). Понимая при­роду этих событий, их мож­но скрыть из ана­лиза, тем самым сни­зив наг­рузку на себя любимо­го еще раза в два.

Даль­нейший ана­лиз сво­дит­ся к филь­тра­ции событий по катего­риям и вни­матель­ному ана­лизу их в цепоч­ках. В качес­тве домаш­него задания можешь поиг­рать­ся с пла­гином tagging для psort.

ЗАКЛЮЧЕНИЕ

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

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

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


Report Page