Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Сегодня нам с тобой предстоит пройти через череду очень сложных веб‑уязвимостей, проэксплуатировав двухступенчатую SQL-инъекцию и уязвимость в модуле PHP Imagick. Для продвижения изучим Git-репозиторий, а для повышения привилегий напишем читалку файлов через пользовательский сканер.
А поможет нам в этом тренировочная машина Intentions с площадки Hack The Box сложного уровня (hard).
warning
Подключаться к машинам с HTB рекомендуется только через VPN. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
Добавляем IP-адрес машины в /etc/hosts
:
10.10.11.220 intentions.htb
И запускаем сканирование портов.
Справка: сканирование портов
Сканирование портов — стандартный первый шаг при любой атаке. Он позволяет атакующему узнать, какие службы на хосте принимают соединение. На основе этой информации выбирается следующий шаг к получению точки входа.
Наиболее известный инструмент для сканирования — это Nmap. Улучшить результаты его работы ты можешь при помощи следующего скрипта:
#!/bin/bashports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr 'n' ',' | sed s/,$//)nmap -p$ports -A $1
Он действует в два этапа. На первом производится обычное быстрое сканирование, на втором — более тщательное сканирование, с использованием имеющихся скриптов (опция -A
).
Результат работы скрипта
По результатам сканирования имеем всего два открытых порта: 22 — служба OpenSSH 8.9p1 и 80 — веб‑сервер Nginx 1.18.0. Брутить SSH на машинах с HTB не принято, а на сайте нас встречает форма авторизации и регистрации.
Страница авторизации
Регистрируем нового пользователя и авторизуемся на сайте.
Главная страница авторизованного пользователя
На странице профиля пользователя находим поле, на которое мы можем воздействовать.
Страница профиля пользователя
Заглянув в Burp History (а все действия я рекомендую проводить через Burp), обнаружим, что используется API.
История запросов
В поле изменения жанра я попробовал вставить нагрузку ' -- -
для SQL-инъекции и в ответе получил те же данные, только без пробелов.
Запрос на сервер
Ответ сервера
Стоит отметить, что нагрузку мы отправляем к API /api/v1/gallery/user/genres
, а проверяем измененные данные через API /api/v1/auth/user
.
Первым делом я решил перебрать разные нагрузки с помощью Burp Intruder. Но сложность в том, что нужно выполнять два запроса — один с нагрузкой, а другой для проверки результата. Тут нам могут помочь макросы, которые задаются через настройки Burp. Переходим к списку правил сессии и создаем новое.
Список правил сессий
В открывшемся окне в поле Rule action создаем новый макрос run post request macro
— то есть выполняемый после основного запроса.
Настройки правила
Для созданного макроса открываем Editor и выбираем запрос к API: /api/v1/auth/user
. Здесь мы получаем текущее значение настроек профиля.
Настройки макроса
Подтверждаем — и в окне с настройками созданного правила видим наш макрос.
Настройки правила
Переходим на вкладку Scope и в параметре URL scope выбираем Include all URLs, чтобы правило применялось абсолютно ко всем запросам.
Настройки правила
Подтверждаем установленные параметры и видим созданное правило в общем списке правил.
Список правил сессий
Теперь переносим запрос к API /api/v1/gallery/user/genres
в Burp Intruder. В настройках переходим к опции Grep → Extract и указываем интересующее нас поле, чтобы добавить его содержимое в общую таблицу результатов Intruder.
Burp Intruder — вкладка Positions
Burp Intruder — вкладка Settings
Так как мы используем правило с несколькими запросами, перебирать нужно в один поток.
Результат перебора
Просмотрев результат, я ничего необычного не нашел, кроме того, что мы получаем ошибку при отправке символа "
. Таким образом, как бы ни менялось поле жанра, ничего интересного мы не добиваемся.
Немного побродив по сайту, замечаем, что жанр также используется при просмотре галереи. Там выполняется вызов API /api/v1/gallery/user/feed
.
Запрос в Burp History
Мы получаем разные изображения в зависимости от установленного у нас жанра. Этот момент тоже необходимо протестировать, поэтому возвращаемся к нашим правилам и изменяем макрос, чтобы он выполнял запрос к API /api/v1/gallery/user/feed
. Для изменения выбираем Re-record macro и отмечаем нужный запрос.
Настройки макроса
Macro Recorder
После изменения макроса переводим запрос в Burp Repeater и отправляем обычную нагрузку с комментарием для Boolean-based-инъекции test'or 1=1 -- -
.
Запрос на сервер
Ответ сервера
В ответ получаем ошибку — видимо, из‑за кавычки. Тогда пробуем указать нагрузку без кавычки.
Запрос на сервер
Ответ сервера
Запрос обработан, но данные никакие не получаем. Переходим к перебору нагрузок.
Настраиваем Burp Intruder в один поток, только в этот раз ничего извлекать из ответа не будем, а просто отсортируем результат по размеру ответа.
Burp Intruder — вкладка Positions
Результат атаки
Источник: xakep.ru