Почти неделю назад я выложил таск в формате CTF. Данный таск включал в себя много внутренних заданий и был неплохой тренировкой для тех, кто решил разбираться в инфобезе. Так как никто по сути не решил задание (хотя само решение занимало минут 20 чистого времени) я решил выложить решение. Так что начинаем разбираться. Легенда: Нам удалось перехватить беседу одного известного хакера, есть предположение, что была передана очень важная информация, не могли бы Вы нам помочь? Провайдер передал программу, которая лежала на сервере у хакера, думаю она Вам поможет. Code Нам удалось перехватить беседу одного известного хакера, есть предположение, что была передана очень важная информация, не могли бы Вы нам помочь? Провайдер передал программу, которая лежала на сервере у хакера, думаю она Вам поможет. Шаг 1. Анализируем трафик 1. Для начала анализируем файл dump.cap. В нем находим два интересных потока. Первый IP:(192.168.100.4), судя потому что содержит ответы в открытом тексте, исходит от одного клиента (Gidro). Это нам не очень интересно, поэтом смотрим дальше. Дальше находим еще один поток, который идет с другого IP (192.168.100.9). Тут идут ответы другого пользователя с ником crown. Также есть еще один интересный файл. Похожий на PDF, судя по сигнатуре. Сохраним эти потоки в два файла и приступим к анализу самой программы для общения. Шаг 2. Реверсим программу 2. Для анализа будет использоваться софт DnSpy, так как он лучше всего анализирует .NET Код (то, что это .NET понятно из подгружаемых библиотек и анализа через DiE). Файл имеет три пространства имен и 6 классов, начнем с SecretPtotocol.SDK.Structs. В этом пространстве имен есть два интересных класса, а именно ClientMessage и DataTransform. Просмотрев повнимательнее код, можно понять, что используется в качестве сериализации данных MessagePack. Отлично, мы знаем, как сериализуются пакеты, осталось разобраться в том, используется ли шифрование и как работает сам клиент с сервером. Для этого Посмотрим на классы в пространстве имен SecretProtocol.SDK. Класс ChatBase не имеет вообще ничего особенного, и просто хранит три публичные переменные и является родителем классов Client и Server. Класс Server лишь принимает новые подключения и занимается рассылкой сообщений всем пользователям, используя сериализацию. В классе Client есть лишь интересный метод Process, который занимается как раз приемом и передачей сообщений. Судя по этим классам, никакого шифрования нет. Однако остался класс Program. Но и в классе Program нет никакого намека на шифрование, однако есть метод SendMessage, который показывает, как работает чат. Там есть команда /send_secret, которая позволяет отправлять файл, отлично, значит никакого шифрования нет и можно спокойно разбираться с бинарными файлами. Шаг 3. Тестируем протокол 3. Для начала рассмотрим спецификацию самого сериализатора. Судя по информации на сайте, перед каждым типом стоит префикс, типа, а также, для строк и массивов используется длина. Что же, можно написать небольшую программу для тестирования библиотеки. Для этого создадим тестовый класс и сохраним его в бинарном виде. Как можно заметить массив сериализуется в открытом виде, к тому же в начало добавляется длина. Выглядит это так Осталось получить сериализованный пакет. Хотя данные идут сплошным потоком без шифрования, поэтому можно оставить так и просто найти в потоке PDF Файл. Это можно сделать руками, просто удалив все до и после сигнатур в дампе, в результате мы получим готовый PDF. Но вот проблема, он защищен паролем Шаг 4. Ломаем PDF 4. Так, в трафике есть слова о том, что защита прочна как скала. Сразу идет ассоциация с rockyou. Поэтому попробуем перебрать пароли из этого словаря. Pdfcrack ругается на то, что файл не соответствует формату Acrobat 6, поэтому воспользуемся John The Ripper. И данная программа успешно подобрала пароль для нашего хеша. Пароль – sweety21 Шаг 5. А что в PDF? 5. Мы получили доступ к PDF к которому прикреплен docx документ, а также в PDF есть картинка и подпись к ней. Отрыв этот документ, мы обнаруживаем в нем еще один мем, однако картинка находится в виде полного PNG файла. Можно открыть ее и покурить в StegSlove. После прохода по каналам можно заметить, что в 0 бите каждой из палитр находятся данные, так что можно попробовать их вытащить. Как мы и предполагали, там находится что-то похожее на base64. Что же, сохраняем данные и декодируем. Из Base64 мы получили код на brainfuck. Выполняем его и смотрим что получилось. Так, на выходе вышел непонятный текст, если проанализировать трафик, можно заметить, что crown говорит о каком-то hell code. Можно погуглить это словосочетание Поисковик выдает информацию о языке Malbolge, посмотрев примеры кода, можно понять, что то, что мы получили, очень похоже на код на код на этом языке. Осталось найти интерпретатор этого языка и выполнить код. Сайт выдал ссылку на github репозиторий. В нем можно найти картинку kek.jpg Шаг 6. Опять картинка? 6. Скачиваем ее и анализируем. Можно заметить, что в ней также находится скрытая информация, однако догадок для решения не так много, разве что что-то про то, что ставить пароль в честь себя – глупо. Тут можно либо погуглить утилиты для стеганографии с шифрованием данных, либо воспользоваться хинтом и сразу использовать steghide. В качестве пароля будем использовать crown. После использования утилиты мы получаем архив. Шаг 7. Хранилище 7. В архиве обнаруживается еще один .NET Exe файл. Однако этот файл накрыт обфускатором, поэтому воспользуемся утилитой De4t чтобы сделать код более читаемым. Судя по коду, программа выгружает из себя во временную директорию Dll библиотеку, а потом вызывает у нее функцию, которая, проверяет введенный пароль и, судя по всему содержит флаг. С помощью отладки получаем библиотеку и начинаем анализ через IDA. Шаг 8. IDA 8. Можно убедиться, что это наша библиотека, просмотрев таблицу экспорта Получив псевдокод, можно понять, что вначале выделается массив под 7 символов, потом каждый из этих символов проверяется с входным параметром, и если хоть один не совпал, то программа возвращает 0. Что же, это как раз наш пароль, он получается amor15 Шаг 9. Конец? 9. Осталось ввести пароль в программе и просмотреть флаг. Получается флаг: shb{t00_m4nys_573ps} Заключение В целом (как сказали мои друзья), таск получился достаточно объемным, однако вполне решаемым (за исключением места со steghide, поэтому я и дал хинт). Жаль, что никто с этого форма (да и с других тоже) не смог решить это задание. Надеюсь это решение было понятно всем и те, кто интересуется CTF и инфобезом в целом нашел тут что-то полезное.