
Скрипт для автоматизации захвата и анализа памяти Linux
Linux Memory Grabber Скрипт для дампа памяти Linux и создания профилей Volatility(TM). Hal Pomeranz ([email protected]), 2020-02-01
«Если я видел дальше, то только потому, что стоял на плечах гигантов.» ~ Исаак Ньютон
Многие заслуживают благодарности за то, что сделали возможным этот простой маленький инструмент:
-- Добрые люди из Microsoft за то, что сделали AVML доступным
-- Джо Сайлв за его работу над LiME
-- Вся команда разработчиков Volatility(TM) за их постоянную работу. Особо хочу отметить Эндрю Кейса, который ответил на ряд моих назойливых вопросов во время разработки моего инструмента.
-- Дэвид Андерсон за его постоянную поддержку libdwarf и dwarfdump
-- Мэтт Суиш из MoonSols. Когда я собирал свой инструмент, моей целью было «сделать его таким же простым в использовании, как DumpIt» (если вам нужно захватить память Windows, я не знаю более простого инструмента). Так что спасибо за вдохновение, Мэтт!
-- Люди, которые предоставляли идеи и код для улучшения инструмента:
Julien — Альтернативные каталоги вывода/сборки и метки идентификатора дела,
прерывание, если не запущен от root
Jonathon Poling — идеи, похожие на идеи Julien
Jeff Bryner — Создание файлов volatilityrc для каждого захвата
Сообщество становится лучше благодаря всем этим усилиям. Я решил сделать свой инструмент доступным под лицензией Creative Commons «С указанием авторства» (CC BY), чтобы сделать его максимально широко доступным.
Чтобы проанализировать память Linux, сначала нужно уметь захватывать память Linux. AVML отлично работает, но если в вашей системе нет /proc/kcore или /dev/crash, вам понадобится Linux Memory Extractor (LiME) от Джо Сайлва. Но вам нужен модуль LiME, скомпилированный для ядра той системы, на которой вы хотите захватить RAM.
Volatility(TM) отлично подходит для анализа образов памяти Linux. Но ему нужен профиль, соответствующий системе, где была захвачена память. Создание профиля означает компиляцию программы на C на соответствующей системе и использование dwarfdump для получения адресов важных структур данных ядра. Вам также понадобится копия файла System.map из каталога /boot.
Если у вас есть дубликат вашей целевой системы, вы можете собрать профиль Volatility(TM) на клоне и при необходимости собрать LiME для захвата и анализа памяти с вашей цели. Но есть много ситуаций, когда дубликат целевой системы недоступен. Поэтому вам, возможно, придется строить профиль Volatility(TM) и LiME на вашей целевой машине.
И это не для слабонервных. Есть ряд шагов, и некоторые довольно низкоуровневые команды Linux. Моей целью было создать пакет, который можно установить (специалистом) на флешку и распространить среди агентов на местах. Пользователь флешки должен иметь возможность вставить флешку, запустить одну команду и успешно получить образ памяти целевой машины и рабочий профиль Volatility(TM). Результатом является мой скрипт lmg (Linux Memory Grabber).
Если вы педантичны в отношении криминалистической чистоты, это, вероятно, не инструмент для вас. Давайте обсудим некоторые способы взаимодействия моего инструмента с целевой системой:
Сменные носители — Инструмент предназначен для запуска с портативного USB-устройства, такого как флешка. Вы будете подключать записываемое устройство к вашей целевой системе, где оно потенциально может быть атаковано злоумышленниками или вредоносным ПО, находящимся в системе. Сам факт подключения устройства к системе изменит состояние машины (например, создаст записи в журнале, записи mtab и т.д.). Если устройство не монтируется автоматически операционной системой, пользователь должен вручную смонтировать устройство через root-оболочку.
Компиляция — Создание профиля Volatility(TM) включает компиляцию кода на целевой машине. То же самое касается сборки LiME, когда AVML не работает. Таким образом, будут выполняться gcc, читаться заголовочные файлы, связываться библиотеки и т.д. lmg пытается минимизировать влияние на файловую систему целевой машины, устанавливая TMPDIR в каталог на USB-устройстве, с которого запускается lmg. Это означает, что промежуточные файлы, создаваемые компилятором, будут записываться на флешку, а не в локальную файловую систему целевой машины.
Зависимости — Для компиляции кода ядра в Linux целевой машине требуется рабочая среда разработки с gcc, make и т.д. и все соответствующие include-файлы и общие библиотеки. И в частности, заголовочные файлы ядра должны присутствовать на локальной машине. Эти зависимости могут отсутствовать на целевой. В этом случае пользователь сталкивается с выбором: установить соответствующие зависимости (если возможно) или не иметь возможности собрать профиль Volatility(TM) для системы.
Вредоносное ПО — lmg использует /bin/bash, gcc, zip и множество других программ с целевой машины. Если система скомпрометирована, приложения, используемые lmg, могут быть ненадежными. Более полным решением было бы создать безопасную среду выполнения для lmg на портативном USB-устройстве, но это выходит за рамки данной первоначальной концепции.
Память — Все выполняемые команды приведут к изменению памяти целевой системы. Сам акт захвата RAM всегда создает артефакты, но в данном случае происходит обширная компиляция, доступ к файловой системе и т.д. в дополнение к запуску дампера RAM.
При всем этом lmg является очень удобным инструментом, позволяющим менее квалифицированным агентам захватывать полезные данные для анализа памяти с целевых систем.
Обратите внимание: если AVML завершается неудачей, lmg ищет уже существующий модуль LiME на USB-устройстве, который соответствует версии ядра и архитектуре процессора целевой машины. Если найден, lmg не будет перекомпилировать. Аналогично, вы можете решить не создавать профиль Volatility(TM) для цели, чтобы минимизировать влияние на целевую систему.
lmg использует относительные имена путей при вызове таких программ, как gcc и zip. Поэтому, если вы хотите запускать эти программы с альтернативного носителя, просто обновите $PATH соответствующим образом перед запуском lmg.
Сначала подготовьте флешку в соответствии с инструкциями в документе INSTALL, прилагаемом к lmg.
Когда вы захотите захватить RAM, вставьте флешку в вашу целевую систему. В большинстве систем Linux новые USB-устройства автоматически монтируются в /media. Предположим, ваше устройство оказывается в /media/LMG.
Теперь, от имени root, выполните «/media/LMG/lmg». Это интерактивный режим, и пользователю будет предложено подтверждение перед тем, как lmg соберет модуль LiME для системы и/или создаст профиль Volatility(TM). Если вы не хотите, чтобы вас запрашивали, используйте «/media/LMG/lmg -y».
Все остальное автоматизировано. После выполнения скрипта на флешке появится новый каталог с именем
«.../capture/-YYYY-MM-DD_hh.mm.ss»
lmg поддерживает опцию -c для указания имени каталога ID дела, которое будет использоваться вместо каталога по умолчанию «-YYYY-MM-DD_hh.mm.ss».
Какое бы имя каталога ни использовалось, каталог будет содержать:
-YYYY-MM-DD_hh.mm.ss-memory.lime — захват RAM -YYYY-MM-DD_hh.mm.ss-profile.zip — профиль Volatility(TM) -YYYY-MM-DD_hh.mm.ss-bash — копия /bin/bash цели volatilityrc — пример конфигурационного файла Volatility
Файл volatilityrc определяет соответствующие местоположения для захваченной памяти и плагина. См. ПРИМЕР ИСПОЛЬЗОВАНИЯ ниже для информации о том, как использовать этот файл.
Копия /bin/bash полезна для определения адреса структуры данных истории команд в памяти процессов bash в захваченной памяти. См. https://github.com/volatilityfoundation/volatility/wiki/Linux-Command-Reference#linux_bash для получения дополнительной информации об использовании этого исполняемого файла (или обратитесь к ПРИМЕРУ ИСПОЛЬЗОВАНИЯ ниже).
Обратите внимание, что могут быть случаи, когда вы не хотите записывать данные на носитель, с которого запускаете lmg — например, если инструменты lmg находятся на read-only носителе, таком как DVD-ROM. lmg поддерживает опцию -d для указания другого выходного каталога. По умолчанию вся компиляция будет происходить в целевом каталоге, но пользователь может указать альтернативный каталог компиляции с помощью -B.
Вот пример использования инструмента lmg, который включает непосредственное использование Volatility(TM) с флешки для анализа захваченного образа. На моей тестовой машине флешка находилась на /dev/sdb и не была автоматически смонтирована моей операционной системой. Поэтому я все делал вручную.
[root@localhost ~]$ sudo -s [sudo] password for lab: [root@localhost lab]# mkdir -p /mnt/usb [root@localhost lab]# mount /dev/sdb1 /mnt/usb
[root@localhost lab]# /mnt/usb/lmg -y AVML is /mnt/usb/avml/avml-x86_64 Dumping memory in "lime" format to /mnt/usb/capture/localhost.localdomain-2020-02-01_08.16.55 This could take a while...Done! Grabbing a copy of /bin/bash...Done! Writing volatilityrc to /mnt/usb/capture/localhost.localdomain-2020-02-01_08.16.55...Done! make -C //lib/modules/4.18.0-147.3.1.el8_1.x86_64/build M="/mnt/usb/volatility-master/tools/linux" clean make[1]: Entering directory '/usr/src/kernels/4.18.0-147.3.1.el8_1.x86_64' make[1]: Leaving directory '/usr/src/kernels/4.18.0-147.3.1.el8_1.x86_64' rm -f module.dwarf make -C //lib/modules/4.18.0-147.3.1.el8_1.x86_64/build CONFIG_DEBUG_INFO=y M="/mnt/usb/volatility-master/tools/linux" modules make[1]: Entering directory '/usr/src/kernels/4.18.0-147.3.1.el8_1.x86_64' CC [M] /mnt/usb/volatility-master/tools/linux/module.o Building modules, stage 2. MODPOST 1 modules WARNING: modpost: missing MODULE_LICENSE() in /mnt/usb/volatility-master/tools/linux/module.o see include/linux/module.h for more information CC /mnt/usb/volatility-master/tools/linux/module.mod.o LD [M] /mnt/usb/volatility-master/tools/linux/module.ko make[1]: Leaving directory '/usr/src/kernels/4.18.0-147.3.1.el8_1.x86_64' dwarfdump -di module.ko > module.dwarf make -C //lib/modules/4.18.0-147.3.1.el8_1.x86_64/build M="/mnt/usb/volatility-master/tools/linux" clean make[1]: Entering directory '/usr/src/kernels/4.18.0-147.3.1.el8_1.x86_64' CLEAN /mnt/usb/volatility-master/tools/linux/.tmp_versions CLEAN /mnt/usb/volatility-master/tools/linux/Module.symvers make[1]: Leaving directory '/usr/src/kernels/4.18.0-147.3.1.el8_1.x86_64' adding: module.dwarf (deflated 90%) adding: boot/System.map-4.18.0-147.3.1.el8_1.x86_64 (deflated 79%)
[root@localhost lab]# cd /mnt/usb/capture/localhost.localdomain-2020-02-01_08.16.55 [root@localhost localhost.localdomain-2020-02-01_08.16.55]# ls localhost.localdomain-2020-02-01_08.16.55-bash localhost.localdomain-2020-02-01_08.16.55-memory.lime localhost.localdomain-2020-02-01_08.16.55-profile.zip volatilityrc [root@localhost localhost.localdomain-2020-02-01_08.16.55]# ../../volatility-master/vol.py --conf-file=volatilityrc linux_banner Volatility Foundation Volatility Framework 2.6.1 Linux version 4.18.0-147.3.1.el8_1.x86_64 ([email protected]) (gcc version 8.3.1 20190507 (Red Hat 8.3.1-4) (GCC)) #1 SMP Fri Jan 3 23:55:26 UTC 2020
[root@localhost localhost.localdomain-2020-02-01_08.16.55]# gdb localhost.localdomain-2020-02-01_08.16.55-bash GNU gdb (GDB) Red Hat Enterprise Linux 8.2-6.el8_0 Copyright (C) 2018 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later http://gnu.org/licenses/gpl.html This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "x86_64-redhat-linux-gnu". Type "show configuration" for configuration details. For bug reporting instructions, please see: http://www.gnu.org/software/gdb/bugs/. Find the GDB manual and other documentation resources online at: http://www.gnu.org/software/gdb/documentation/.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from localhost.localdomain-2020-02-01_08.16.55-bash...Missing separate debuginfo for /mnt/usb/capture/localhost.localdomain-2020-02-01_08.16.55/localhost.localdomain-2020-02-01_08.16.55-bash
Try: dnf --enablerepo='debug' install /usr/lib/debug/.build-id/b6/858d77c486b7b596f22956149bbc9f8058d98d.debug
Reading symbols from .gnu_debugdata for /mnt/usb/capture/localhost.localdomain-2020-02-01_08.16.55/localhost.localdomain-2020-02-01_08.16.55-bash...(no debugging symbols found)...done.
(no debugging symbols found)...done.
(gdb) disass history_list
Dump of assembler code for function history_list:
0x00000000000ccea0 <+0>: endbr64
0x00000000000ccea4 <+4>: mov 0x24b09d(%rip),%rax # 0x317f48
0x00000000000cceab <+11>: retq
End of assembler dump.
(gdb) quit
[root@localhost localhost.localdomain-2020-02-01_08.16.55]# ../../volatility-master/vol.py --conf-file=volatilityrc linux_bash -H 0x317f48
Volatility Foundation Volatility Framework 2.6.1
Pid Name Command Time Command
13822 bash 2020-01-30 20:25:39 UTC+0000 uname -a 13822 bash 2020-01-30 20:25:39 UTC+0000 ls 13822 bash 2020-01-30 20:25:39 UTC+0000 sudo -s 13822 bash 2020-01-30 20:25:39 UTC+0000 fg [... more output not shown ...]