Хакер - HTB Forge. Эксплуатируем SSRF для доступа к критической информации
hacker_frei
RalfHacker
Содержание статьи
- Разведка. Сканирование портов
- Точка входа
- Точка опоры
- Локальное повышение привилегий
Сегодня мы с тобой пройдем среднюю по сложности машину с площадки Hack The Box под названием Forge. Проэксплуатируем уязвимость SSRF в форме загрузке файлов и через эту уязвимость получим данные с локального FTP-сервера. А осложнять все это будут фильтры адресов на стороне сервера.
WARNING
Подключаться к машинам с HTB рекомендуется только через VPN. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
РАЗВЕДКА. СКАНИРОВАНИЕ ПОРТОВ
Добавляем IP-адрес машины в /etc/hosts:
10.10.11.111 forge.htb
И запускаем сканирование портов.
Справка: сканирование портов
Сканирование портов — стандартный первый шаг при любой атаке. Он позволяет атакующему узнать, какие службы на хосте принимают соединение. На основе этой информации выбирается следующий шаг к получению точки входа.
Наиболее известный инструмент для сканирования — это Nmap. Улучшить результаты его работы ты можешь при помощи следующего скрипта.
#!/bin/bash
ports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr '\n' ',' | sed s/,$//)
nmap -p$ports -A $1
Он действует в два этапа. На первом производится обычное быстрое сканирование, на втором — более тщательное сканирование, с использованием имеющихся скриптов (опция -A).
#!/bin/bash
ports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr '\n' ',' | sed s/,$//)
nmap -p$ports -A $1

Мы нашли три открытых порта, один из которых фильтруется:
- порт 21 — служба FTP (фильтруется);
- порт 22 — служба OpenSSH 8.2p1;
- порт 80 — веб‑сервер Apache 2.4.1.
Так как FTP недоступен, а SSH пробивать смысла нет, переходим к тестированию сайта на веб‑сервере. Первым делом осмотримся в поиске точек входа.

Нас встречает галерея. В верхнем правом углу сайта находим ссылку на форму загрузки файлов. Файл можно загрузить на сервер двумя путями: напрямую и через URL.


Первая мысль — загрузить шелл. Но сервер принимает только картинки, и выполнить вставку кода не получилось. В сервисах, где файлы загружаются через URL, стоит проверить наличие уязвимости SSRF.
Справка: SSRF
SSRF — это атака на сервер, в результате которой злоумышленник получает возможность отправлять запросы от имени скомпрометированного хоста. SSRF может быть использована в DoS-кампаниях для маскировки реального источника атаки. В таких случаях уязвимый хост выступает в качестве прокси‑сервера.
Для теста SSRF указываем адрес 127.0.0.1. Но получаем сообщение о том, что запрос заблокирован, так как URL включен в черный список.

Тогда возникла идея поискать другие точки — просканировать сайт на предмет скрытого контента.
Справка: сканирование веба c ffuf
Одно из первых действий при тестировании безопасности веб‑приложения — это сканирование методом перебора каталогов, чтобы найти скрытую информацию и недоступные обычным посетителям функции. Для этого можно использовать программы вроде dirsearch и DIRB.
Я предпочитаю легкий и очень быстрый ffuf. При запуске указываем следующие параметры:
-w— словарь (я использую словари из набора SecLists);-t— количество потоков;-u— URL;-fc— исключить из результата ответы с кодом 403.
ffuf -u http://forge.htb/FUZZ -fc 403 -t 300 -w directory_2.3_medium.txt

Среди каталогов ничего нового не нашли. Тогда просканируем поддомены. Это может открыть новые сайты для атаки. Используем тот же ffuf, а перебирать будем значение заголовка HOST.
ffuf -u http://forge.htb/ -H "Host: FUZZ.forge.htb" -fc 302 -t 300 -w subdomains-top1million-110000.txt

Находим новый сайт, который добавляем в файл /etc/hosts:
10.10.11.111 admin.forge.htb
Правда, он доступен только для обращения с локального хоста.

ТОЧКА ВХОДА
Так как больше ничего интересного не нашли, нужно пытаться пробить SSRF. Поэтому попробуем разные способы указания локального хоста и переберем с помощью Burp Intruder. Перехватываем запрос в Burp Proxy и перенаправляем в Intruder. На вкладке Payload Positions выбираем адрес 127.0.0.1.

На вкладке Options зададим правило извлечения из ответа данных. Для этого выбираем нужную строку (в данном случае — сообщение о блокировке) и отмечаем галочку Extract from regex group. Это поможет автоматически собрать регулярное выражение для интересующей нас строки.

Количество потоков можно выставить на свой выбор, я использовал 256. Списки способов для указания локального хоста есть на GitHub и легко гуглятся. Когда все готово, запускаем атаку. Результат получаем уже через несколько секунд.

В дополнительной колонке, куда попали сообщения от сервера, находим среди прочего отчеты об успешной загрузке. Используя средство просмотра ответа Render, можно посмотреть эту страницу, не выходя из Burp.

Видим, что в случае успешной загрузки «файла» нам дают на него ссылку. Перейдя по этой ссылке, найдем там стартовую страницу галереи. Таким образом, присутствует уязвимость SSRF!

Теперь выясним, по каким протоколам мы можем работать через такой ретранслятор. Для этого отправляем наш «успешный» запрос в Burp Intruder и на вкладке Payload Position выбираем действующий протокол.

В список заносим самые вероятные протоколы и запускаем перебор.

В итоге сервер поддерживает всего два протокола: HTTP (работает) и HTTPS (выдает ошибку, так как на сервере закрыт порт 443). Остальные протоколы были отфильтрованы. Мы получаем все больше информации, но пока ничего существенного. Стоит помнить про административный сервис, обращение к которому должно происходить через доменное имя. Попробуем обратиться к основному домену и любому его поддомену, даже не существующему.


В обоих случаях получаем сообщение про черный список. Скорее всего, стоит проверка вхождения последовательности forge.htb. Попробуем обмануть предполагаемую политику и изменить регистр символов — fOrge.htb.

И получаем ссылку на страницу. Этим способом получим ссылку и на копию административного сервиса.

ТОЧКА ОПОРЫ
Запрашиваем сохраненную страницу и получаем другую ссылку.

Повторяем всю процедуру заново, но теперь в качестве конечной точки указываем только полученную ссылку. Это позволит нам раскрыть еще больше информации о сервисах.

Мы получаем учетные данные для входа по FTP. Также узнаем о странице /upload, которая принимает параметр u, где нужно передать URL. А среди поддерживаемых протоколов присутствуют FTP и SFTP. Давай обратимся к этой странице и передадим в качестве URL адрес локального FTP-сервера:
admin.fOrge.htb/upload?u=ftp://user:heightofsecurity123!@127.1.1.1


Это похоже на пользовательскую директорию. Попробуем получить содержимое скрытого каталога .ssh.

Получаем приватный ключ и подключаемся по SSH.


Так мы захватываем пользователя и получаем стабильный доступ.
ЛОКАЛЬНОЕ ПОВЫШЕНИЕ ПРИВИЛЕГИЙ
Одна из первых вещей, которые нужно проверять в Linux, когда ищешь способы поднять привилегии, — это файл sudoers. Смотрим его.
Справка: sudoers
Файл /etc/sudoers в Linux содержит списки команд, которые разные группы пользователей могут выполнять от имени администратора системы. Можно просмотреть его как напрямую, так и при помощи команды sudo -l.

В настройках sudoers прописан привилегированный запуск пользовательского скрипта /opt/remote-manage.py без ввода пароля (NOPASSWD). Просмотрим содержимое файла.
Этот скрипт открывает указанный порт (строка 12), запрашивает секретный пароль и проверяет его (строки 16–20). Затем скрипт запрашивает у подключенного пользователя цифру от 1 до 4 для выполнения соответствующего действия (строки 22–36). Но если во время выполнения кода произойдет ошибка, то обработчик исключения передаст управление pdb — отладчику Python (строки 37–39).

Таким образом, если мы сможем вызвать ошибку в приложении, то сможем получить консоль отладчика. Это позволит выполнять свой код в привилегированном режиме.
Вызвать ошибку в приложении можно в строке 27, где введенная строка преобруется к целочисленному значению. Запустим приложение, подключимся к нему со второго терминала с помощью netcat.


Теперь вводим любую строку, при этом в терминале самого приложения отобразится ошибка и появится консоль pdb.

Теперь импортируем модуль PTY и получаем командную оболочку в высокопривилегированном режиме.

Мы захватили очередную машину и имеем полный контроль над ней!
Читайте ещё больше платных статей бесплатно: https://t.me/hacker_frei