Хакер - Уроки форензики. Ищем неизвестный вредонос и восстанавливаем данные из памяти
hacker_freirayhunt454
Содержание статьи
- Используемые плагины Volatility2 для извлечения данных
- Исследование образа памяти
- Выводы
Нередко злоумышленники атакуют компьютеры с использованием неустановленных вредоносных программ, и все, что остается после такого инцидента у специалистов по кибербезопасности, — дамп памяти скомпрометированной машины. Нужно извлечь оттуда файл вредоноса, идентифицировать его и восстановить хронологию атаки.
В этой статье мы проведем расследование подобного инцидента на примере лабораторной работы BlackEnergy с ресурса CyberDefenders. Мы научимся извлекать основные артефакты из образа оперативной памяти Windows и восстановим процесс атаки.
Согласно сценарию, крупная корпорация подверглась кибератаке, которая привела к краже конфиденциальных данных. Атака была проведена с использованием ранее не встречавшейся разновидности вредоноса BlackEnergy v2. Группа реагирования на инциденты сделала дамп памяти скомпрометированного компьютера для дальнейшего изучения. Наша задача — провести расследование и разобраться, что все‑таки произошло.
По результатам решения кейса необходимо ответить на ряд вопросов, но я покажу только само решение. Ты сможешь повторить весь процесс самостоятельно, чтобы лучше разобраться и закрепить материал.
Для начала загрузим файл архива с артефактами и приступим к его исследованию.
Для анализа памяти воспользуемся утилитой Volatility Framework 2.6.1 — этот инструмент написан на Python версии 2 и предназначен для извлечения артефактов из образцов энергозависимой памяти.
ИСПОЛЬЗУЕМЫЕ ПЛАГИНЫ VOLATILITY2 ДЛЯ ИЗВЛЕЧЕНИЯ ДАННЫХ
- Imageinfo — плагин для определения операционной системы, пакета обновлений и аппаратной архитектуры исследуемого образа.
- Pstree — плагин для просмотра списка процессов в виде дерева.
- Handles — плагин для просмотра открытых дескрипторов к файлам, разделам реестра, мьютексам, именованным каналам, событиям в процессах. Также можно отобразить дексрипторы для конкретного процесса или отфильтровав их по конкретному типу объекта.
- Consoles — плагин для поиска команд, которые злоумышленники ввели в
cmd.exe
. Основным преимуществом этого плагина является то, что он не только выводит команды, введенные злоумышленниками, но и собирает весь экранный буфер (ввод и вывод). - Memdump — плагин для извлечения всех резидентных страниц памяти в процессе.
- Filescan — плагин для поиска объектов
FILE_OBJECT
в памяти с помощью сканирования тегов пула. Данный плагин найдет все открытые файлы. - Dumpfiles — плагин для извлечения кешированных файлов из образа памяти.
- Printkey — плагин для поиска значений в указанном разделе реестра Windows.
- Userassist — плагин для получения информации из ключа реестра UserAssist.
- Mftparser — этот плагин сканирует записи главной таблицы файлов (MFT) в памяти и выводит информацию о временных метках файлов.
- Malfind — плагин для поиска скрытого или внедренного в память процессов кода.
- Timeliner — плагин для создания временной шкалы событий операционной системы из различных артефактов памяти.
- 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}'
Сетевой адрес исследуемой машины 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
Анализируя дерево процессов, можно заметить процесс с интересным именем 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
Пользователь 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
запускает файл драйвера 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
В сегменте памяти по адресу 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
Анализ хендлов исполняемого файла показывает, что вредонос обращался к файлу драйвера 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
имеет указатели на три двусвязных списка, в которых хранится информация о загруженных 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, можно заметить имя 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
.
Для написания алгоритма расшифровки воспользуемся сервисом CyberChef. Криптографический алгоритм расшифровки — AES-256 в режиме ECB, ключ указан в файле Key.txt
.
ВЫВОДЫ
Мы попрактиковались в исследовании образа оперативной памяти, восстановили временную шкалу событий и научились детектировать удаленное внедрение DLL-библиотеки в процесс. Также мы обнаружили вредоносную программу и восстановили файлы из образа памяти. Подобный метод атаки часто используется злоумышленниками, поэтому описанные в этой статье приемы применяются на практике при расследовании киберинцидентов.
Читайте ещё больше платных статей бесплатно: https://t.me/hacker_frei