ХакерДом : CTF/UralCTF4/seminar/cthulhu

Название приложения: Cthulhu server
Язык программирования: С, GAS
Тип уязвимости: непредусмотренная функциональность в приложении
Тип задания: reverse engineering, debugging

Описание функциональности
Cthulhu server представляет из себя приложение для операционной системы
Linux с урезанной функциональностью веб-сервера, слушающего tcp порт 32000 и
создающего новый процесс для обработки клиента с помощью системного вызова
fork().

Реализованы методы GET и POST. При запросе по методу GET, например:
GET /filename HTTP/1.0\r\n\r\n
по протоколу HTTP/1.1 выводится содержимое файла filename, если такой
существует, либо показывается файл index.html. Этот метод используется для
проверки флагов.

Метод POST используется для размещения флагов. Например запрос:
POST filename HTTP/1.0\r\n\r\n
приводит к созданию файла filename и записи в него строки filename.

Реализация
Функции int main() содержит необходимую инициализацию, создание
слушающего сокета и вечный цикл обработки клиентов. Для обработки запроса от
клиента используется функция
char *processquery(char *query), которая в зависимости от запроса зовет функции
void postflag(char *s), void getflag(char *s) или char *showindex().

Возможным решением по устранению уязвимостей может быть написание нового
сервиса с аналогичной функциональностью. Для затруднения этого подхода
используется функция, реализующая некоторое хеширование, char *hidden(char *s),
с помощью которой происходит проверка, не был ли подменен сервис.

Для усложнения анализа результата дизассемблирования все функции в
приложении объявлены как inline.

Уязвимости
Данная программа содержит непредусмотренную веб-сервером
функциональность. А именно, при использовании метода, название которого
удовлетворяет некоторому условию, вместо URL можно передать строку, которая
будет обработана следующим образом. Будет создан новый файл, являющийся частью
программы на языке ассемблера GAS. В конец этого файла будет дописана переданная
строка. Файл будет сассемблирован и слинкован. В случае успешности предыдущих
действий, полученный ELF файл будет запущен, и его stdout будет выслан клиенту.
Полная программа на ассемблере должна выдавать листинг текущей директории, файлы
которой и являются флагами. В ассемблерном файле не хватает строки
int $0x80

Задачей студента является обнаружить данную функциональность, подобрать
метод запроса таким образом, чтобы URL был обработан описанным выше способом,
разобраться в ассемблерном файле и выявить недостающую строку.

Также в основном цикле программы есть переполнение стека, использование
которого может быть облегчено отключением средств защиты стека в новых ядрах
Linux.

Устранение уязвимостей
С помощью любого редактора ELF файлов необходимо заменить некоторые
условные переходы на безусловные, что предотвратит выполнение операций с
ассемблерным файлом.

Возможно написание аналогичного сервиса, но это заставит студента
подробно разобраться в реализации функции hidden.

Использование в учебном процессе
Данная программа может быть использована в учебном процессе для развития
навыков reverse engineering, таких как: дизассемблирование, работа с
ассемблером, отладка.

(c) tswr, hackerdom.ru