
На DEFCON 2019 организаторы выложили дамп памяти Windows-машины и 18 вопросов к нему — от «посчитайте SHA1 образа» до «восстановите текст из notepad.exe в момент снятия дампа». Большинство вопросов решались тремя-четырьмя плагинами Volatility и утилитой strings. Одна команда — один ответ. Именно за это я люблю форензику как точку входа в CTF: здесь не нужно писать эксплойты или ломать криптографию. Нужно уметь задавать правильные вопросы к данным и знать, какой инструмент даст ответ.
Разберём два навыка, которые закрывают основную массу форензик-тасков: анализ дампов памяти с Volatility и восстановление удалённых файлов из образов дисков. Каждый шаг — с конкретными командами и разбором того, что вы видите в выводе.
Перед тем как хвататься за инструменты, разберитесь, с каким типом задачи столкнулись. От этого зависит весь дальнейший план.
Анализ дампов памяти (memory forensics). Вам дают файл — снимок оперативной памяти в формате .raw, .mem или .vmem. Задача — вытащить из него информацию: список процессов, сетевые соединения, введённые команды, пароли, содержимое открытых документов. Где-то среди этого — флаг.
Анализ образов дисков (disk forensics). Здесь выдают образ жёсткого диска или раздела — файл .dd, .E01 или .raw. Нужно найти удалённые файлы, скрытые разделы, подозрительные метаданные. Когда атакующий применяет File Deletion (T1070.004) или подделывает временные метки через Timestomp (T1070.006, defense-evasion), он рассчитывает, что следы исчезнут. Задача форензика — доказать обратное.
Есть ещё анализ сетевых дампов (PCAP-файлы через Wireshark), стеганография и анализ логов — но это темы для отдельных разборов. Сегодня фокус — на RAM и дисках: эти две дисциплины покрывают порядка половины форензик-тасков на типичном Jeopardy CTF.
Прежде чем ставить инструменты, убедитесь, что система потянет:
Volatility 3 — основной фреймворк для анализа дампов памяти. Клонируете репозиторий с GitHub, затем pip install -r requirements.txt. Volatility 2 (vol.py) ещё встречается в writeup'ах и CTF-разборах, но тройка — актуальная версия с автоопределением профиля для Windows без ручного перебора.
strings — извлечение читаемых строк из бинарных файлов. В Linux обычно предустановлена (пакет binutils). Простая как топор, но решает удивительно много задач.
foremost — file carving, восстановление файлов по сигнатурам. В Kali предустановлен или доступен через sudo apt install foremost. В Ubuntu 22.04+/Debian 12+ пакет может отсутствовать в стандартных репозиториях — тогда собирайте из исходников (GitHub) или используйте scalpel как альтернативу.
binwalk — анализ и извлечение встроенных данных из бинарных файлов: sudo apt install binwalk.
Autopsy — графический форензик-инструмент для анализа образов дисков. Бесплатный, скачивается с sleuthkit.org. Под капотом — The Sleuth Kit (TSK).
PhotoRec / TestDisk — утилиты для восстановления данных: sudo apt install testdisk (PhotoRec входит в пакет).
Порядок действий одинаковый для любого таска. Разберём от первой команды до получения флага.
Перед анализом считаете хеш дампа: sha256sum memory.raw (или sha1sum, в зависимости от требований). Хеш фиксирует состояние файла до начала работы и доказывает, что образ не был модифицирован в процессе анализа.
На DEFCON 2019 CTF первый вопрос был именно таким: «What is the SHA1 hash of triage.mem?». Решение — одна команда. Но суть глубже, чем лёгкие очки: в реальном расследовании хеш — целостность доказательной базы. Не посчитали хеш до начала анализа — результаты могут оспорить. На CTF к этому привыкаешь, а потом привычка переносится в рабочие IR-кейсы.
Volatility должен знать, какая ОС была на машине. Каждая версия Windows (и каждое обновление) размещает структуры ядра по разным адресам. Неправильный профиль — мусор на выходе вместо данных.
В Volatility 2 профиль определяется через vol.py -f memory.raw imageinfo. Команда выдаёт список предполагаемых профилей — например, Win7SP1x64, Win7SP0x64, Win2008R2SP0x64. Проверяйте каждый: запустите vol.py -f memory.raw --profile=Win7SP1x64 pslist. Если вывод содержит нормальные имена процессов (svchost.exe, explorer.exe, csrss.exe) — профиль верный. Мусор вместо имён — пробуйте следующий из списка.
В Volatility 3 профиль определяется автоматически. Команда vol -f memory.raw windows.info сразу выдаёт информацию об ОС без ручного перебора. Для Linux-дампов: vol -f memory.raw banner.
$ vol -f memory.raw windows.info
Variable Value
Kernel Base 0xf8000261a000
DTB 0x187000
Is64Bit True
IsPAE False
NTBuildLab 7601.24214.amd64fre.win7sp1_ldr_
NtMajorVersion 6
NtMinorVersion 1
Из вывода видно: Windows 7 SP1 x64 (NtMajorVersion=6, NtMinorVersion=1, в NTBuildLab — «win7sp1»). Гадать не нужно — система сразу говорит, с чем работаем. По сути это та же информация, которую атакующий получает через System Information Discovery (T1082, discovery), только вы исследуете её постфактум из дампа.
Совет: создайте alias для базовой команды. В bash пишете alias v="vol -f memory.raw" — и дальше все плагины вызываются как v windows.pslist, v windows.netscan. На CTF каждая секунда на счету, а в Volatility 2 ещё добавляется --profile=, что делает строку совсем нечитаемой.
После определения профиля начинается настоящая работа. Ниже — плагины, которые закрывают подавляющее большинство форензик-тасков.
pslist / pstree — список запущенных процессов. В Volatility 3: v windows.pslist. Плагин pstree показывает иерархию: кто родитель, кто дочерний процесс. Это критично для обнаружения аномалий. Пример из разбора DEFCON 2019 CTF: через pstree участники обнаружили, что wscript.exe породил процесс с именем UQkpjFjFzM.exe — случайные символы вместо имени, классика малвари. Процесс оказался meterpreter-агентом.
netscan — активные и закрытые сетевые соединения. Команда v windows.netscan покажет IP-адреса, порты и привязку к PID. Видите исходящее соединение на порт 4444 — это дефолтный порт meterpreter. PID рядом с ним — заражённый процесс, а IP-адрес назначения — адрес атакующего. На CTF этого часто хватает для ответа.
cmdline — аргументы командной строки каждого процесса. В Volatility 3: v windows.cmdline. Показывает, с какими параметрами запущен процесс. Если видите wscript.exe C:\Users\...\vbscript.vbs — вероятно, это вектор заражения.
malfind — детектирование инъекций кода в память процессов. Плагин анализирует VAD-записи (Virtual Address Descriptor) и находит области памяти с правами PAGE_EXECUTE_READWRITE, не соответствующие ни одному загруженному модулю. Типичный признак shellcode-инъекций и reflective DLL injection.
hashdump — извлечение хешей паролей Windows. Команда v windows.hashdump достаёт LM и NT хеши из SAM-базы в памяти. Прямая связка с техникой OS Credential Dumping / LSASS Memory (T1003/T1003.001, credential-access). На CTF вопрос «What is the LM hash of Bob's account?» решается ровно этим плагином.
filescan — поиск файловых объектов в памяти. Команда v windows.filescan находит объекты _FILE_OBJECT в пуле памяти ядра, включая файлы, удалённые с диска к моменту снятия дампа (при условии, что их структуры ещё не были перезаписаны). Связан с техникой File and Directory Discovery (T1083, discovery). Через filescan можно обнаружить VBS-скрипты, подозрительные исполняемые файлы, временные файлы браузеров.
dlllist — список загруженных DLL для каждого процесса. Когда вопрос на CTF звучит как «сколько процессов используют VCRUNTIME140.dll» — запускаете v windows.dlllist и фильтруете через grep. Всё.
Дамп процесса — извлечение конкретного процесса из памяти в файл. Допустим, вы нашли подозрительный PID 3496 через netscan. В Volatility 3 дамп выполняется плагином windows.memmap с флагом --dump: команда vol -f memory.raw -o output_dir windows.memmap --pid 3496 --dump сохранит дамп памяти процесса в каталог output_dir (флаг -o — глобальный и должен стоять перед именем плагина). Обратите внимание: плагин windows.pslist в Vol3 не поддерживает --dump — для дампа используйте именно windows.memmap. Дальше файл можно захешировать через md5sum и ответить на вопрос CTF.
Ещё один практический момент: используйте tee с каждой командой Volatility. Вызов v windows.pslist | tee pslist.txt одновременно выводит результат на экран и сохраняет в файл. Потом делаете grep -i "notepad" pslist.txt без повторного запуска плагина. Некоторые плагины работают минутами на больших дампах — повторный запуск тупо крадёт время на CTF.
Самый прямолинейный метод, который работает чаще, чем кажется. Утилита strings вытаскивает все читаемые строки из бинарного файла, а grep фильтрует по паттерну флага.
$ strings memory.raw | tee strings_out.txt | grep -i "flag{"
flag{m3m0ry_f0r3ns1cs_1s_fun}
$ grep -i "password" strings_out.txt
password=S3cretP@ss!
user_password: hunter2
Если организаторы CTF сообщили формат флага (например, CTF{...} или flag{...}), команда strings memory.raw | grep "CTF{" найдёт его, если он хранился в памяти в открытом виде — в текстовом редакторе, буфере обмена, аргументе командной строки.
Метод не сработает, когда флаг зашифрован, закодирован в base64 или фрагментирован по разным страницам памяти. Но попробовать стоит всегда — 10 секунд работы, а решает заметную часть простых тасков. tee здесь тоже помогает: сохранив строки в файл, потом ищете по другим паттернам (password, secret, admin, key) без повторного прогона strings.
Вторая дисциплина: работа с дисковыми образами. Типичный сценарий — вам дают .dd-образ, в котором «кто-то удалил важный документ». Задача — достать его.
File carving — техника восстановления файлов не через файловую систему (она может быть повреждена, или файл удалён), а через поиск характерных байтовых сигнатур. У каждого формата есть магические байты: JPEG начинается с FF D8 FF, PNG — с 89 50 4E 47, ZIP — с 50 4B 03 04. Утилита сканирует весь образ и «вырезает» данные между сигнатурой начала и сигнатурой конца (или по фиксированному размеру).
foremost — классический инструмент для этого. Команда foremost -i disk_image.dd -o recovered/ сканирует образ и создаёт каталог recovered/ с подпапками по типам: jpg, png, pdf, zip, doc. Файл audit.txt содержит отчёт — какие файлы найдены, их размер и смещение в образе.
$ foremost -i disk_image.dd -o recovered/
Processing: disk_image.dd
|*****|
$ ls recovered/
audit.txt jpg pdf png zip
$ cat recovered/audit.txt
Num Name (bs=512) Size File Offset
1: 00000012.jpg 45 KB 6144
2: 00001024.pdf 123 KB 524288
3: 00002048.png 8 KB 1048576
Дальше просматриваете каждый восстановленный файл. Флаг может быть внутри PDF, в метаданных JPEG (проверяйте через exiftool filename.jpg), в текстовом содержимом PNG (через strings filename.png) или в комментарии ZIP-архива.
binwalk — изначально создан для прошивок, но отлично работает с любыми бинарными данными. Команда binwalk -e disk_image.dd не просто находит встроенные файлы, а рекурсивно распаковывает архивы. Если в образ вложен ZIP, внутри которого PDF с флагом — binwalk достанет всю цепочку. Этакая матрёшка наоборот.
PhotoRec — утилита из пакета TestDisk, работает в интерактивном текстовом меню. Поддерживает более 480 форматов файлов. Запуск: photorec disk_image.dd, затем через меню выбираете тип файловой системы и каталог для сохранения.
Принципиальная разница: foremost и PhotoRec работают по сигнатурам (carving), binwalk — по структурам встроенных объектов (embedded files). На CTF запускайте оба подхода: что не найдёт один, найдёт другой.
Autopsy подходит тем, кому нужен визуальный интерфейс и более глубокий анализ, чем голый carving. Autopsy работает поверх The Sleuth Kit и умеет:
Для CTF Autopsy особенно полезен, когда задание связано не с простым «найди удалённый файл», а с реконструкцией последовательности действий. Timeline-анализ визуализирует картину: что пользователь делал, в каком порядке, когда создал файл, когда удалил. Без Autopsy пришлось бы вручную разбирать MFT-записи NTFS или inode-таблицы ext4 — удовольствие сомнительное, особенно на время.
Рабочий процесс: создаёте новый кейс, добавляете образ как источник данных, ждёте индексации. В левой панели появится дерево файловой системы, а в разделе «Deleted Files» — всё, что удалено, но ещё не перезаписано.
Понимание того, где инструмент не работает, отличает осознанный подход от прокрутки экрана.
Volatility и неправильный профиль (Vol2). Самая частая ошибка. Вывод pslist с неверным профилем содержит мусорные имена или вообще пуст. Решение — проверяйте каждый вариант из imageinfo через pslist. В Volatility 3 проблема частично решена автоопределением для Windows, но для Linux-дампов ещё нужно вручную готовить символы ядра.
Linux-дампы в Volatility 3. Для анализа Linux-дампов нужен файл символов, соответствующий точной версии ядра. Процедура: определить версию через vol -f memory.raw banner, скачать debug-пакет ядра (например, linux-image-5.10.0-35-amd64-dbg), распаковать его командой dpkg -x linux-image-5.10.0-35-amd64-dbg_*.deb extracted/, найти vmlinux по пути extracted/usr/lib/debug/boot/vmlinux-5.10.0-35-amd64 и сгенерировать JSON через dwarf2json linux --elf extracted/usr/lib/debug/boot/vmlinux-5.10.0-35-amd64 > symbols.json, затем сжать (xz symbols.json) и положить symbols.json.xz в каталог volatility3/symbols/linux/ — без сжатия и правильного размещения Volatility не найдёт файл символов автоматически. Без этого анализ Linux-дампа невозможен. На CTF процедура занимает 15-20 минут — ощутимо, когда время ограничено.
Перезаписанные данные на диске. Если секторы, где лежал удалённый файл, были перезаписаны — никакой carving не поможет. foremost и PhotoRec восстанавливают только то, что физически сохранилось. Частичная перезапись даёт повреждённые файлы: JPEG без нижней половины, PDF без последних страниц.
Фрагментация при carving. Carving по сигнатурам предполагает, что файл записан на диске непрерывно. Фрагментированный файл (части разбросаны по разным секторам) foremost «склеит» неправильно — возьмёт начало файла и данные, случайно оказавшиеся рядом. Для таких случаев нужен анализ на уровне файловой системы (Autopsy/TSK), а не сырой carving.
Кодировка в strings. По умолчанию strings ищет ASCII. Если флаг записан в UTF-16 (стандартная кодировка Windows для большинства строк), strings его не увидит. Используйте strings -e l для UTF-16 Little Endian. Типичная ловушка на CTF: вы не находите флаг через strings, хотя он лежит в открытом виде — просто в другой кодировке. Добавьте strings -e l memory.raw | grep "flag" как второй проход — 10 секунд, и проблема снята.
Пошаговый алгоритм — универсальная отправная точка:
file task_file — дамп памяти, образ диска, PCAP или бинарьsha256sum task_file — до начала любого анализаvol -f file windows.info (Vol3) или vol.py -f file imageinfo (Vol2)strings file | tee strings.txt | grep -i "flag\|ctf\|password\|secret"strings -e l file | grep -i "flag"foremost -i file -o recovered/ параллельно с binwalk -e fileexiftoolАлгоритм — не догма. По мере набора опыта вы начнёте пропускать очевидно ненужные шаги и углублять релевантные. Но для первых пяти-десяти тасков лучше следовать списку буквально, чем изобретать подход на лету.
Я провёл через форензик-тасков не один десяток стажёров в SOC и каждый раз вижу одну картину: новички тратят 80% времени на поиск «правильного инструмента» и 20% на собственно анализ. Должно быть наоборот. Volatility, foremost и strings — этого набора хватает для абсолютного большинства CTF-тасков начального и среднего уровня. Проблема не в инструментах, а в голове. Запуск pslist без гипотезы, что именно вы ищете, — это не анализ, это прокрутка экрана. Прежде чем набрать команду, сформулируйте: «ищу процесс, который не должен здесь быть» или «ищу сетевое соединение с внешним IP на нестандартном порту». Такой подход масштабируется от учебного CTF до реального инцидента без переучивания. Через год-два вы будете разбирать дампы скомпрометированных серверов в продакшене, и единственное, что изменится — размер файлов и отсутствие подсказок. Если хочется не собирать знания по статьям, а пройти базу системно от основ до первых задач — IB Basics на Codeby School построен именно под этот маршрут.
🚀 Хочешь закрепить на практике? Реши задачи по теме на HackerLab — категория «pentest-machines».
0 комментариев
Пожалуйста, войдите, чтобы оставить комментарий.
Загрузка комментариев...