Хакер - HTB Faculty. Атакуем веб-сервер через mPDF и повышаем привилегии с помощью Linux capabilities

Хакер - HTB Faculty. Атакуем веб-сервер через mPDF и повышаем привилегии с помощью Linux capabilities

hacker_frei

https://t.me/hacker_frei

RalfHacker

Содержание статьи

  • Разведка
  • Сканирование портов
  • Сканирование веб контента
  • Точка входа
  • Точка опоры
  • Продвижение
  • Локальное повышение привилегий

В этом рай­тапе я покажу, как исполь­зовать обход авто­риза­ции через SQL-инъ­екцию, затем мы про­экс­плу­ати­руем mPDF и повысим при­виле­гии на сер­вере через сис­тему Linux capabilities, а кон­крет­но — через воз­можность cap_sys_ptrace.

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

WARNING

Под­клю­чать­ся к машинам с HTB рекомен­дует­ся толь­ко через VPN. Не делай это­го с компь­юте­ров, где есть важ­ные для тебя дан­ные, так как ты ока­жешь­ся в общей сети с дру­гими учас­тни­ками.

РАЗВЕДКА

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

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

10.10.11.169 faculty.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).

Стра­ница авто­риза­ции faculty.htb

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

Поп­робу­ем поис­кать скры­тые катало­ги и фай­лы при помощи ffuf.

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

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

Я пред­почитаю лег­кий и очень быс­трый ffuf. При запус­ке ука­зыва­ем сле­дующие парамет­ры:

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

За­пус­каем с нуж­ными парамет­рами:

ffuf -u 'http://faculty.htb/FUZZ' -r -w php_files_common.txt -t 256

Ре­зуль­тат ска­ниро­вания PHP-фай­лов

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

ffuf -u 'http://faculty.htb/FUZZ' -r -w directory_2.3_medium.txt -t 256

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

На­ходим каталог admin и пов­торя­ем ска­ниро­вание фай­лов в нем.

Ре­зуль­тат ска­ниро­вания PHP-фай­лов

ffuf -u 'http://faculty.htb/admin/FUZZ' -r -w php_files_common.txt -t 256

Са­мая инте­рес­ная из най­ден­ных стра­ниц — авто­риза­ция для адми­нов.

Стра­ница авто­риза­ции адми­нис­тра­тора

ТОЧКА ВХОДА

Ра­ботать с вебом я рекомен­дую через Burp Proxy. Пос­мотрим зап­рос и ответ при авто­риза­ции. Узна­ем, что в слу­чае невер­ной пары из логина и пароля в отве­те прос­то получим циф­ру 3.

От­вет сер­вера при авто­риза­ции

Ес­ли есть фор­ма авто­риза­ции, зна­чит, нуж­но поп­робовать все вари­анты ее обхо­да. Я это делаю по сло­варю с помощью Burp Intruder.

Burp Intruder — вклад­ка Payload Positions

На­ходим нес­коль­ко наг­рузок c вари­анта­ми отве­та 3. При этом ошиб­ка SQL рас­кры­вает путь к фай­лу.

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

Так­же при­сутс­тву­ют ответ 1. Ско­рее все­го, это показа­тель успешной авто­риза­ции.

Ре­зуль­тат перебо­ра (про­дол­жение)

Ис­поль­зуем най­ден­ную наг­рузку и заходим на сайт.

Глав­ная стра­ница авто­ризо­ван­ного поль­зовате­ля

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

Спи­сок кур­сов
Сге­нери­рован­ный PDF-документ

Сно­ва смот­рим цепоч­ку зап­росов в Burp Proxy. Видим, что отправ­ляет­ся зап­рос с парамет­ром pdf, где переда­ются закоди­рован­ные в Base64 дан­ные. Затем нас редирек­тит на стра­ницу /mpdf/tmp/<doc>.pdf.

Зап­рос на заг­рузку докумен­та

Burp Inspector поз­воля­ет нам авто­мати­чес­ки декоди­ровать эти дан­ные.

Де­коди­рова­ние дан­ных

Ви­дим, что переда­ется таб­лица в HTML. Ско­рее все­го, исполь­зует­ся какая‑то уже готовая тех­нология пре­обра­зова­ния фор­мата, а в пути ука­зан каталог mpdf. Тог­да я решил най­ти эту тех­нологию по клю­чево­му сло­ву. Одна­ко сра­зу же нашел готовый экс­пло­ит.

По­иск экс­пло­ита

ТОЧКА ОПОРЫ

Уяз­вимость в mPDF поз­воля­ет получать про­изволь­ные фай­лы с уда­лен­ного хос­та в качес­тве вло­жения в сге­нери­рован­ном PDF-докумен­те. Сос­тавим наг­рузку, исполь­зовав най­ден­ный экс­пло­ит. Для тес­та поп­робу­ем про­читать файл /etc/passwd.

Сос­тавле­ние наг­рузки

По­лучен­ную наг­рузку отправ­ляем в парамет­ре pdf.

От­прав­ка зап­роса в Burp Repeater

В отве­те получа­ем имя соз­данно­го фай­ла. В адресной стро­ке на стра­нице получен­ного ранее докумен­та заменя­ем имя фай­ла. В новом фай­ле видим вло­жение /etc/passwd.

Сге­нери­рован­ный PDF
Со­дер­жимое вло­жения /etc/passwd

Так как мы получи­ли воз­можность читать фай­лы, теперь нуж­но получить файл с важ­ными дан­ными. К при­меру, это может быть файл с нас­трой­ками для под­клю­чения к базе дан­ных. До это­го при ска­ниро­вании мы обна­ружи­ли db_connect.php, а путь к катало­гу, где он содер­жится, рас­кры­ла получен­ная ранее ошиб­ка SQL. Генери­руем новую наг­рузку для такого пути:

/var/www/scheduling/admin/db_connect.php

От­прав­ляем ее и во вло­жении сге­нери­рован­ного PDF видим учет­ные дан­ные.

Со­дер­жимое фай­ла db_connect

Бе­рем пароль для под­клю­чения к базе дан­ных, а имя поль­зовате­ля — из фай­ла passwd и авто­ризу­емся по SSH.

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

ПРОДВИЖЕНИЕ

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

Справка: скрипты PEASS

Что делать пос­ле того, как мы получи­ли дос­туп в сис­тему от име­ни поль­зовате­ля? Вари­антов даль­нейшей экс­плу­ата­ции и повыше­ния при­виле­гий может быть очень мно­го, как в Linux, так и в Windows. Что­бы соб­рать информа­цию и наметить цели, мож­но исполь­зовать Privilege Escalation Awesome Scripts SUITE (PEASS) — набор скрип­тов, которые про­веря­ют сис­тему на авто­мате.

Заг­рузим скрипт на хост, дадим пра­во на выпол­нение и запус­тим ска­ниро­вание. Из вывода скрип­та узна­ем, что он не смог получить нас­трой­ки sudoers, так как тре­бует­ся ввес­ти пароль, а так­же у отладчи­ка GDB дол­жна быть сис­темная воз­можность cap_sys_ptrace.

Нас­трой­ки sudoers
Linux capabilities

Справка: sudoers

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

Так как нас­трой­ки sudoers мы не получи­ли, зап­росим их вруч­ную и вве­дем пароль.

sduo -l

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

Ока­зыва­ется, мы можем выпол­нить коман­ду /usr/local/bin/meta-git от име­ни поль­зовате­ля developer. Я сра­зу решил поис­кать пуб­личные экс­пло­иты. В этом нам поможет Google.

По­иск экс­пло­итов для meta-git

В ито­ге обна­ружил­ся пуб­личный отчет на HackerOne, где опи­сан спо­соб получить уда­лен­ное выпол­нение кода. Как ска­зано в отче­те, поль­зователь­ский ввод без пред­варитель­ной про­вер­ки исполь­зует­ся при фор­мирова­нии и выпол­нении коман­ды ОС, поэто­му мы можем устро­ить инъ­екцию. Для тес­та выпол­ним коман­ду id.

sudo -u developer /usr/local/bin/meta-git clone 'qweqwe | id'

Вы­пол­нение коман­ды id

Ко­ман­да выпол­няет­ся, давай поп­робу­ем получить при­ват­ный ключ поль­зовате­ля, если такой име­ется.

sudo -u developer /usr/local/bin/meta-git clone 'qweqwe | cat /home/developer/.ssh/id_rsa'

При­ват­ный ключ SSH

По­луча­ем ключ, коман­дой chmod 0600 id_rsa наз­нача­ем нуж­ные пра­ва и под­клю­чаем­ся как поль­зователь developer.

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

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

Ко­ман­да id показа­ла, что мы находим­ся в груп­пе debug, при этом не забыва­ем про воз­можность CAP_SYS_PTRACE у фай­ла gdb.

Справка: Linux capabilities

В Linux поль­зователь root получа­ет осо­бый кон­текст при запус­ке любых про­цес­сов. Так, ядро и при­ложе­ния, работа­ющие от име­ни root, обыч­но про­пус­кают любые огра­ниче­ния, задан­ные на дей­ствия в опре­делен­ном кон­тек­сте, поэто­му root может делать все, что захочет. Но что, если опре­делен­ному про­цес­су, который работа­ет в неп­ривиле­гиро­ван­ном кон­тек­сте, нуж­но выпол­нить тре­бующее при­виле­гий дей­ствие, не повышая уров­ня прав?

Нап­ример, быва­ет нуж­но раз­решить про­цес­су записы­вать в жур­нал ауди­та ядра, но не поз­волять отклю­чить этот аудит. Ведь если запус­тить этот про­цесс в кон­тек­сте рута, он смо­жет выпол­нить оба дей­ствия!

Тут на помощь и при­ходят Linux capabilities. Эти «воз­можнос­ти» пре­дос­тавля­ют про­цес­су не все мно­жес­тво при­виле­гий, а какое‑то его под­мно­жес­тво. Дру­гими сло­вами, все при­виле­гии рута раз­бива­ются на более мел­кие незави­симые друг от дру­га при­виле­гии и про­цесс получа­ет толь­ко те, которые ему нуж­ны.

CAP_SYS_PTRACE поз­воля­ет трас­сировать про­изволь­ные про­цес­сы с помощью ptrace. А в сочета­нии с груп­пой debug мы смо­жем отла­дить с помощью GDB любой при­виле­гиро­ван­ный про­цесс. И в спис­ке про­цес­сов отме­чаем работа­ющий python3.

ps aux

Спи­сок про­цес­сов

Под­клю­чим­ся к нему с помощью gdb.

gdb -p 706

От­ладка работа­юще­го про­цес­са

А теперь попыта­емся выпол­нить коман­ду с помощью фун­кции system. Поп­робу­ем соз­дать файл в домаш­нем катало­ге поль­зовате­ля.

call (void)system("touch /home/developer/qweewqqweewq")

Вы­пол­нение коман­ды
Спи­сок фай­лов в домаш­нем катало­ге поль­зовате­ля

Ко­ман­ды выпол­нена, исполь­зуем один из методов пер­систен­тнос­ти. К при­меру, запись пуб­лично­го клю­ча SSH в файл authorized_keys. Спер­ва соз­дадим каталог .ssh, а затем ско­пиру­ем ключ уже име­юще­гося у нас поль­зовате­ля.

call (void)system("mkdir /root/.ssh")

call (void)system("cp /home/developer/.ssh/id_rsa.pub /root/.ssh/authorized_keys")

За­пись SSH-клю­ча

Под­клю­чаем­ся с помощью при­ват­ного клю­ча и забира­ем флаг.

Флаг рута

Ма­шина зах­вачена!

Читайте ещё больше платных статей бесплатно: https://t.me/hacker_frei





Report Page