Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
В этом райтапе мы обойдем авторизацию в приложении на Flask, затем изучим исходные коды приложения, чтобы найти и проэксплуатировать уязвимость. Для повышения привилегий используем уязвимость установки плагина в MySQL.
Наша цель — прохождение средней по сложности машины Noter с площадки Hack The Box.
warning
Подключаться к машинам с HTB рекомендуется только через VPN. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
Добавляем IP-адрес машины в /etc/hosts
:
10.10.11.160 noter.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
).
Результат работы скрипта
Нашлось три открытых порта:
Анонимный вход на FTP закрыт, с SSH мы ничего не сделаем, поэтому идем смотреть веб.
Главная страница сайта http://noter.htb:5000/
На сайте есть возможность регистрироваться и авторизоваться, чем мы обязательно должны воспользоваться.
Главная страница зарегистрированного пользователя
Я всю работу выполняю через Burp, поэтому в идентификаторе сессии пользователя сразу заметил токен JWT.
Запрос на сервер в Burp Pro
JSON Web Token хранит необходимую информацию о текущем сеансе. В числе прочего в нем содержится HMAC — hash-based message authentication code, код авторизации на основе хеша. Его‑то нам и предстоит подделать.
Для работы с JWT будем использовать утилиту Flask-Unsign.
sudo pip3 install Flask==2.1.0 flask_unsign
flask-unsign --decode --cookie 'eyJsb2dnZWRfaW4iOnRydWUsInVzZXJuYW1lIjoicmFsZiJ9.YvKLvw.fDwY2juxacH9LTQV7xx_RyGo8EM'
Получение информации о сеансе
Для создания HMAC требуется секретный ключ. Если мы сумеем восстановить или взломать секретный ключ, то сможем вносить любые изменения в информацию о сеансе. С помощью Flask-Unsign можем попробовать пробрутить секрет.
flask-unsign --wordlist rockyou.txt --unsign --cookie 'eyJsb2dnZWRfaW4iOnRydWUsInVzZXJuYW1lIjoicmFsZiJ9.YvKLvw.fDwY2juxacH9LTQV7xx_RyGo8EM' --no-literal-eval
Получение секретного ключа
Мы получили секретный ключ, а значит, можем записать свои данные в сеанс, в данном случае сменить пользователя. Генерируем сессию, устанавливаем в браузере и обновляем страницу. Я попробовал пользователя admin
, но ничего не вышло.
flask-unsign --sign --cookie "{'logged_in': True, 'username': 'admin'}" --secret 'secret123' --legacy
Генерирование нового токена
Ошибка авторизации
Скорее всего, такого пользователя не существует, поэтому нужно найти способ определить реальных пользователей. Сайт работает на Flask, к тому же предназначен для хранения заметок, поэтому первым делом я стал искать SSTI (включение шаблонов на стороне сервера) и XSS. Начал с создания заметки.
Создание заметки с нагрузкой
Затем я определил все места, где происходит вывод этого текста, но, к моему сожалению, везде используется экранирование.
Главная страница сайта
Заметки пользователя
Содержимое созданной заметки
Тест нагрузкой для XSS также не увенчался успехом. Тогда я решил посмотреть на механизм авторизации, а именно на сообщения, которые сервер отдаст в разных ситуациях. Иногда в таких случаях помогает определять время, которое затрачивается на проверку правильных и неправильных учетных данных. Но так далеко идти оказалось не нужно: сообщения для существующего и несуществующего пользователя оказались разными.
Ответ сервера для несуществующего аккаунта
Ответ сервера для существующего аккаунта
Вооружаемся Burp Intrueder и принимаемся за перебор.
Перекидываем запрос в Burp (Ctrl-I, Ctrl-Shift-I) и отмечаем для перебора логин.
Burp Intruder — вкладка Position
Список имен пользователей берем из набора SecLists.
Burp Intruder — вкладка Payloads
Устанавливаем 256 потоков (можно и больше).
Burp Intruder — вкладка Resource Pool
В результирующую таблицу добавим еще один столбец, куда будет попадать сообщение об ошибке.
Источник: xakep.ru