Содержание статьи
Наша цель — прохождение средней по сложности машины Noter с площадки Hack The Box.
warning
Подключаться к машинам с HTB рекомендуется только через VPN. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
Разведка
Сканирование портов
Добавляем IP-адрес машины в /
:
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
).
![Результат работы скрипта Результат работы скрипта](https://static.xakep.ru/images/073cc55f71e86c2d950fa79bf26b21fe/27701/02_VhOhJTh.png)
Нашлось три открытых порта:
- 21 — служба vsftpd 3.0.3;
- 22 — служба OpenSSH 8.2p1;
- 5000 — веб‑сервер Python Werkzeug 2.0.2.
Анонимный вход на FTP закрыт, с SSH мы ничего не сделаем, поэтому идем смотреть веб.
![Главная страница сайта http://noter.htb:5000/ Главная страница сайта http://noter.htb:5000/](https://static.xakep.ru/images/073cc55f71e86c2d950fa79bf26b21fe/27700/03_3pZWrQW.png)
Точка входа
На сайте есть возможность регистрироваться и авторизоваться, чем мы обязательно должны воспользоваться.
![Главная страница зарегистрированного пользователя Главная страница зарегистрированного пользователя](https://static.xakep.ru/images/073cc55f71e86c2d950fa79bf26b21fe/27699/04_bplaG5R.png)
Я всю работу выполняю через Burp, поэтому в идентификаторе сессии пользователя сразу заметил токен JWT.
![Запрос на сервер в Burp Pro Запрос на сервер в Burp Pro](https://static.xakep.ru/images/073cc55f71e86c2d950fa79bf26b21fe/27698/05_dOsrDM2.png)
JWT
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'
![Получение информации о сеансе Получение информации о сеансе](https://static.xakep.ru/images/073cc55f71e86c2d950fa79bf26b21fe/27697/06_DC5Lhpc.png)
Для создания HMAC требуется секретный ключ. Если мы сумеем восстановить или взломать секретный ключ, то сможем вносить любые изменения в информацию о сеансе. С помощью Flask-Unsign можем попробовать пробрутить секрет.
flask-unsign --wordlist rockyou.txt --unsign --cookie 'eyJsb2dnZWRfaW4iOnRydWUsInVzZXJuYW1lIjoicmFsZiJ9.YvKLvw.fDwY2juxacH9LTQV7xx_RyGo8EM' --no-literal-eval
![Получение секретного ключа Получение секретного ключа](https://static.xakep.ru/images/073cc55f71e86c2d950fa79bf26b21fe/27696/07_OKaiq9m.png)
Мы получили секретный ключ, а значит, можем записать свои данные в сеанс, в данном случае сменить пользователя. Генерируем сессию, устанавливаем в браузере и обновляем страницу. Я попробовал пользователя admin
, но ничего не вышло.
flask-unsign --sign --cookie "{'logged_in': True, 'username': 'admin'}" --secret 'secret123' --legacy
![Генерирование нового токена Генерирование нового токена](https://static.xakep.ru/images/073cc55f71e86c2d950fa79bf26b21fe/27684/08_vE3oDlJ.png)
![Ошибка авторизации Ошибка авторизации](https://static.xakep.ru/images/073cc55f71e86c2d950fa79bf26b21fe/27683/09_uKW1epR.png)
Скорее всего, такого пользователя не существует, поэтому нужно найти способ определить реальных пользователей. Сайт работает на Flask, к тому же предназначен для хранения заметок, поэтому первым делом я стал искать SSTI (включение шаблонов на стороне сервера) и XSS. Начал с создания заметки.
![Создание заметки с нагрузкой Создание заметки с нагрузкой](https://static.xakep.ru/images/073cc55f71e86c2d950fa79bf26b21fe/27695/10_cXdQUEn.png)
Затем я определил все места, где происходит вывод этого текста, но, к моему сожалению, везде используется экранирование.
![Главная страница сайта Главная страница сайта](https://static.xakep.ru/images/073cc55f71e86c2d950fa79bf26b21fe/27694/11_3zqvFjt.png)
![Заметки пользователя Заметки пользователя](https://static.xakep.ru/images/073cc55f71e86c2d950fa79bf26b21fe/27693/12_cD9rLU4.png)
![Содержимое созданной заметки Содержимое созданной заметки](https://static.xakep.ru/images/073cc55f71e86c2d950fa79bf26b21fe/27692/13_HQeRq05.png)
Тест нагрузкой для XSS также не увенчался успехом. Тогда я решил посмотреть на механизм авторизации, а именно на сообщения, которые сервер отдаст в разных ситуациях. Иногда в таких случаях помогает определять время, которое затрачивается на проверку правильных и неправильных учетных данных. Но так далеко идти оказалось не нужно: сообщения для существующего и несуществующего пользователя оказались разными.
![Ответ сервера для несуществующего аккаунта Ответ сервера для несуществующего аккаунта](https://static.xakep.ru/images/073cc55f71e86c2d950fa79bf26b21fe/27691/14_OPyi7ip.png)
![Ответ сервера для существующего аккаунта Ответ сервера для существующего аккаунта](https://static.xakep.ru/images/073cc55f71e86c2d950fa79bf26b21fe/27690/15_WPhHv1r.png)
Точка опоры
Вооружаемся Burp Intrueder и принимаемся за перебор.
Перекидываем запрос в Burp (Ctrl-I, Ctrl-Shift-I) и отмечаем для перебора логин.
![Burp Intruder — вкладка Position Burp Intruder — вкладка Position](https://static.xakep.ru/images/073cc55f71e86c2d950fa79bf26b21fe/27689/16_sOYynNW.png)
Список имен пользователей берем из набора SecLists.
![Burp Intruder — вкладка Payloads Burp Intruder — вкладка Payloads](https://static.xakep.ru/images/073cc55f71e86c2d950fa79bf26b21fe/27688/17_Z4GPE5I.png)
Устанавливаем 256 потоков (можно и больше).
![Burp Intruder — вкладка Resource Pool Burp Intruder — вкладка Resource Pool](https://static.xakep.ru/images/073cc55f71e86c2d950fa79bf26b21fe/27687/18_2GssZjI.png)
В результирующую таблицу добавим еще один столбец, куда будет попадать сообщение об ошибке.
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»