Нашему агенту удалось найти некоторые сервера злоумышленников.
У него есть образ сервера, но ему никак не удаётся подключиться к нему.
Посмотрим, может ты разберёшься как получить с сервера что-то полезное.
nc <server> <ip>
cd deploy
docker-compose up --build -d
Архив из директории public/ и IP-адрес + PORT сервера на котором будет запущен сервер
ELF 64bit, C
Смысл таска заключается в том, чтобы достать оригинальный бинарь сервера которые запускается с помощью некоторого просто загрузчика через запуск из памяти.
- Открываем бинарь в IDA PRO и сразу видим, что его секции перемешаны и кода практически нет
- Можно посмотреть, что делает исполняемый файл в динамике с помощью
strace
- Подозрительным фактом будет являться то, что он открывает и читает сам себя, после чего вызывает системный вызов
memfd_create("", MFD_CLOEXEC)
- Такое поведение может означать то, что бинарь хранит в себе ещё один исполняемый файл
- Немного проанализировав содержимое можно найти странный блоб дописанный в конец файла начиная с оффсета 0x38d8
- Запускаем бинарь в отладчике и дампим сегмент памяти созданный через
memfd_create
- Получаем ещё один исполняемый файл запакованный UPX-ом, распаковываем и получаем оригинальный бинарь сервера
- Он будет представлять собой пострипанный бинарь без использования библиотечных функций
- Первое что делает бинарь это генерирует ключ для шифрования трафика. Ключ генерируется с помощью DH.
- В качестве алгоритма шифрования испольузется Serpent
- После генерации ключа весь трафик шифруется, также внутри шифрованного трафика используется свой кастомный протокол передачи, но он довольно простой
- После генерации ключа пользователю становятся доступны некоторые опции: открыть файл, прочитать файл, получить прочитанные данные, закрыть файл
- Чтобы получить прочитанные данные нужно ввести корректный токен доступа.
- Корректность проверяется путём сравнения CRC32 от переданного токена с некоторым заложенным значением
- Обойти эту проверку можно с помощью crc-hack
- Нужно написать клиент, который сможет обратиться к серверу и передать нужные команды на чтение файла с флагом
Пример клиента получающего флаг
CUP{69dc8553bac9f6cd9665ddfd6d62e3c2}