Категория > Новости > HTB OverGraph. Извлекаем данные через цепочку Open Redirect, RXXS и CSTI - «Новости»
HTB OverGraph. Извлекаем данные через цепочку Open Redirect, RXXS и CSTI - «Новости»12-08-2022, 00:02. Автор: Тарас |
Hack The Box.warningПодключаться к машинам с HTB рекомендуется только через VPN. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками. РазведкаСканирование портовДобавляем IP-адрес машины в
10.10.11.157 overgraph.htb
И запускаем сканирование портов. Справка: сканирование портовСканирование портов — стандартный первый шаг при любой атаке. Он позволяет атакующему узнать, какие службы на хосте принимают соединение. На основе этой информации выбирается следующий шаг к получению точки входа. Наиболее известный инструмент для сканирования — это Nmap. Улучшить результаты его работы ты можешь при помощи следующего скрипта. ports=$(nmap -p- --min-rate=500 $1 | grep^[0-9] | cut -d '/' -f 1 | tr 'n' ',' | sed s/,$//)nmap -p$ports -A $1 Он действует в два этапа. На первом производится обычное быстрое сканирование, на втором — более тщательное сканирование, с использованием имеющихся скриптов (опция Результат работы скрипта Открыто два порта: 22 — служба OpenSSH 8.2p1 и 80 — веб‑сервер Nginx 1.18.0. Nmap показал нам, что выполняется редирект на адрес
10.10.11.157 overgraph.htb graph.htb
Главная страница http://graph.htbСайт оказался одностраничным, поэтому нужно найти новые цели для тестирования. Сканирование веб-контентаПопробуем поискать скрытые каталоги и файлы при помощи ffuf. Справка: сканирование веба c ffufОдно из первых действий при тестировании безопасности веб‑приложения — это сканирование методом перебора каталогов, чтобы найти скрытую информацию и недоступные обычным посетителям функции. Для этого можно использовать программы вроде dirsearch и DIRB. Я предпочитаю легкий и очень быстрый ffuf. При запуске указываем следующие параметры:
ffuf -u 'http://graph.htb/FUZZ' -t 256 -wdirectory_2.3_medium_lowercase.txt
Результат сканирования каталогов с помощью ffufИ не находим ничего интересного, даже в файле
ffuf -u 'http://graph.htb/' -t 256 -wsubdomains-top1million-110000.txt -H 'Host: FUZZ.graph.htb' --fs 178
Результат сканирования поддоменов с помощью ffufИ находим новый поддомен
10.10.11.157 overgraph.htb graph.htb internal.graph.htb
Но, открыв сайт в браузере, сразу натыкаемся на форму авторизации. Форма авторизации http://internal.graph.htb Так как всю работу проводим через Burp, то обнаружим в Burp History обращение еще к одному домену — Логи Burp History Добавляем еще одну запись в файл
10.10.11.157 overgraph.htb graph.htb internal.graph.htb internal-api.graph.htb
Главная страница сайта http://internal-api.graph.htbНа странице используется GraphQL. Это язык запросов, с помощью которого клиентские приложения работают с данными. «Схемы» GraphQL позволяют организовывать создание, чтение, обновление и удаление данных в приложении. Давай получим данные
{__schema{types{name,fields{name}}}}
Ответ сервераОтвет сервера (продолжение)На этом пока все, но мы еще не сканировали каталоги на новом домене. Попробуем сделать это. Но, как только мы обратимся к любой странице, получим ответ, что запросы GET не поддерживаются. Поэтому будем сканировать запросом POST. А так как на домене крутится API, то и использовать будем соответствующий словарь.
ffuf -u 'http://internal-api.graph.htbFUZZ' -t 256 -XPOST -wapiscan.txt
Результат сканирования API с помощью ffufИ находим три новые страницы, с которыми начнем работу. Точка входаИтак, мы имеем следующие API:
Я начал со страницы
{
"username":"ralf",
"email":"ralf@graph.htb",
"password":"ralf"
}
Попытка регистрации пользователяНо в ответ нам говорят, что у нас неверный email или он не верифицирован. Это интересно, так как у нас остается всего две страницы для регистрации. Видимо, страница
{
"email":"ralf@graph.htb"
}
Получение кодаИ нам сообщают, что четыре цифры были отправлены на указанный почтовый ящик. По тестовому сообщению на странице Запрос к /api/verify Я попробовал перебрать этот код с помощью Burp Intruder, благо комбинаций всего 10 000. Но уже на одном из первых запросов все ломается, так как мы превысили количество попыток! Сообщение о превышении количества запросов Я очень долго просидел на этом этапе — пришлось даже просить подсказки у друзей. Мне посоветовали углубиться в механизм проверки кода. Тогда, потратив еще немного времени, я нашел NoSQL-инъекцию, которая позволяет верифицировать почту, предоставляя неправильный код. В данном запросе мы получим положительный результат, если код не равен 0000. "email":"ralf@graph.htb","code":{"$ne":"0000"}} Верификация почтыПриходит подтверждение того, что почта верифицирована. Повторим регистрацию и получим сообщение, что пароль и его подтверждение не совпадают. Попытка регистрации пользователя Тогда я перепробовал разные имена поля подтверждения пароля и определил, что в данном случае подходит Регистрация пользователя И аккаунт создан! Перейдем к форме авторизации на втором домене и авторизуемся. Главная страница http://internal.graph.htb А во входящих находим сообщение от пользователя Sally. Входящие сообщения Нас просят прислать ссылку. Попробуем открыть локальный сервер и скинуть ссылку на него. В итоге приходит запрос. Логи веб‑сервера Python 3 Давай посмотрим, как это можно использовать. Точка опорыЕсли еще раз взглянуть на страницу, можно заметить над меню надпись Исходный код страницыЛокальное хранилище браузера Перейдем в настройки профиля и увидим то же самое, только с возможностью изменить эти значения. Страница Profile CSTIНадпись Новые значения имени пользователяОтображение имени пользователя Как можно увидеть, вместо введенной строки получаем результаты выражений, а значит, есть уязвимость в шаблонах! Вот только в локальном хранилище эти значения хранятся, как и вводились. Значит, шаблон работает на клиентской стороне, а это уже путь для CSTI — инъекции шаблонов на стороне клиента. Локальное хранилище браузера Также я обратил внимание на параметр Измененное меню Только вот форма загрузки не дает загрузить файл. Если вернемся к нашей схеме GraphQL, то можем посмотреть на необходимые параметры, к примеру Параметры из схемы GraphQL Таким образом, нам нужен Исходный код страницы AngularJS — это популярная библиотека jаvascript, которая сканирует HTML на предмет тегов с атрибутом Уязвимость Template Injection возникает, когда приложение, используя какой‑нибудь шаблонизатор, динамически внедряет пользовательский ввод в веб‑страницу. Когда страница отображается, фреймворк ищет в странице шаблонное выражение и выполняет его. Основное отличие CSTI от SSTI заключается в том, что при CSTI мы можем добиться лишь выполнения произвольного кода на jаvascript. Две самые популярные нагрузки для CSTI в AngularJS: {{$on.constructor('alert(1)')()}} Новое имя пользователяОбновляем страницу и первым делом видим окошко алерта. Вызов alert(1) при загрузке страницы А теперь попробуем эксфильтровать токен, для чего создадим у себя в хранилище тестовый. Локальное хранилище браузера В качестве нагрузки будем использовать знаменитый стилер, который похищает данные через картинку, а доступ к хранилищу получим через
Обновляем страницу и в логах локального веб‑сервера находим значение тестового токена. Логи веб‑сервера Нагрузка для эксфильтрации готова, теперь разберемся, как подсунуть пользователю наш код. Open RedirectЯ снова просмотрел все сайты и на самом главном домене нашел что‑то вроде редиректа. Код главной страницы http://graph.htb Если существует GET-параметр
http://graph.htb/?redirect=jаvascript:alert(1)
Выполнение кода через jаvascript URLОсталось разобраться с данными, которые отправляются для изменения имени пользователя. GraphQLВ Burp History найдем запрос, которым мы изменили собственное имя. Запрос на изменение профиля Один из параметров — Тип task Нас интересует тип Тип Query Таким образом, нам нужно выполнить запрос Перейти обратно к новости |