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