Найти в Дзене
B0rn2beR00T

Решение Standoff 365 (Внедрение SQLi на узле tokenizer.edu.stf)

Приветствую! Решим непростой и довольно длинный кейс с веб-ресурсов, где зашиты JWT-токен и SQLi-уязвимость. Приступим! Хост tokenizer.edu.stf находится по адресу 10.124.1.239. Просканируем нашу цель и посмотрим какие порты открыты: Не густо! Открыты следующие порты: Зайдём на 80-й порт и посмотрим что там. Итак, у нас есть кнопка, которая генерит JWT-токен. Генерим такой (Submit Query), чтобы поковырять его в дальнейшем: Закинем токен в jwt.io и разберём его по деталям: Теперь мы видим параметры в части с payload токена. Это нам и нужно. Параметр dir намекает на то, что токен даёт доступ к каким-то директориям. Посмотрим есть ли что-то ещё на хосте. Для этого профаззим директории: Видим страницу check.php, которая, судя по всему, проверяет токен. Мы всё верно предположили. При добавлении параметра jwt вместе с токеном нам выдадут список семплов. Мы не сможем их прочитать без скрафченного токена с нужными правами. Доступ к семплам мы получили благодаря dir=samples в полезной нагрузке
Оглавление

Приветствую!

Решим непростой и довольно длинный кейс с веб-ресурсов, где зашиты JWT-токен и SQLi-уязвимость. Приступим!

-2

Сбор информации

Хост tokenizer.edu.stf находится по адресу 10.124.1.239. Просканируем нашу цель и посмотрим какие порты открыты:

-3

Не густо! Открыты следующие порты:

  • 22/tcp (ssh)
  • 80/tcp (http)
  • 1720/tcp (не определён сервис)
  • 5432/tcp (postgresql)

Зайдём на 80-й порт и посмотрим что там.

Крутим JWT-токен

-4

Итак, у нас есть кнопка, которая генерит JWT-токен. Генерим такой (Submit Query), чтобы поковырять его в дальнейшем:

-5

Закинем токен в jwt.io и разберём его по деталям:

-6

Теперь мы видим параметры в части с payload токена. Это нам и нужно. Параметр dir намекает на то, что токен даёт доступ к каким-то директориям.

Посмотрим есть ли что-то ещё на хосте. Для этого профаззим директории:

-7

Видим страницу check.php, которая, судя по всему, проверяет токен.

-8

Мы всё верно предположили. При добавлении параметра jwt вместе с токеном нам выдадут список семплов. Мы не сможем их прочитать без скрафченного токена с нужными правами. Доступ к семплам мы получили благодаря dir=samples в полезной нагрузке токена.

-9

При попытке скачать семпл из директории мы получим пустой файл.

-10

Samples не так интересны нам. Для того, чтобы поменять путь к директории токена нужно знать ключ его подписи.

В таком случае подберём его, пробрутив хеш HS256 при помощи hashcat:

hashcat -a 3 -m 16500 jwt ?a?a?a?a?a?a?a -i --increment-min=4

Ключ: 2e025
Ключ: 2e025

Через достаточно долгий перебор получаем ключ. Далее поменяем директорию на /var/www/html и вставим ключ подписи токена. /var/www/html - это общедоступная директорию, которая содержит страницы веб-ресурса. Там могут быть интересные файлы для нас.

-12

Теперь можно прочитать файлы новой директории:

-13

Посмотрим что есть в supersecretadminloginyouneverguess.php (ну сразу хочется же проверить такое). Ранее мы не нашли этот файл из-за отсутствия такого имени в словаре фазера.

-14

Тут предусмотрена авторизация, которая легко проходиться при помощи admin:admin

Крутим SQLi

При входе видим следующую страницу для поиска пользователя в БД. Наталкивает на то, что тут есть SQLi.

-15

Сохраним запрос с Burp Suite, где есть POST-запрос с данными авторизации, для поиска SQLi.

-16

Поищем SQLi при помощи sqlmap:

sqlmap -r request.txt --level 5 --risk 3

-17

Параметр phone оказывается уязвим:

-18

По условию мы знаем таблицу secret. Выберем эту таблицу и задампим БД.

sqlmap -r request.txt --level 5 --risk 3 -p phone -T secret --dump

-19

Тем самым и получим флаг!

-20

Выводы

Довольно длинный и непростой кейс. Интересно, когда в задании нет фокуса на одной уязвимости, а есть плавное перетекание с одного в другое.

Если бы токен был подписан ключом сильнее, то я бы состарился прежде чем его забрутил.

SQL-инъекцию найти было просто. Нашли инъекцию, задампили. Вот и всё :)

Спасибо за внимание! Не забывайте оценивать мой труд лайком и, по возможности, комментарием. Всех благ!