HTB Paper. Пентестим WordPress и эксплуатируем баг в Polkit
RalfHacker В сегодняшнем райтапе мы проэксплуатируем уязвимости в популярной CMS WordPress, корпоративном мессенджере RocketChat, а также разберем одну из самых нашумевших уязвимостей — Polkit LPE. Все это в рамках легкой машины Paper с площадки Hack The Box.
WARNING
Подключаться к машинам с HTB рекомендуется только через VPN. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
РАЗВЕДКА
Сканирование портов
Добавляем IP-адрес машины в /etc/hosts
:
10.10.11.143 paper.htb
И запускаем сканирование портов.
Справка: сканирование портов
Сканирование портов — стандартный первый шаг при любой атаке. Он позволяет атакующему узнать, какие службы на хосте принимают соединение. На основе этой информации выбирается следующий шаг к получению точки входа.
Наиболее известный инструмент для сканирования — это Nmap. Улучшить результаты его работы ты можешь при помощи следующего скрипта.
#!/bin/bash
ports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr '\n' ',' | sed s/,$//)
nmap -p$ports -A $1
Он действует в два этапа. На первом производится обычное быстрое сканирование, на втором — более тщательное сканирование, с использованием имеющихся скриптов (опция -A
).
Скрипт нашел три открытых порта: 22 — служба OpenSSH 8.0, 80 и 443 — веб‑сервер Apache 2.4.37. Обычно в SSL-сертификате можно подсмотреть новые доменные имена в поле commonName
, но не в этот раз.
ТОЧКА ВХОДА
При пентесте веб‑сервисов лучше всего работать в Burp. Полезно, к примеру, что в Burp History можно будет просмотреть всю цепочку пользовательских запросов и ответов сервера. Так, в HTTP-заголовке X-Backend-Server
находим еще один домен — office.paper
.
Тоже добавляем его в /etc/hosts
.
10.10.11.143 paper.htb office.paper
И на этом домене находим новый сайт.
И снова Burp History нам помогает — по страницам, к которым обращается наш клиент, мы определяем, что на машине установлен WordPress.
ТОЧКА ОПОРЫ
WordPress
На сайте несколько статей с комментариями, которые мы можем прочитать. И один из комментирующих указывает, что в черновиках лежат какие‑то секретные данные.
Поскольку мы столкнулись с WordPress, можем воспользоваться специальными утилитами для работы с ней. В первую очередь нам понадобится WPScan — сканер, который автоматически ищет уязвимости в WordPress и установленных плагинах.
Передадим сканеру следующие параметры:
--url
— URL;-e ap
— поиск установленных плагинов;--plugins-detection
— способ определения плагина. Aggressive — грубое сканирование перебором;-t
— количество потоков;--api-token
— полученный с официального сайта API-ключ.
wpscan --url http://office.paper -e ap --plugins-detection aggressive -t 256 --api-token [...KEY...]
И мы находим уязвимость, которая позволяет читать приватные посты. По предоставленной утилитой ссылке мы получим инструкцию, как эксплуатировать уязвимость.
Переходим к странице /?static=1
, и нам становится доступным скрытый пост.
Находим ссылку на еще один домен. Добавим его в /etc/hosts
и просмотрим в браузере.
10.10.11.143 paper.htb office.paper chat.office.paper
Так мы получаем доступ к панели регистрации в Rocket.Chat!
Rocket.Chat
Rocket.Chat — это полностью настраиваемый мессенджер на JavaScript c открытым исходным кодом. Так как мы получили доступ к странице регистрации, то создадим себе аккаунт и авторизуемся.
Но мы получаем пустой мессенджер, поэтому идея узнать приватные данные из переписок сразу отпала. Однако спустя минуту приходит сообщение от бота!
В рассказе о себе и своих функциях бот упоминает возможность прочитать файл из хранилища.
Пытаемся получить вымышленный файл, и бот выдает нам полный путь к предполагаемому файлу. И это обычный системный каталог.
recyclops file test.txt
Так как бот просто пытается прочитать файл на диске, мы можем попробовать проэксплуатировать уязвимость обхода каталога и прочитать любой другой файл на сервере, к примеру /etc/passwd
.
recyclops file ../../../../../../etc/passwd
И мы получаем содержимое указанного файла! В подобных случаях мы уже должны знать, какие файлы в системе наиболее интересны. Первым делом я попытался прочитать приватный ключ SSH пользователя dwight.
recyclops file ../../../../../../home/dwight/.ssh/id_rsa
Такого файла в системе нет, но зато нам повезло с файлом, содержащим переменные среды выполнения (окружения) процесса.
recyclops file ../../../../../../proc/self/environ
Среди переменных окружения есть логин и пароль, который также подходит для службы SSH. Логинимся и забираем флаг пользователя.
ЛОКАЛЬНОЕ ПОВЫШЕНИЕ ПРИВИЛЕГИЙ
Пути для дальнейшего продвижения поищем при помощи PEASS.
Справка: скрипты PEASS для Linux (загрузка через SCP)
Что делать после того, как мы получили доступ в систему от имени пользователя? Вариантов дальнейшей эксплуатации и повышения привилегий может быть очень много, как в Linux, так и в Windows. Чтобы собрать информацию и наметить цели, можно использовать Privilege Escalation Awesome Scripts SUITE (PEASS) — набор скриптов, которые проверяют систему на автомате.
Загружаем на хост это чудесное средство и выполняем. И сразу же нам сообщают об автоматически найденной уязвимости CVE-2021-3560.
Эксплоитов на GitHub много, для их поиска достаточно просто указать номер CVE.
Для понимания уязвимости нужно знать, что такое Polkit. Polkit (PolicyKit) — библиотека для UNIX-подобных операционных систем, позволяет предоставить непривилегированным процессам возможность выполнять привилегированные операции. Polkit можно использовать вместо sudo, но в отличие от sudo Polkit не наделяет процесс пользователя повышенными правами, а позволяет точно контролировать, что разрешено, а что запрещено. Эта библиотека используется утилитой systemd, а значит, и установлена по умолчанию во многих дистрибутивах Linux.
Суть уязвимости в том, что Polkit можно заставить обходить проверки учетных данных для запросов D-Bus, повышая привилегии до пользователя root. Эту уязвимость можно эксплуатировать от имени локального пользователя, например создать нового привилегированного пользователя. Но чтобы понять архитектуру уязвимости, нужно разобрать связь между Polkit и D-Bus.
Как работает Polkit
Как создается новый пользователь через Polkit, изображено на схеме ниже. Два процесса над пунктирной линией работают в непривилегированном режиме.
- Процесс
dbus-send
дает сигнал о создании нового пользователя процессуaccounts-daemon
. - Процесс
accounts-daemon
получает сигнал черезdbus-daemon
. При этомdbus-daemon
прикрепит к сигналу имя шины. - В свою очередь,
account-daemon
запрашивает уpolkit
, разрешено ли соединение c данной шиной для создания нового пользователя. - Для определения
polkit
запрашивает уdbus-daemon
UID для коннекта. - Если UID равен 0 (root),
polkit
авторизует запрос. Иначеpolkit
отправляет агенту аутентификации список пользователей, которым разрешено авторизовать запрос. - Агент аутентификации отобразит пользователю диалоговое окно для ввода пароля, который потом отправит
polkit
. - Если
polkit
все же авторизует этот запрос, он отправит сигнал кaccounts-daemon
, а тот уже создаст нового пользователя.
Уязвимость в схеме работы Polkit
Уязвимость находится на четвертом этапе последовательности. Когда Polkit запрашивает у dbus-daemon
UID коннекта, а этого коннекта больше не существует, dbus-daemon
правильно обрабатывает эту ситуацию и возвращает ошибку. Но оказалось, что Polkit неправильно ее обрабатывает! Вместо того чтобы отклонить запрос, Polkit поступает так, как если бы он исходил от процесса с UID, равным 0, то есть немедленно авторизует.
Эксплуатация уязвимости Polkit
Таким образом, нам нужно запустить dbus-send
и уничтожить его, пока Polkit все еще обрабатывает запрос. Но оказалось, что Polkit запрашивает у dbus-daemon
UID процесса несколько раз по разным путям. Большинство из этих путей правильно обрабатывают ошибку, но один из них — нет! Если убить dbus-send
досрочно, то команда будет обработана одним из «правильных» путей и запрос будет отклонен. Чтобы активировать уязвимый путь, надо завершить процесс в нужный момент. Поэтому последовательность действий требуется выполнить несколько раз.
Все это уже реализовано в коде эксплоита. Нужно лишь запустить файл и дождаться привилегированного контекста.
Мы получаем привилегии рута и забираем флаг.
Машина захвачена!