Содержание
Вы наверняка слышали про соревнования для хакеров и программисотв Capture The Flag (CTF). Одно из направлений таких соревнований — форензика (компьютерная криминалистика). В CTF теме форезники посвящены несколько групп: анализ жесткого диска, анализ оперативной памяти и изучение дампов трафика.
Еще по теме: Форензик кейс взлома Linux-серверов
В этой статье мы поговорим об анализе дампа оперативной памяти и рассмотрим одну довольно интересную особенность GIMP.
Анализ дампа оперативной памяти
Анализ памяти актуален в ситуации, когда есть или был физический доступ к компьютеру и была возможность снять дамп оперативной памяти. По слепку оперативной памяти можно определить, какие приложения запускались во время работы компьютера, данные процессов и получить другую полезную информацию. Все это можно сделать пока пользователь не выключил или не перезагрузил компьютер.
Как правило, для анализа оперативной памяти используют несколько приложений: Volatility, Memoryze и Autopsy (в связке с Volatility). Существуют и другие менее популярные инструменты, но в рамках этой статьи рассматривать их не будем.
Вы спросите а как же Autopsy? Конечно, это удобный инструмент, который может одним нажатием кнопки сделать комплексный анализ всего дампа. Но, если речь идет о соревнованиях, тогда важна скорость получения результатов, поэтому лучше использовать, что-то другое. Мы для анализа оперативной памяти будем использовать Volatility.
Перейдем к заданию. У нас есть дамп оперативной памяти и хеш MD5 для его проверки.
Скачиваем образ памяти на компьютер. В моем случае Kali Linux.
1 |
$ wget https://ams3.digitaloceanspaces.com/justctf/69f7647d-2f7a-4604-b9f6-553c6bb447ee/challenge.tar.gz |
Теперь распакуем слепок памяти:
1 |
$ tar -xzvf challenge.tar.gz |
И сразу же проверим, что с ним все в порядке:
1 |
$ md5sum pub/challenge.vmem |
Если хеш не сошелся с исходным хешем — придется еще раз скачать архив.
Определение профиля
Для начала надо определить версию ОС, с которой был снят дамп. Это можно сделать командой imageinfo:
1 |
$ vol.py -f challenge.vmem imageinfo |
Обратите внимание на строчку с Suggested Profiles. Это указывает на версию дампа оперативной памяти — Win10x64_18362. Теперь нужно указать аргумент —profile Win10x64_18362 для последующих команд.
Если возникли какие-то непонятки с Volatility, тогда добро пожаловать Wiki.
Получение информацию о компьютере
Для начала надо искать информацию о:
- процессах;
- истории браузера;
- истории запущенных команд в консоли.
Этих 3 пунктов хватит для определения направления дальнейшей разведки.
Процессы
Чтобы найти процессы, нам достаточно использовать команду pstree. Есть еще pslist, но первая команда удобнее, потому что показывает процессы в виде дерева — так намного проще понять, на какие из них стоит обратить внимание.
1 |
$ vol.py -f challenge.vmem --profile Win10x64_18362 pstree |
Ничего бросающегося в глаза, вроде pswd_manager.exe или not_a_virus.exe, не видно, поэтому продолжим нашу разведку.
История браузера
Хоть в хинте (см. первый скрин) и говорилось, что «удаленный» не обязательно значит «браузер», мы проверим этот вектор. В Volatility есть готовый плагин для просмотра истории Internet Explorer — iehistory. И не говорите, что им уже никто не пользуется!
1 |
$ vol.py -f challenge.vmem --profile Win10x64_18362 iehistory |
Команда работала слишком долго на моей машине (порядка 20 минут) и завершаться не планировала. Это не считается нормальным поведением для Volatility, следовательно, тут искать нечего.
Список команд в консоли
Есть еще одна удобная функция для проверки всех введенных в консоль команд. Возможно, пользователь запускал что‑нибудь из консоли или хранил там важные данные (например, флаг). Проверить все из консоли можно с помощью команды cmdscan.
1 |
$ vol.py -f challenge.vmem --profile Win10x6_18362 cmdscan |
Тут чисто — следовательно, терминал тоже не при делах.
Полезный прием при анализе оперативной памяти
Поскольку до сих пор не нашлось ничего интересного — мы что‑то упустили. Можно применить еще один полезный прием при анализе оперативной памяти — посмотреть на скриншот рабочего стола. Помогает он не сильно часто, но позволяет увидеть более полную картину.
Сделать скриншот всех окон процессов в системе можно с помощью команды screenshot. Обязательно нужно указать существующую конечную директорию, где будут находиться все снимки.
Важно понимать, что большинство картинок будут пустыми: это связано с тем, что не все окна вообще могут отображаться (для лучшего понимания рекомендую ознакомиться с документацией).
1 |
$ vol.py -f challenge.vmem --profile Win10x64_18362 screenshot -D shot/ |
К сожалению, команда заканчивается с ошибкой, так что этот трюк тоже не прошел и нам стоит вернуться к самому началу.
Проверка информации
В названии задачи фигурирует слово remote (удаленный) — давайте попробуем найти что‑то, что может взаимодействовать с сетью.
Попробуем снова проверить все процессы, которые у нас фигурируют в этом слепке оперативной памяти. Заметим среди них mstsc.exe — Microsoft Terminal Services Client, или, в простонародье, RDP-клиент.
RDP — это проприетарный протокол для доступа к удаленным рабочим столам. Для нас важно то, что протокол предусматривает передачу картинки по кадрам в виде сжатых битмапов, которые разжимаются и отображаются, а в это время хранятся в памяти.
Возможно, в этом процессе мы сможем найти флаг. Найдем его PID, чтобы мы могли сдампить память процесса:
1 |
$ vol.py -f challenge.vmem --profile Win10x64_18362 pslist | grep mstsc.exe |
Номер процесса — 6484.
Дамп памяти
У каждого процесса есть своя выделенная память, которая хранится как раз в оперативной памяти (внезапно, не так ли?). Попробуем сдампить ее, чтобы найти полезную информацию из этого процесса.
1 |
$ vol.py -f challenge.vmem --profile Win10x64_18362 memdump -p 6484 -D data |
Извлечение картинок из дампа памяти
Напоминаю, что mstsc.exe (да и другие RDP-клиенты тоже) получают картинку, которую хранят у себя где‑то в оперативной памяти. Благодаря этой особенности мы можем попробовать извлечь картинку из этого дампа процесса.
Возникнет только одна небольшая проблема: правильно подобрать смещение, так как картинка в памяти процесса хранится в сыром виде, и ни binwalk, ни foremost не могут ее отыскать, чтобы сохранить как отдельный файл.
Нужно открыть дамп процесса как Raw Image Data, то есть как сырую картинку, иначе мы не сможем подбирать смещение.
Дальше появляется окошко, где мы можем выбирать смещение.
И начинаем его прокручивать. Для удобства я увеличил свое окошко по ширине, чтобы было легче управлять ползунком. Во время перемещения я заметил следующую картинку, которая похожа на кусок рабочего стола Windows, что наводит на мысль о близости к флагу.
Подкрутим еще немного и скорректируем размер по ширине.
А вот и флаг!
Заключение
Перед решением любых задач не забывайте обновлять используемые утилиты! Не обновив утилиту или неправильно прочитав документацию к ней, можно попасть в rabbit hole и не сдать задачу вовремя. А как мы знаем, не бывает поздно, бывает уже не надо.
Еще по теме: Дистрибутивы для криминалистического анализа