Как сделать дамп оперативной памяти в Linux
Как и в случае со снятием образа жесткого диска в Linux, существует несколько способов сделать дамп оперативной памяти в Linux. Среди вариантов:
- использование нативного модуля ядра Linux Memory Extractor (LiME);
- скрипт Linux Memory Grabber, который не требует установки и который можно запускать, к примеру, с флешки;
- связка утилит lmap и pmem, которые входят в пакет Rekall. Их-то я и буду использовать.
Пара слов о Rekall. Это отдельная ветвь развития известного фреймворка Volatility Framework, которая написана на Python и предназначена специально для включения в форензик-дистрибутивы, работающие с Live CD.
Переходим в папку с утилитой и собираем ее из исходников:
Грузим драйвер ядра pmem.ko в оперативную память:
Проверяем инициализацию драйвера:
После этого драйвер создает файл-контейнер под наш будущий образ RAM: /dev/pmem.
Теперь с помощью все той же утилиты dd создаем сам образ оперативной памяти системы:
Ну и после завершения работы выгружаем драйвер:
Дело сделано! Теперь у нас есть все необходимое для дальнейшего анализа. В следующей статье также посещенной компьютерной криминалистике я покажу, что делать с полученными данными, чтобы найти в них артефакты. А чтобы было веселее, я припас для вас интересный кейс с поиском заразы, которая завелась на серверах хостинг-провайдера. В общем, оставайтесь с нами!
Источник
Получение и анализ содержимого памяти в ОС Linux
В данной статей мы рассмотрим метод удаленного получения образа памяти при помощи LiME в системе на базе CentOS 6.5 x64.
Автор: Дэн Кэбен (Dan Caban)
Раньше образ памяти в системах на базе ОС Linux можно было получить напрямую (при помощи утилиты dd) из файлов псевдоустройств, таких как /dev/mem и /dev/kmem. В последних версиях ядра доступ к этим устройствам стал ограничен и/или полностью исключен. Чтобы исследователи и системные администраторы могли получить неограниченный доступ, были разработаны загружаемые модули, которые, к примеру, доступны в проектах fmem и LiME (Linux Memory Extractor).
В данной статей мы рассмотрим метод удаленного получения образа памяти при помощи LiME в системе на базе CentOS 6.5 x64.
LiME – загружаемый модуль ядра (Loadable Kernel Module, LKM). Загружаемые модули обычно разрабатываются с целью расширения функционала ядра. Модуль можно добавить, используя учетную запись с привилегиями суперпользователя. При установке модуля следует быть осторожным, поскольку некорректная его установка несет потенциальные риски для целевой системы. С другой стороны, LiME обладает рядом несомненных преимуществ:
- Скомпилированный модуль довольно небольшого размера.
- Процедура установки не требует перезагрузки.
- Модуль легко добавляется или удаляется.
- Полученный дамп памяти можно скачать удаленно без записи на локальный диск целевой системы.
- Дамп памяти совместим с фреймворком Volatility.
Подготовка к работе
Поскольку LiME распространяется в виде исходных текстов, для начала необходимо его скомпилировать. Всю доступную информацию можно легко найти в интернете, но перед этим рекомендую вам поискать скомпилированные версии модуля или скомпилировать и протестировать его на виртуальной машине.
В любом случае для начала необходимо узнать версию ядра на целевой машине.
]$ uname -a
Linux localhost.localdomain 2.6.32-431.5.1.el6.x86_64 #1 SMP
Wed Feb 12 00:41:43 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
Скомпилированные версии LiME-модулей можно взять в Linux Forensics Tools Repository at Cert.org (этот ресурс заслуживает доверия). Там хранятся RPM-репозитарии аналитических утилит для Red Hat Enterprise Linux, CentOS и Fedora.
Чтобы найти скомпилированный модуль для определенной версии ядра и операционной системы зайдите на Cert и найдите «repoview» для целевой операционной системы
Рисунок 1: Раздел с репозитариями для CentOS
Далее зайдите в раздел «applications/forensics tools» и откройте документацию для «lime-kernel-objects».
На момент написания статьи в репозитарии были скомпилированные версии для следующих версий ядер (под ОС CentOS 6 / RHEL 6):
2.6.32-71
2.6.32-71.14.1
2.6.32-71.18.1
2.6.32-71.24.1
2.6.32-71.29.1
2.6.32-71.7.1
2.6.32-131.0.15
2.6.32-220
2.6.32-279
2.6.32-358.0.1
2.6.32-358.11.1
2.6.32-358.14.1
2.6.32-358.18.1
2.6.32-358.2.1
2.6.32-358.23.2
2.6.32-358.6.1
2.6.32-431
2.6.32-431.1.2.0.1
2.6.32-431.3.1
Оказалось, что под мою версию ядра еще не существует скомпилированных модулей. Придется сделать чуть больше телодвижений.
Я установил на виртуальной машине CentOS 6.5 x64 с последней версией ядра (2.6.32-431.5.1.el6.x86_64).
]$ yum update
[root@vmtest
После обновления ядра перезагружаем виртуальную машину.
Теперь нам нужны соответствующие заголовки и исходники ядра, а также утилиты для компиляции.
]$ yum install gcc gcc-c++ kernel-headers kernel-source
Теперь мы готовы к загрузке и компиляции модуля LiME!
]# mkdir lime; cd lime
[root@vmtest lime]# wget https://lime-forensics.googlecode.com/files/lime-forensics-1.1-r17.tar.gz
[root@vmtest lime]# tar -xzvf lime-forensics-1.1-r17.tar.gz
[root@vmtest lime]# cd src
[root@vmtest src]# make
….
make -C /lib/modules/2.6.32-431.5.1.el6.x86_64/build M=/root/lime/src modules
…
[root@vmtest src]# ls lime*.ko
lime-2.6.32-431.5.1.el6.x86_64.ko
После компиляции модуля загрузим его на виртуальной машине и выгрузим память в локальный файл. Настройки модуля выглядят следующим образом:
]# insmod lime-2.6.32-431.5.1.el6.x86_64.ko «path=/root/mem.img format=lime»
Образ памяти будет выгружен в файл /root/mem.img, а формат «lime» совместим с фреймворком volatility.
Я проверил параметры созданного образа (на соответствие размера и объема памяти, выделенного под виртуальную машину, а также на корректность содержимого образа).
]# ls -lah /root/mem.img
-r—r—r—. 1 root root 1.0G Mar 9 08:11 /root/mem.img
[root@vmtest
]# strings /root/mem.img | head -n 3
EMiL
root (hd0,0)
kernel /vmlinuz-2.6.32-431.5.1.el6.x86_64 ro root=/dev/mapper/vg_livecd-lv_root rd_NO_LUKS
Удаляем модуль ядра при помощи простой команды:
Получение образа через интернет
После успешных тестов вернемся к нашей первоначальной задаче: захвату памяти на сервере с ОС CentOS и загрузке полученного образа через интернет. Я загрузил модуль на подконтрольный мне сервер, а затем скачал его через протокол HTTP:
LiME позволяет не только записывать образы на локальный диск. Вместо этого мы можем создать TCP-сервис при помощи аргумента path=tcp:4444.
]# insmod lime-2.6.32-431.5.1.el6.x86_64.ko «path=tcp:4444 format=lime»
Если, к примеру, мы находимся внутри клиентской сети или порт 4444 доступен через интернет, при помощи netcat я могу соединиться с сервером и скачать образ памяти на свой компьютер.
]# nc target.server.com 4444 > /home/dan/evidence/evidence.lime.img
Поскольку целевой сервер находится в интернете, на котором установлен фаервол, к процессу получения образа следует подходить более творчески.
Помните, как я загружал модуль на целевой сервер через HTTP (80-й порт)? Это означает, что файервол разрешает исходящие TCP-соединения через этот порт.
Я могу установить сервер netcat, который будет доступен через интернет при помощи конфигурирования файервола так, чтобы трафик с этого порта передавался на мой локальный LAN-адрес. Вы можете сделать то же самое при помощи большинства роутеров и функции проброса портов (port forwarding).
Шаг 1: настраиваем netcat сервер на нашей машине, чтобы он прослушивал 80-й порт.
]# nc –l 80 > /home/dan/evidence/evidence.lime.img
Шаг 2: Запускаем модуль LiME и конфигурируем его на ожидание TCP-соединений на 4444 порту.
]# insmod lime-2.6.32-431.5.1.el6.x86_64.ko «path=tcp:4444 format=lime»
Сейчас на целевом сервере я могу использовать локальное соединение netcat, связанное с удаленным соединением к моему компьютеру через 80-й порт (где 60.70.80.90 – условный адрес моей машины).
Шаг 3: Создаем цепочку для передачи образа памяти на мою машину.
]# nc localhost 4444 | nc 60.70.80.90 80
Теперь, когда образ оказался на моей машине, можно начать его анализ.
Ниже показана наглядная схема процесса передачи образа:
Рисунок 2: Схема передачи образа памяти на удаленный хост
Анализ памяти при помощи Volatility
В Volatility есть множество профилей для парсинга дампов памяти, но эти конфигурации в основном полезны при анализе образов взятых в ОС Windows. Чтобы выполнить анализ дампа взятого из Линукса, мы должны создать новый профиль, в точности соответствующий операционной системе, версии ядра и архитектуре. Вернемся в виртуальной машине для того, чтобы собрать всю необходимую информацию для создания профиля. Нам потребуется:
- отладочные символы (System.map*)
- Необходим доступ к тестовой виртуальной машине с той же самой архитектурой, версией ядра и операционной системой.
- информация о структурах данных ядра (vtypes)
- Необходимы исходники volatility и утилиты для компиляции файлов ядра на той же самой архитектуре, версии ядра и операционной системе.
Для начала создадим папку, в которую будем складировать все необходимые файлы.
mkdir -p volatility-profile/boot/
mkdir -p volatility-profile/volatility/tools/linux/
Теперь скопируем отладочные символы, находящиеся в CentOS в директории /boot/. Необходимо найти файл System.map*, соответствующий версии ядра, которая была запущена во время получения дампа памяти (2.6.32-431.5.1.el6.x86_64).
]# cd /boot/
[root@vmtest boot]# ls -lah System.map*
-rw-r—r—. 1 root root 2.5M Feb 11 20:07 System.map-2.6.32-431.5.1.el6.x86_64
-rw-r—r—. 1 root root 2.5M Nov 21 22:40 System.map-2.6.32-431.el6.x86_64
Копируем соответствующий файл System.map в ранее созданную папку.
[root@vmtest boot]# cp System.map-2.6.32-431.5.1.el6.x86_64
/volatility-profile/boot/ Одно из требований при компиляции файлов ядра (vtypes) – наличие библиотеки libdwarf. В других операционных системах ее можно получить при помощи apt-get или yum. В CentOS 6.5 необходимо скомпилировать исходники, взятые из Fedora Project. Остальные пакеты, необходимые для компиляции, должны быть установлены во время компиляции LiME (см. Раздел «Подготовка к работе»).
[root@vmtest boot]# cd
]# mkdir libdwarf
[root@vmtest libdwarf]# cd libdwarf/
[root@vmtest libdwarf]# wget http://pkgs.fedoraproject.org/repo/pkgs/libdwarf/libdwarf-20140208.tar.gz
/4dc74e08a82fa1d3cab6ca6b9610761e/libdwarf-20140208.tar.gz
[root@vmtest libdwarf]# tar -xzvf libdwarf-20140208.tar.gz
[root@vmtest dwarf-20140208]# cd dwarf-20140208/
[root@vmtest dwarf-20140208]#./configure
[root@vmtest dwarf-20140208]# make
[root@vmtest dwarfdump]# cd dwarfdump
[root@vmtest dwarfdump]# make install
Копируем исходники Volatility и скомпилировать структуры ядра.
[root@vmtest dwarfdump]# cd
]# mkdir volatility
[root@vmtest
]# cd volatility
[root@vmtest volatility]# cd volatility
[root@vmtest volatility]# wget https://volatility.googlecode.com/files/volatility-2.3.1.tar.gz
[root@vmtest volatility]# tar -xzvf volatility-2.3.1.tar.gz
[root@vmtest volatility]# cd volatility-2.3.1/tools/linux/
[root@vmtest linux]# make
После успешной компиляции скопируем получившийся файл (module.dwarf) в папку профиля.
[root@vmtest linux]# cp module.dwarf
Запаковываем оба файла в ZIP-архив (согласно требованиям Volatility).
[root@vmtest linux]# cd
/volatility-profile/
[root@vmtest volatility-profile]# zip CentOS-6.5-2.6.32-431.5.1.el6.x86_64.zip
boot/System.map-2.6.32-431.5.1.el6.x86_64 volatility/tools/linux/module.dwarf
adding: boot/System.map-2.6.32-431.5.1.el6.x86_64 (deflated 80%)
adding: volatility/tools/linux/module.dwarf (deflated 90%)
Полученный архив на своей машине можно было бы скопировать в стандартную папку, предназначенную для хранения профилей, однако чтобы избежать их потери во время обновлений, я создал отдельную директорию и сослался на нее во время запуска volatility.
Далее видим, что Volatility распознал новую директорию для плагинов.
dan@investigativelaptop evidence]# vol.py —plugins=/home/dan/.volatility/profiles/ —info | grep -i profile | grep -i linux
Volatility Foundation Volatility Framework 2.3.1
LinuxCentOS-6_5-2_6_32-431_5_1_el6_x86_64x64 — A Profile for Linux CentOS-6.5-2.6.32-431.5.1.el6.x86_64 x64
Запускаем плагины с префиксом linux, которые идут в составе Volatility, для выполнения анализа памяти.
Источник
Как вывести образ памяти из системы Linux?
Я знаю, чтобы сбросить образы памяти в Windows. (например, dumpit) Но я не знаю, как создавать дамп памяти в Linux.
Я хочу получить образы памяти в Linux и из Linux в Linux с ssh-соединением или чем-то еще.
Как я могу получить в Linux?
Linux
/ DEV / MEM
В старых системах Linux программа dd может использоваться для чтения содержимого физической памяти из файла устройства / dev / mem. Однако в последних системах Linux / dev / mem предоставляет доступ только к ограниченному диапазону адресов, а не к полной физической памяти системы. В других системах он может быть недоступен вообще. В ядре Linux серии 2.6 существовала тенденция к сокращению прямого доступа к памяти через файлы псевдоустройств. См., Например, сообщение, сопровождающее этот патч: http://lwn.net/Articles/267427/ .
/ DEV / аварии
В системах Red Hat (и в тех, в которых работают связанные дистрибутивы, такие как Fedora или CentOS), драйвер аварийного завершения может быть загружен для создания псевдоустройства / dev / crash для доступа к сырой физической памяти (с помощью команды «modprobe crash»). Этот модуль также может быть скомпилирован для других дистрибутивов Linux с небольшими усилиями (см., Например, http://gleeda.blogspot.com/2009/08/devcrash-driver.html ). Когда драйвер сбоя модифицируется, компилируется и загружается в других системах, получающееся в результате устройство доступа к памяти не является полностью безопасным для создания образа. Необходимо соблюдать осторожность, чтобы избежать адресов, которые не поддерживаются RAM. В Linux / proc / iomem предоставляет правильные диапазоны адресов для изображения, помеченного как «Системная память».
Второй взгляд: криминалистика памяти Linux
Этот коммерческий продукт судебной экспертизы памяти поставляется с модифицированной версией аварийного драйвера и скриптом для безопасного сброса памяти с использованием оригинального или модифицированного драйвера в любой конкретной системе Linux.
fmem fmem — репозиторий github
fmem — это модуль ядра, который создает устройство / dev / fmem, аналогично / dev / mem, но без ограничений. Это устройство (физическое ОЗУ) можно скопировать с помощью dd или другого инструмента. Работает на ядрах Linux 2.6. Под GNU GPL.
LiME — Linux Memory Extractor
Linux Memory Extractor (LiME) — это загружаемый модуль ядра (LKM), который позволяет получать энергозависимую память от устройств на базе Linux и Linux, таких как устройства на платформе Android. Инструмент поддерживает дамп памяти либо в файловую систему устройства, либо по сети.
Я нашел этот пример fmem использования, который, кажется, является самым простым способом выгрузки памяти для целей анализа, который вы больше не можете использовать /dev/mem после ядер 2.6.x, насколько я понимаю.
Пример fmem
Пример LiME
Для анализа энергозависимой памяти также есть страница под названием: Анализ памяти Linux . В этом видеоуроке есть подробный пример, который показывает использование LiME и Volatility для сбора дампа памяти, а затем его анализа, извлечения истории Bash пользователя из дампа памяти.
Что еще?
Также есть вопросы и ответы U & L под названием: Как я могу сбросить всю системную память? который имеет дополнительные примеры и информацию.
Источник