Тот, кто занимается форензикой, знаком с тулзой Scalpel, но кроме острого скальпеля могут понадобится и другие инструменты для сбора и анализа системных событий. Таким инструментом является Plaso.
Еще по теме: Лучшие дистрибутивы для криминалистического анализа
Сегодня мы с вами посмотрим на пример использования очень эффективной утилиты, дружба с которой открывает криминалисту широкие возможности: позволяет взять след киберпреступника и описать его приключения в исследуемой системе. Даже если злоумышленник окажется осторожным и попытается замести за собой следы, далеко не всегда это поможет ему.
Сбор и анализ системных событий с помощью Plaso
Plaso — это инструмент форензики для анализа и извлечения временных интервалов (агрегации таймстапов).
Установка Plaso
Для установки Plaso не требуется особых навыков. Можно это сделать клонируя репозиторий или использовать pip.
1 2 |
$ sudo apt-install python3-pip $ pip install plaso elasticsearch |
Теперь установим все необходимые зависимости:
1 |
$ pip install -r requirements.txt |
В файле requirements.txt нет опциональных зависимостей. Исправляем это дело командой:
1 |
$ pip install chardet fakeredis mock |
Установка на Windows требует большей возни потому, что надо дополнительно установить в систему 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.
Примеры запуска:
1 |
py image_export.py disk1.dd |
Параметры --names, --extensions и --date-filter не должны вызвать у вас никаких труностей, рассмотрим подробнее только извлечение по сигнатурам.
1 |
py image_export.py --signatures list |
Данная команда выведет все описанные в data\signatures.conf сигнатуры, которые можно найти среди исследуемых файлов для извлечения. Разумеется, в конфиге записаны только базовые сигнатуры на все любой жизненный случай, но вы можете самостоятельно добавить в конфиг строку с необходимой для вас специфической сигнатурой файла, важно при этом — выбрать уникальный идентификатор.
Для извлечения всех файлов Windows PE с использованием готовой сигнатуры exe_mz:
1 |
py image_export.py --signatures exe_mz disk1.dd |
log2timeline — основной инструмент, с которого, собственно, двенадцать лет назад все и началось. Он используется для извлечения разных событий из файлов, каталогов (например, точек монтирования), устройства или его образа. В результате работы утилита формирует файл в формате Plaso, который в дальнейшем будет использоваться для анализа.
Вот как выглядит стандартный запуск:
1 |
py log2timeline.py --storage-file output_file disk1.dd |
Все виды файлов, из которых может быть извлечена полезная для формируемого таймлайна информация, находятся в каталоге test_data, а непосредственно сами парсеры размещены в каталоге plaso/parsers. Так что, если понадобится доработать либо разработать новый парсер для какого‑то особенного формата файла, вы знаете, где начинать копать!
Отдельно стоит отметить использование опции --process-archives. Она может сильно увеличить время работы утилиты, однако, как вы понимаете, в каком‑нибудь архиве может быть случайно обнаружена важная улика, забытая злоумышленником.
Замечательное свойство log2timeline — интеграция с правилами YARA. Чтобы добавить в результаты таймлайна сведения о срабатываниях правил YARA, необходимо запустить инструмент с ключом --yara_rules.
1 |
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. Лично я пользовался ей всего один раз, и то чисто из любопытства. Список опций небольшой. Однако как экспресс‑средство в каких‑то определенных ситуациях вполне может подойти.
Еще по теме: Особенности форензики в Windows 10
Использование Plaso
Теперь, когда примерно понятно, для чего козе все эти музыкальные инструменты, давайте попробуем их в деле.
Для начала запустим сбор логов:
1 |
py log2timeline.py --storage-file "d:\Work\!Статья\test_case_1.plaso" "d:\Work\!Статья\dd\disk1.dd" |
Если Plaso обнаружит теневые копии томов, то он радостно отрапортует о том, что готов выгрести все доступные события в том числе и из них. Соглашаемся со всеми его предложениями и идем пить пиво. Отведенное на это время зависит от ресурсов вашего компьютера и объема данных, которые поступили на вход.
Когда компрометация системы была давно и злодей долго в ней копошился, а в конце почистил за собой логи, из теневых копий иногда все равно можно вытащить много информации, даже без использования Sysmon.
По статистике, которая пару лет назад попалась мне на глаза, средний период нахождения злоумышленника в скомпрометированной системе составляет почти девять месяцев!
Именно поэтому злодеи очень любят при отходе запускать еще и криптолокер. Однако это в большинстве случаев далеко не так эффективно, как кажется на первый взгляд.
По окончании работы утилиты (в моем случае сбор логов занял примерно час) можно переходить к анализу.
Давайте запустим pinfo и посмотрим, что он скажет нам об исследуемом образе.
1 |
py pinfo.py -v d:\Work\!Статья\test_case_1.plaso |
Кроме параметров, с которыми выполнялся сбор данных из образа, мы видим список всех парсеров и плагинов, которые были применены. Если вдруг какого‑то типа событий в образе обнаружить не удалось, хотя вы уверены, что они там точно должны присутствовать, придется перезапустить log2timeline и принудительно указать интересующий вас парсер (такое, например бывает, если нужно собирать логи из системы в формате evt).
Также pinfo определил версию установленной ОС и ее хостнейм и вывел информацию о пользователях и путях к их домашним каталогам. Эта информация может быть полезна в случаях, если какой‑то домашний каталог хранится на удаленном сервере. Тогда придется дополнительно скармливать Plaso отдельно скопированную с сервера папку с пользовательским каталогом.
Итого за почти что час работы Plaso вытащил из образа 1 116 040 событий. Глядя на вывод pinfo, уже сейчас можно примерно предположить, сколько событий из какой категории нам предстоит проанализировать и какие модули для автоматического анализа дадут наиболее интересный результат.
Для сравнения давайте посмотрим на диаграмму событий, извлеченных из образа, в котором я затирал логи с помощью clearev. Как видите, Plaso смог извлечь всего на три тысячи меньше событий типа winevtx, и если посмотреть разницу в диаграммах, то станет понятно, что картина изменилась не сильно, свидетельств компрометации системы, вероятно, стало даже больше.
Давайте запустим psort и попробуем поработать с результатами его анализа безо всяких расширений.
1 |
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:
1 |
$ 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.
1 |
$ 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.
1 |
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.