ForbiddenBITS CTF 2013 (NaziWar)

Решения

http://blog.squareroots.de/en/2013/03/forbiddenbits-2013-write-up-naziwar/ (squareroots)
http://wiki.zenk-security.com/doku.php?id=forbiddenbits_2013_naziwar (Zenk-security)
Назад к списку заданий

Задание (web)

image00.jpg

Подробное описание

В этом задании вы должны были подключиться к web-сервису, используя Netcat.
Установив соединение, сервис просит вас указать свое имя.

> > Hello, comrade. I can't remember you. Define yourself to get a pass.
>

Получив его, сервис дает вам пароль (прокрутите вверх, чтобы увидеть его). Набираем имя и пароль и входим в систему. Теперь вы можете запустить инструкцию "help", которая выведет список доступных команд в системе. Так "list" показывает список файлов, а "read" выводит содержимое файла на экран. Однако вы не сможете прочитать файл "flag", система ругается на то, что только "мой фюрер имеет к нему доступ".

> read flag
Only my fuhrer can read the top secret flag.

Ага, значит, мы должны войти в систему как "hitler". Но получить пароль, как в случае с новым пользователем система не разрешает.

> > Hello, comrade. I can't remember you. Define yourself to get a pass.
> hitler
Sorry you can't be hitler. Shutdown now!

Итак, надо найти другой способ, чтобы стать hitler’ом.
Во-первых, мы заметили, что для заданного имени пользователя, вы всегда получите один и тот же пароль, то есть пароль генерируется из имени и всегда начинается с "fb" (логично предположить, что за сокращением стоит "forbiddenbits"). Мы попытались проверить разные значения. Ввели имя, как "aaaaaaaa", затем "aaaaaaab" и так далее, но в значениях пароля не нашли никаких очевидных закономерностей. Тем не менее, "ааааааааа" (длиной 9 символов), т. е. "a"*9 дает тот же самый пароль, что и "a"*8. Видимо, только первые 8 символов имени используются в генерации паролей.

И вот тут важный момент. Такое поведение напоминает результат работы функции crypt в Unix.

crypt представляет собой вариант DES, используемый в UNIX. В основном он используется в качестве однонаправленной функции для хранения паролей, но иногда и для шифрования. В отличие от DES, в crypt включена расширяющая перестановка (соль), обеспечивающая 212 вариантов перестановок.
Краткий алгоритм crypt("строка"):
"Строка" обрезается до восьми символов, и берется только 7 бит от каждого – формируя, тем самым, 8*7 = 56-разрядный DES ключ. Затем этим ключом шифруется блок нулевых бит, то, что получилось, с тем же ключом шифруется еще раз, затем еще раз – всего 25 итераций шифрования DES. К тому же используется 12-разрядная соль для дополнительного усложнения. Результат: соль и закодированный в base64 окончательный зашифрованный текст объединяются и выводятся на печать.

Теперь алгоритм шифрования мы знаем. Обратите внимание, что мы обрабатываем через crypt выбранное нами имя. Проверяем (делаем так, запускаем у себя crypt – например, здесь http://www.functions-online.com/crypt.html - и сравниваем результат с тем, что возвращает нам сервис):

Запрос                          Результат                      Результат
                                Наш crypt                       сервиса
crypt('xartrick', 'fb')         fbSSJ/i65tQvI                  fbSSJ/i65tQvI 
crypt('xartrickaaaa', 'fb')     fbSSJ/i65tQvI                  fbSSJ/i65tQvI
 
А теперь попробуем на имени, длина которого меньше 8 символов:
 
7 символов имени
crypt('xartric', 'fb')          fbINLoSgsl/Cc                  fb2u7t8VibXlI

Ага, получили различные результаты. Вывод напрашивается такой: если имя меньше 8 символов, то сервис дополняет его до 8 символов (возможно, с помощью какой-нибудь константы). Здесь нам потребуется небольшой брутфорс (достаточно перебрать 128 символов), чтобы найти дополненный символ.

Псевдокод брутфорса:

need = 'fb2u7t8VibXlI'
name = 'xartric'
 
for i in range(128):
    $crypt = crypt($name . chr($i), 'fb');
    if (crypt(name+chr(i), 'fb') == need) :
        print ("Padded char: "+chr(i))

Один символ дополнения нашли. Это "h". Т.е. crypt("xartrich") = "fb2u7t8VibXlI". Но мы хотим найти пароль для "hitler", а в имени 6 символов. Значит, надо найти еще один символ дополнения.

"xartrich" -> уменьшаем до 6 символов, убираем "c" -> "xartrih" -> сервис для имени "xartrih" возвращает "fbP8tYJcLAClg" -> делаем брутфорс и находим символ "4" -> проверяем у себя crypt("xartrih4") = "fbP8tYJcLAClg"

Результат:
Считаем у себя crypt("hitlerh4") и получаем " fboWsVzkSumM."
Заходим на сервис под "фюрером" и читаем файл "flag":

> > In order to get access to our system authentication is required!
+ Username:hitler
+ Password:fboWsVzkSumM.
> read flag
99fa57bd69cdcfdd2e2fb6419e2994ca

Пока не указано иное, содержимое этой страницы распространяется по лицензии Creative Commons Attribution-ShareAlike 3.0 License