Содержание статьи
- Постановка задачи
- Подготовка к анализу файла server.dmp
- Анализ памяти процесса server.exe
- Восстановление логики работы процесса server.exe
- Итог анализа
- Поиск данных для восстановления содержимого файла flag.txt
- Поиск зашифрованного содержимого файла flag.txt
- Поиск секрета Диффи — Хеллмана
- Генерация сессионного ключа шифрования
- Расшифровка флага
- Заключение
Здесь же мы разберем одно из наиболее сложных заданий онлайнового этапа — задание на реверс и форензику под названием private_problem. Этот таск решила только одна команда из России — LC↯BC.
Постановка задачи
В качестве исходных данных предоставляется файл server.dmp. Необходимо найти содержимое файла flag.txt.
Подготовка к анализу файла server.dmp
Исходный файл имеет формат MDMP. Как правило, файлы такого формата создаются операционной системой при возникновении определенных сбоев. Кроме того, аналогичный файл можно создать самостоятельно. Например, при отладке процесса в Visual Studio или при помощи специализированных утилит (см. скриншот).
![Создание файла MDMP при помощи утилиты Process Explorer](https://xakep.ru/wp-content/uploads/2018/09/186029/img1.png)
Для статического анализа MDMP-файла откроем его в IDA Pro.
![Состояние процесса в момент снятия дампа](https://xakep.ru/wp-content/uploads/2018/09/186029/img2.png)
![Окно с модулями, загруженными в память в момент снятия дампа](https://xakep.ru/wp-content/uploads/2018/09/186029/img3.png)
На втором скриншоте видно, что дамп был сделан в момент выполнения инструкции внутри процесса server.exe. Чтобы проанализировать память процесса server.exe, необходимо найти базовый адрес текущей функции и определить ее в IDA Pro.
![Текущая функция до определения](https://xakep.ru/wp-content/uploads/2018/09/186029/img4.png)
![Состояние процесса в момент снятия дампа после определения и декомпиляции текущей функции](https://xakep.ru/wp-content/uploads/2018/09/186029/img5.png)
Аналогичным образом определяем все вложенные функции, которые не определились автоматически.
Анализ памяти процесса server.exe
Чтобы понять, как процесс server.exe связан с файлом flag.txt, восстановим логику его работы.
Восстановление логики работы процесса server.exe
Первым делом процесс server.exe инициализирует сетевое взаимодействие с клиентом. Псевдокод функции инициализации после переименования стандартных имен и создания необходимых структур данных изображен ниже.
![Псевдокод функции инициализации сетевого взаимодействия с клиентом](https://xakep.ru/wp-content/uploads/2018/09/186029/img6.png)
После успешной инициализации сетевого взаимодействия клиенту отправляется строка "Tell me your secrets\n"
.
![Первичное взаимодействие с клиентом](https://xakep.ru/wp-content/uploads/2018/09/186029/img7.png)
Затем на стороне клиента и на стороне сервера генерируется пара ключей Диффи — Хеллмана с последующим экспортом публичного ключа в структуру вида PUBLICKEYBLOB.
Рассмотрим функцию генерации ключей.
![Генерация ключей шифрования на стороне сервера](https://xakep.ru/wp-content/uploads/2018/09/186029/img8.png)
В данном случае протокол Диффи — Хеллмана реализован согласно документации Microsoft. В качестве открытых параметров Диффи — Хеллмана на стороне клиента и на стороне сервера используются стандартные значения модуля и генератора, указанные в источнике. Секретный параметр Диффи — Хеллмана генерируется случайным образом при вызове функции CryptSetKeyParam
с аргументом KP_X
.
Псевдокод функции экспорта публичного ключа изображен ниже.
![Псевдокод функции экспорта публичного ключа Диффи — Хеллмана](https://xakep.ru/wp-content/uploads/2018/09/186029/img9.png)
После генерации и экспорта ключей Диффи — Хеллмана сервер и клиент обмениваются публичными ключами, а также на обеих сторонах генерируется общий сессионный ключ.
Далее представлена реализация следующих действий:
- получение блоба публичного ключа Диффи — Хеллмана, сгенерированного на клиенте, и импорт общего сессионного ключа;
- отправка блоба публичного ключа Диффи — Хеллмана, сгенерированного локально.
![Обмен публичными ключами между клиентом и сервером](https://xakep.ru/wp-content/uploads/2018/09/186029/img10.png)
![Импорт сессионного ключа шифрования](https://xakep.ru/wp-content/uploads/2018/09/186029/img11.png)
Из рисунка видно, что общий сессионный ключ импортируется для шифрования данных с помощью алгоритма RC4. Аналогично ключ должен импортироваться на стороне клиента после получения тем блоба публичного ключа Диффи — Хеллмана, сгенерированного сервером.
После согласования сессионного ключа шифрования на стороне сервера происходит следующее (см. рисунок ниже):
- Прием данных от клиента:
- размер буфера с данными (4 байта);
- контрольная сумма CRC32 от буфера с данными (4 байта);
- буфер, содержащий данные, зашифрованные общим сессионным ключом на стороне клиента при помощи публичного ключа Диффи — Хеллмана от сервера (размер определяется первым полем).
- Проверка контрольной суммы.
- Расшифровка данных общим сессионным ключом, сгенерированным на стороне сервера при помощи публичного ключа Диффи — Хеллмана от клиента.
- Запись расшифрованных данных в файл с названием flag.txt.
![Прием, расшифровка и запись данных в файл flag.txt](https://xakep.ru/wp-content/uploads/2018/09/186029/img12.png)
Итог анализа
Таким образом, server.exe — это часть клиент-серверного приложения, где реализованы следующие функции:
- инициализация соединения с клиентом;
- генерация пары ключей Диффи — Хеллмана;
- экспорт публичного ключа Диффи — Хеллмана;
- получение блоба публичного ключа Диффи — Хеллмана, сгенерированного на стороне клиента;
- импорт общего сессионного ключа RC4 для расшифровки данных со стороны клиента;
- отправка клиенту блоба публичного ключа Диффи — Хеллмана, сгенерированного локально;
- получение данных со стороны клиента;
- проверка, расшифровка и запись данных в файл flag.txt.
Стало понятно, какие именно данные пишутся в файл flag.txt. Проблема в том, что в дампе процесса server.exe эти данные могли остаться только в зашифрованном виде, так как перед снятием дампа буфер с расшифрованными данными умышленно был перезаписан нулями.
![Перезапись буфера с расшифрованными данными](https://xakep.ru/wp-content/uploads/2018/09/186029/img13.png)
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»