HoldMyBeer
Cause every great story starts with «Hold my beer»
Windows, Mac OSX and Linux Memory Dump How To
Dumping memory from an operating system can be complicated and is not built-in feature. You also have to keep in mind that memory dumps are a snapshot in time of what is in the memory. The memory is constantly changing every second so having the right tool can be the difference between getting the data you need and having it lost forever. There are various tools for each operating system to accomplish memory dumps. Some tools are easier to setup and use than others and some tools are portable apps. I have provided links at the bottom of this post to all the tools I cover within this post.
Windows Memory Dump
Method 1: Break Windows for Memory Dump Tool
- Open run and enter “sysdm.cpl”
- Select “Advance System Settings” on the left.
- Select “Settings” under “Startup and recovery” section
- Select “Complete memory dump” under “Write debugging information”
- If “Complete memory dump is not an option please follow these steps.
- Open run and enter “regedit”.
- Go to HKEY_LOCAL_MAHCINE\SYSTEM\CurrentControlSet\Control\CrashControl.
- In the right-hand panel double-click “CrashDumpEnabled” and set the value to “1”.
- Reboot and follow steps 1 -4.
- Must reboot computer for settings to take effect.
- Now time to break windows, muhahahaha.
- Quick dirty method
- Open Powershell as Administrator.
- Enter “get-process | stop-process -f”.
- Better method
- Open run and enter “regedit”.
- Go to “HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\i8042\Parameters”.
- Create a new DWORD and enter “CrashOnCtrlScroll”.
- Modify new DWORD and set value to “1”.
- Reboot system
- Now to crash your system by Holding “Ctrl” and pressing “Scroll Lock” twice.
- Memory dump will be located in “C:\Windows\System32\MEMORY.DMP”.
- The memory dumps from windows can be a lil buggy with volatility.
Method 2: Red Line Memory Dump Tool (Personal favorite)
- Download the software, extract it, and install tool
- Now keep in mind RedLine is meant to keep a low footprint meaning it creates a script to run from a USB drive. We are going to create to script and run it from the same machine.
- Select “Create a Standard Collector”.
- Select “Acquire memory image” at the top.
- Enter a location to save the RedLine collector.
- Open RedLine Collector folder and double-click “RunRedlineAudit”
- The collection process takes close to 20-30mins. In a later post I will go in depth of the analysis part of the RedLine tool.
Method 3: Moonsol DumpIt Memory Dump Tool
- Download the software and extract it.
- Right-click “DumpIt” and select “Run as Administrator”
- Enter “y” for the default path.
- For 2GB capture it took roughly 5 secs.
- For 2GB capture it took roughly 5 secs.
- Confirmation this software works with volatility.
Method 4: Belkasoft Memory Dump Tool
- Download the software and extract it.
- Right-click “RamCapture” and select “Run as Administrator”
- Enter path to save memory dump in “Output path”
- Select “Capture”
- For 2GB capture it took roughly seconds to create a dump.
- Confirmation this software works with volatility.
Linux Memory Dump
Method 1: Lime kernel module
- git clone https://github.com/504ensicsLabs/LiME.git
- cd Lime/src
- make
- cd
- path the output file for the memory dump
- format is the type of dump
- raw – concatenates all System RAM ranges
- padded – pads all non-System RAM ranges with 0s
- lime – each range prepended with fixed-size header containing address space info
- dio
- 0 – default, do not attempt Direct IO
- 1 – attempt to enable Direct IO
Mac OSX Memory Dump
- Download software and extract it.
- Cd to directory with “osxpmem.app” binary
- kextload osxpmem.app/MacPmem.kext
- Had issues with El Captain make sure you have the latest build.
- ./osxpmem.app/osxpmem -o /tmp/ .aff4
Tools
Windows – Moonsols DumpIt – Only place I could find it
Источник
Получение и анализ содержимого памяти в ОС 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, для выполнения анализа памяти.
Источник