kbook


Project maintained by atilla777 Hosted on GitHub Pages — Theme by mattgraham
Главная страница
Информационная безопасность

Исследование памяти с помощью volatility framework

Общие сведения о памяти Windows

Windows, в основном, написана на языке программирования С.

В данном языке (соответственно и в памяти Windows) имеется такой тип данных как структура (тип данных, объединяющий несколько полей определённого типа (integer, boolean и т.п.). Из структур создаются конкретные объекты (в т.ч. процессы, дескрипторы файлов, сокеты и т.п.).

Таким образом задача исследования дампа памяти Windows сводится к поиску указанных выше структур и изучению их свойств (например, таких свойств как название запущенного процесса, время его запуска и т.п.).

Структура _KPRCB (Processor Region Control Block) содержит адреса текущего активного потока, следующего запланированного потока и простаивающего потока. Виртуальной адрес этой структуры в ОС известен.

Каждый поток представлен объектом структуры _ETHREAD, который в свою очередь содержит объект структуры _KTHREAD.

_KTHREAD содержит ссылку на процесс (объект структуры _EPROCESS), к которому относится этот поток.

Как сказано выше каждый процесс представлен объектом структуры _EPROCESS.

Структуры _EPROCESS хранятся в невыгружаемом пуле памяти.

В каждом объекте структуры _EPROCESS имеется поле ActiveProcessLinks с указателем на структуру _LIST_ENTRY из двух элементов с ссылками на предыдущий и следующий процессы (предыдущий _EPROCESS и следующий _EPROCESS).

То есть последовательность _EPROCESS образуют двусвязный список.

Ссылка на первый (головной) элемент двусвязного списка (это первый процесс – system) содержится в символе (переменной) PsActiveProcessHead.

Символы (символы отладки) это текстовое обозначение (облегчает читаемость отладочной информации) адресов входов функций, переменных и т.п.

Информация о PsActiveProcessHead содержится в KDBG – структуре ядра Windows с отладочной информацией.

Каждый процесс имеет:

Артефакты (структуры в памяти), связанные с процессами

Методы поиска объектов в памяти

В общем поиск каких либо объектов в памяти (процессов и т.п.) можно выполнить следующими способами:

Общие сведения о volatility

Volatility может работать с:

Функциональность volatility строится на плагинах – по это сути команды, которые позволяют получить из дампа те или иные сведения (в составе volatility таких плагинов около 200).

Основные понятия

Установка volatility на Windows

Если, к примеру, установить т.н. Windows Standalone Executable пакет volatility, например с сайта volatility или через менеджер пакетов chocolatey, то в такой версии volatility может не оказаться профилей с последними версиями Windows.

Поэтому лучше выполнить установку следующим образом.

Установить python 2.7

Установить python можно через chocolatey или через обычный инсталлятор.

Установить зависимости

Установить последнюю версию volatility

git clone https://github.com/volatilityfoundation/volatility.git
cd volatility

На этом установка закончена и перейдя в папку с volatility можно запускать этот фреймворк скриптом vol.py.

Создание дампа памяти для исследования с помощью volatility

Dumpit

Дамп проще всего создать с помощью программы dumpit из пакета Comae-Toolkit. Скачать этот пакет можно с следующей страницы comae(требуется регистрация).

Для создания дампа памяти достаточно запустить файл dumpite.exe.

Дамп сохранится в текущей директории.

На диске должно быть столько свободного места, какой размер ОЗУ.

Для указания профиля ОС в volatility, нужно узнать версию исследуемой ОС и ее билд.

winver

Эту информацию можно записать в имени файла дампа.

Удаленный дамп с помощью dumpite

Запуск сервера

dumpite.exe /l /f дамп.raw

Передача данных на сервер

dumpit.exe /t сервер /s 1 /rc4 ключ

Опция сервер это IP-адрес сервера

Дешифровка дампа на сервере

dumpit.exe  /rc4 ключ /unpack зашифрованный.raw расшифрованный.raw

Winpmem Opensource утилита для снятия дампа (часть проекта rekall) winpmem

Winpmem сохраняет несколько потоков информации в контейнере (формат AFF4 - архив файлов (может быть сжатым или нет), данный формат читается с помощью recall).

В этих потоках, помимо дампа всей памяти, имеется метаинформация, данные отдельных драйверов и т.п. Соответственно с дампом памяти в контейнере winpmem volatility (который, как сказано выше, содержит не только дамп памяти) напрямую не может работать.

Что бы volatility прочитал дамп, созданный winpmem нужно сохранить результат работы данной утилиты в «сыром» (raw) формате и указать папку в которую производится сохранение:

winpmem --format raw  -o папка\

или

winpmem --format raw  -o фай.zip

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

Для тех утилит анализа дампа, которые могут напрямую работать с форматом AFF4 дамп памяти можно создать так

winpmem_1.3.exe -o дамп.raw

Подбор профиля ОС для volatility

Перед началом исследования дампа памяти в volatility, нужно подобрать подходящий профиль операционной системы.

Перечень поддерживаемых volatility профилей

python.exe vol.py --info

Профиль - это запись вида Win10x64_17763.

В списке необходимо найти подходящий профиль и проверить что он работает. Самый простой способ проверки выполнить команду

python.exe vol.py -f дамп.dmp --profile=профиль pstree

Узнать из дампа какой профиль необходимо использовать (работает очень медленно)

На запущенной исследуемой машине По метаинформации о дампе памяти

python.exe vol.py -f дамп --imageinfo

По информации отладчика в ядре (работает очень медленно)

python.exe vol.py -f дамп --kdbgscan

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

Исследование вредоносного кода с помощью volatility

В общем случае с помощью volatility следует выполнить:

Подсказка по командам (плагинам) доступна следующим образом

python.exe vol.py -h

Справка по опциям плагина

python.exe vol.py плагин --help

Сохранение результата в файле

python.exe vol.py -f дамп --profile=профиль плагин > файл

или (может вывести результат не только в текстовом формате)

python.exe vol.py -f дамп --profile=профиль плагин --output-file=файл

Анализ процессов в дампе

Методика исследования процессов

  1. Необходимо исключить из рассмотрения известные легитимные [процессы] (https://securitybytes.io/blue-team-fundamentals-part-two-windows-processes-759fe15965e2).

При этом надо учитывать возможность маскировки нелегитимных процессов под легитимные.

Для этого надо знать названия таких процессов, стандартное расположение их исполняемых файлов, порядок запуска этих процессов при старте ОС, и кто из них для кого является родителем/потомком.

  1. Необходим просмотреть на места расположения файлов программ, которые породили процессы.
  2. Надо обращать внимание на процессы, которых не должно быть, например, на процессы с расширениями отличными от .exe.

Перечень основных (критичных) процессов ОС Windows

Плагины для анализа процессов

pslist

Перечень процессов извлекается из двусвязного списка на первый элемент которого указывает символ PsActiveProcessHead.

Этот плагин не позволяют обнаружить завершённые и скрытые процессы (скрытые с помощью техники direct kernel object manipulation - DKOM) так как производят поиск в двусвязном списке процессов.

В выводе pslist Offset (V) это смещение виртуального (V) адрес объекта (структуры) _EPROCESS ядра.

Это смещение необходимо для указания в качестве параметра некоторых других плагинов volatility (когда такой плагин должен выдавать информацию о конкретном процессе). :

Начиная с Windows XP и 2003 сессия 0 изолирована от пользовательских сессий (то есть в современных ОС всегда будет 0 сессия и по сессии на каждого работающего в системе пользователя)

python vol.py -f дамп --profile=профиль pslist

pstree

Аналогичен pslist, но графически (отступами и точками) отображает связь родительских

psscan

Сканирует дамп и ищет в ней объекты_EPROCESS (может выявить скрытые процессы).

python vol.py -f дамп --profile=профиль psscan

Графическое представление дерева процессов

python vol.py -f дамп --profile=профиль --output=dot --output-file=результат.dot

Просмотреть вывод в формате .dot можно с помощью программы Graphviz.

Сравнение информации о процессах в различных плагинах

Плагин psxview позволяет сопоставить результаты работы плагинов, показывающих информацию о процессах.

Опция –apply-rules выводит Ok если отсутствие процесс не найденного каким-либо плагином является нормальным в силу особенностей данного процесса (например, если он и не должен присутствовать в структуре, которую исследует)

Список загруженных процессом DLL

Этот плагин получает список DLL из двусвязанного списка (структура _LDR_DATA_TABLE_ENTRY) на который указывает InLoadOrderModuleList из PEB. ``cmd python vol.py -f дамп –profile=профиль dlllist –pid=PID

или, для скрытых процессов (вывод psscan)
```cmd
python vol.py -f дамп --profile=профиль dlllist --offset=смещение (P)

Выгрузка DLL процесса

python vol.py -f --profile=профиль dlllist --offset=смещение (P)

Перечень дескрипторов указанного типа для конкретного процесса

python vol.py -f дамп --profile=профиль handles --pid=PID --object-type=тип

Типы дескрипторов: *Process *Thread, *Key *Event *File *Mutant *Token *Port

Список команд CMD

Плагин получает информацию из структуры COMMAND_HISTORY.

python vol.py psscan -f дамп --profile=профиль cmdscan

Если в исследуемом ОС в настройках консоли был изменен максимальный размер истории команд данному плагину надо сообщить соответствующий параметр. Плагином consoles, который получает информацию из структуры CONSOLE_INFORMATION, можно узнать не только выполняемые команды, но и их результат.

python vol.py -f дамп --profile=профиль consoles

Перечень dll процесса

python vol.py -f дамп --profile=профиль dlllist --pid=PID

Перечень содержимого переменных окружения

python vol.py -f дамп --profile=профиль envars

Проверка того, является процесс подозрительным или нет

Плагин ищет скрытые, инжектированные процессы в пользовательской области памяти.

python vol.py -f дамп --profile=профиль malfind -p PID

Выявление Hollowing процессов

Hollowing – это метод инжекции кода при котором в копия процесса приостанавливается и в не меняется исполняемый код, затем процесс возобновляется.

Плагин сравнивает VAD и PEB блоки процесса -

VAD и PEB содержат информацию о памяти процесса.

python vol.py psscan -f дамп --profile=профиль hollowfind

Сопоставление процессов и их идентификаторов безопасности (SID)

python vol.py -f дамп --profile=профиль getsids

Сопоставление процессов и выданных им привилегий

python vol.py -f дамп --profile=профиль privs

Опция –silent отображает только те привилегии, которые не были у процесса по умолчанию.

Сопоставление процессов и импортированных ими функций

python vol.py -f дамп --profile=профиль enumfunc

Извлечение процессов из дампа

python vol.py -f дамп --profile=профиль procdump --dump-dir=папка –p PID

Перечень сервисов

python.exe vol.py -f дамп.dmp --profile=профиль svcscan

Перечень сетевых соединений

python.exe vol.py -f дамп.dmp --profile=профиль netscan

Для разных версий Windows для получения этой информации надо использовать разные плагины - см. справку по командам.

Ветки реестра

python vol.py -f дамп --profile=профиль hivelist

Дамп (содержимое) ветки реестра

python vol.py -f дамп --profile=профиль printkey -K "ветка"
python vol.py -f дамп --profile=профиль hivedump --offset-hive смещение (V)

Хэши LM и NTLM паролей пользователей

python vol.py -f дамп --profile=профиль hashdump

Сравнение дампов

По всей видимости описанный тут плагин не работает с последними версиями Windows 10.

Можно выявлять подозрительные процессы сравнивая образ, снятый с ОС до запуска подозрительного ПО (baseline дамп) с дампом, снятым после запуска такого ПО.

Плагины baseline не входят в дистрибутив volatility – их надо скачать и скопировать в папку volatility/volatility/plugins.

python vol.py -f дамп2 processbl -B дамп1 -U

Кроме процессов (processbl) можно сравнивать:

Ссылки по volatility