Категория > Новости > HTB CrossfitTwo. Применяем на практике UNION SQL Injection, DNS rebinding и NPM Planting - «Новости»
HTB CrossfitTwo. Применяем на практике UNION SQL Injection, DNS rebinding и NPM Planting - «Новости»20-08-2021, 00:00. Автор: Лада |
Hack The Box уровня сложности Insane.infoЧитай также: «HTB CrossFit. Раскручиваем сложную XSS, чтобы захватить хост». РазведкаАдрес машины — 10.10.10.232, добавляем его в Справка: сканирование портовСканирование портов — стандартный первый шаг при любой атаке. В его результате атакующий узнает, какие службы на хосте принимают соединение. Эта информация позволяет выбрать дальнейший путь к получению точки входа. Наиболее известный инструмент для сканирования — это Nmap. Улучшить результаты его работы ты можешь при помощи следующего скрипта. ports=$(nmap -p- --min-rate=500 $1 | grep^[0-9] | cut -d '/' -f 1 | tr 'n' ',' | sed s/,$//)nmap -p$ports -A $1 Он действует в два этапа. На первом производится обычное быстрое сканирование, на втором — более тщательное сканирование, с использованием имеющихся скриптов для Nmap (опция Получаем следующие результаты. Результат работы скрипта Итак, мы имеем три открытых порта:
Первым делом стоит заглянуть на доступный сайт. Стартовая страница сайта Сканирование веб-контентаЧтобы ничего не осталось незамеченным, информацию на сайте будем собирать через Proxy. В шапке сайта находим навигацию, а также определяем, что последняя ссылка ведет на другой поддомен:
10.10.10.232 crossfit.htb employees.crossfit.htb
На самом сайте нас встречает форма авторизации, больше ничего мы там не получим. Так как все наши действия фиксированы в Burp, заглянем в Burp History. Там мы обнаружим, что при обращении к главной странице делается запрос на еще один поддомен. Вкладка Burp History Добавим этот поддомен в файл
10.10.10.232 crossfit.htb employees.crossfit.htb gym.crossfit.htb
Вкладка Burp HistoryВ ответе видим оповещение о смене протокола на WebSocket. Точка входаWebSocketWebSocket — это протокол связи поверх TCP-соединения, предназначенный для обмена сообщениями между браузером и веб‑сервером в режиме реального времени. WebSocket особенно хорош для сервисов, которые нуждаются в постоянном обмене данными, например для онлайновых игр, торговых площадок, чатов. После установления соединения уже нет деления на клиент и сервер, а есть два равноправных участника обмена данными. Каждый работает сам по себе и, когда надо, отправляет данные другому. Для просмотра сообщений по протоколу WebSocket перейдем к Burp WebSocket History. Там находим единственное сообщение, в содержимом которого будет приветствие, информация о команде Вкладка Burp WebSocket History Работать с WebSocket будет удобно с помощью интерактивной консоли. Ее несложно организовать при помощи Python 3 и модуля
python3 -mwebsockets ws://gym.crossfit.htb/ws/
Установление соединения WebSocketsПосле подключения нам сразу пришло знакомое сообщение. Давай попробуем получить справку. Сообщение с командой нужно будет отправить тоже в JSON.
{"command":"help"}
Запрос справкиВ ответе нам сообщают о неверном токене, поэтому повторяем отправку, но включаем новый параметр.
{"command":"help","token":"29a20a82768c1531e28fe18a519a59fbe986801ebdcd543920dbe3bdaa8c20d9"}
Повторный запрос справкиНаше сообщение остается без ответа, а после повторной отправки нам вообще сообщают, что токен больше не действителен и дают новый токен. Интересно! Давай поищем фрагмент кода, который отвечает за отправку сообщений. В панели браузера переходим к вкладке Debug и находим файл Повторный запрос справки В коде находим отправку сообщения в параметре
{"message":"help","token":"cdfc745eb97670fb768678a2fbe3d37eabd307dac630720392892e5525ad87f8"}
Повторный запрос справкиНаконец нам пришел ответ, откуда мы узнаем о трех доступных командах: Отправим все три команды и внимательно посмотрим на ответ сервера. Команда coachesКоманда classesКоманда memberships Во всех случаях нам вернули HTML-код страницы. В первом варианте мы получаем просто информацию о тренерах, во втором — список занятий, а вот в ответ на команду Код функции check_availability Функция отправляет три параметра:
{"message":"available","params":"1","token":"6775bfe48d278f7a5bc90dcb6c0e9b47e8cfcfa266446ef8345f9e01e83e6233"}
Отправка сообщения availableВ этом сообщении я отправил четыре параметра и получил два разных варианта ответа: успешный и нет. При этом мы еще получаем пояснение в параметре Дальше я написал скрипт на Python 3, который в цикле запрашивает параметр.
#!/usr/bin/python3
import json
from websocket import create_connection
def send_command(ws, token):
inp = input("> ")
ws.send('{"message":"available","params":"' + inp + '","token":"' + token + '"}')
req = ws.recv()
token = json.loads(req)['token']
print(req)
return token
ws = create_connection("ws://gym.crossfit.htb/ws/")
req = ws.recv()
token = json.loads(req)['token']
for _ in range(100):
token = send_command(ws, token)
Результат работы скриптаВсе работает, идем дальше. SQL InjectionТак как ответ выбирается в зависимости от отправленного параметра, первым делом я решил проверить SQL-инъекцию. Благо я регулярно составляю словари для тестов и нужный как раз имелся под рукой. Чтобы использовать его, немного подправим код. import jsonimport timefrom websocket import create_connectiondef send_command(ws, token): Результат работы скриптаПри отправке любого сообщения, содержащего двойную кавычку ( Результат работы скриптаРезультат работы скрипта (продолжение) Просматривая вывод, обнаружим реакцию сервера на четыре нагрузки. Смотрим комментарий SQL:
Я нашел уязвимость, и теперь ее нужно эксплуатировать. Первым делом найдем нагрузки для эксплуатации, поэтому сменим словарь и повторим выполнение скрипта. Результат работы скриптаРезультат работы скрипта (продолжение) В результате есть реакция на UNION-нагрузки. А именно при отправке Вернем последние две строки нашего первоначального скрипта для ручной работы и приступим к эксплуатации.
for _ in range(100):
token = send_command(ws, token)
Первым делом получим версию базы данных.
-1UNION ALL SELECT 1,@@version #
Версия базы данныхНа хосте работает MySQL, поэтому дальше мы будем использовать ее синтаксис. Получим имена всех имеющихся баз. Мы можем выводить всего одну строку, поэтому используем функцию
-1UNION ALL SELECT 1,GROUP_CONCAT(schema_name,' ')FROM information_schema.schemata #
Список имен базБаза Привилегии пользователя для базМы можем работать как с базой Таблицы в базах crossfit и employeesВ базе Получим названия столбцов в таблице Столбцы в таблице employeesМы можем получить учетные данные для сайта. Запросим имена, пароли и адреса электронной почты. Содержимое таблицы employeesУ нас есть четыре пользователя и хеши от их паролей. С помощью утилиты hashid определим тип хешей. Результат работы hashid Наиболее вероятным будет хеш SHA-256 из‑за его популярности, однако с наскока сломать хеши и авторизоваться на сайте не вышло. Ни в онлайновых базах, ни с помощью локального перебора узнать хоть один из прообразов хеша не удалось. Поэтому посмотрим, какие еще у нашего пользователя базы данных есть привилегии. Привилегии пользователя базы данныхМы можем читать файлы на хосте! Первым делом, конечно же, прочитаем
-1UNION ALL SELECT 1,LOAD_FILE('/etc/passwd') #
Находим пользователей
-1UNION ALL SELECT 1,LOAD_FILE('/etc/relayd.conf') #
Содержимое файла /etc/relayd.confТак мы находим еще один домен Форма авторизации Так как запросы мы по‑прежнему делаем через Burp Proxy, нам это помогает определить подключение некоего API, о чем говорит обращение к Вкладка Burp History При попытке авторизации с тестовыми учетными данными обнаруживаем еще одну страницу, которая работает с форматом JSON. Выполнение запроса на авторизацию К тому же на сайте имеется форма регистрации. Кнопка в ней может быть и отключена, но мы можем попробовать все равно авторизоваться — при помощи Burp Repeater. Получим имена переменных из исходного кода страницы и отправим тестовые данные на Форма регистрацииВыполнение запроса на регистрацию Тут пока больше ничего не сделать, поэтому идем дальше. Перейти обратно к новости |