HTB Paper. Пентестим WordPress и эксплуатируем баг в Polkit

HTB Paper. Пентестим WordPress и эксплуатируем баг в Polkit

RalfHacker 

В сегод­няшнем рай­тапе мы про­экс­плу­ати­руем уяз­вимос­ти в популяр­ной CMS WordPress, кор­поратив­ном мес­сен­дже­ре RocketChat, а так­же раз­берем одну из самых нашумев­ших уяз­вимос­тей — Polkit LPE. Все это в рам­ках лег­кой машины Paper с пло­щад­ки Hack The Box.

WARNING

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

 

РАЗВЕДКА

 


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

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


10.10.11.143 paper.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 — служ­ба OpenSSH 8.0, 80 и 443 — веб‑сер­вер Apache 2.4.37. Обыч­но в SSL-сер­тифика­те мож­но под­смот­реть новые домен­ные име­на в поле commonName, но не в этот раз.

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

 

ТОЧКА ВХОДА

При пен­тесте веб‑сер­висов луч­ше все­го работать в Burp. Полез­но, к при­меру, что в Burp History мож­но будет прос­мотреть всю цепоч­ку поль­зователь­ских зап­росов и отве­тов сер­вера. Так, в HTTP-заголов­ке X-Backend-Server находим еще один домен — office.paper.


Зап­росы в Burp History

То­же добав­ляем его в /etc/hosts.

10.10.11.143 paper.htb office.paper

И на этом домене находим новый сайт.

Глав­ная стра­ница office.paper

И сно­ва Burp History нам помога­ет — по стра­ницам, к которым обра­щает­ся наш кли­ент, мы опре­деля­ем, что на машине уста­нов­лен WordPress.

Зап­росы в Burp History

 

ТОЧКА ОПОРЫ

 


WordPress

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


Ком­мента­рий с сай­та

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

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

  • --url — URL;
  • -e ap — поиск уста­нов­ленных пла­гинов;
  • --plugins-detection — спо­соб опре­деле­ния пла­гина. Aggressive — гру­бое ска­ниро­вание перебо­ром;
  • -t — количес­тво потоков;
  • --api-token — получен­ный с офи­циаль­ного сай­та API-ключ.

wpscan --url http://office.paper -e ap --plugins-detection aggressive -t 256 --api-token [...KEY...]

Об­наружен­ные уяз­вимос­ти WordPress

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

Опи­сание обна­ружен­ной уяз­вимос­ти

Пе­рехо­дим к стра­нице /?static=1, и нам ста­новит­ся дос­тупным скры­тый пост.

Со­дер­жимое скры­того пос­та

На­ходим ссыл­ку на еще один домен. Добавим его в /etc/hosts и прос­мотрим в бра­узе­ре.

10.10.11.143 paper.htb office.paper chat.office.paper

Па­нель регис­тра­ции Rocket.Chat

Так мы получа­ем дос­туп к панели регис­тра­ции в Rocket.Chat!

 

Rocket.Chat

Rocket.Chat — это пол­ностью нас­тра­иваемый мес­сен­джер на JavaScript c откры­тым исходным кодом. Так как мы получи­ли дос­туп к стра­нице регис­тра­ции, то соз­дадим себе акка­унт и авто­ризу­емся.


Глав­ная панель Rocket.Chat

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

Вхо­дящие сооб­щения Rocket.Chat

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

Воз­можнос­ти бота

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

recyclops file test.txt

Ошиб­ка чте­ния фай­ла

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

recyclops file ../../../../../../etc/passwd

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

И мы получа­ем содер­жимое ука­зан­ного фай­ла! В подоб­ных слу­чаях мы уже дол­жны знать, какие фай­лы в сис­теме наибо­лее инте­рес­ны. Пер­вым делом я попытал­ся про­читать при­ват­ный ключ SSH поль­зовате­ля dwight.

recyclops file ../../../../../../home/dwight/.ssh/id_rsa

Ошиб­ка чте­ния фай­лов

Та­кого фай­ла в сис­теме нет, но зато нам повез­ло с фай­лом, содер­жащим перемен­ные сре­ды выпол­нения (окру­жения) про­цес­са.

recyclops file ../../../../../../proc/self/environ

Со­дер­жимое фай­ла /proc/self/environ

Сре­ди перемен­ных окру­жения есть логин и пароль, который так­же под­ходит для служ­бы SSH. Логиним­ся и забира­ем флаг поль­зовате­ля.

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

 

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

Пу­ти для даль­нейше­го прод­вижения поищем при помощи PEASS.


Справка: скрипты PEASS для Linux (загрузка через SCP)

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

Заг­ружа­ем на хост это чудес­ное средс­тво и выпол­няем. И сра­зу же нам сооб­щают об авто­мати­чес­ки най­ден­ной уяз­вимос­ти CVE-2021-3560.

Вы­вод LinPEAS

Экс­пло­итов на GitHub мно­го, для их поис­ка дос­таточ­но прос­то ука­зать номер CVE.

По­иск экс­пло­итов в Google

Для понима­ния уяз­вимос­ти нуж­но знать, что такое Polkit. Polkit (PolicyKit) — биб­лиоте­ка для UNIX-подоб­ных опе­раци­онных сис­тем, поз­воля­ет пре­дос­тавить неп­ривиле­гиро­ван­ным про­цес­сам воз­можность выпол­нять при­виле­гиро­ван­ные опе­рации. Polkit мож­но исполь­зовать вмес­то sudo, но в отли­чие от sudo Polkit не наделя­ет про­цесс поль­зовате­ля повышен­ными пра­вами, а поз­воля­ет точ­но кон­тро­лиро­вать, что раз­решено, а что зап­рещено. Эта биб­лиоте­ка исполь­зует­ся ути­литой systemd, а зна­чит, и уста­нов­лена по умол­чанию во мно­гих дис­три­бути­вах Linux.

Суть уяз­вимос­ти в том, что Polkit мож­но зас­тавить обхо­дить про­вер­ки учет­ных дан­ных для зап­росов D-Bus, повышая при­виле­гии до поль­зовате­ля root. Эту уяз­вимость мож­но экс­плу­ати­ровать от име­ни локаль­ного поль­зовате­ля, нап­ример соз­дать нового при­виле­гиро­ван­ного поль­зовате­ля. Но что­бы понять архи­тек­туру уяз­вимос­ти, нуж­но разоб­рать связь меж­ду Polkit и D-Bus.

 

Как работает Polkit

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


Схе­ма вза­имо­дей­ствия D-Bus и Polkit
  1. Про­цесс dbus-send дает сиг­нал о соз­дании нового поль­зовате­ля про­цес­су accounts-daemon.
  2. Про­цесс accounts-daemon получа­ет сиг­нал через dbus-daemon. При этом dbus-daemon прик­репит к сиг­налу имя шины.
  3. В свою оче­редь, account-daemon зап­рашива­ет у polkit, раз­решено ли соеди­нение c дан­ной шиной для соз­дания нового поль­зовате­ля.
  4. Для опре­деле­ния polkit зап­рашива­ет у dbus-daemon UID для кон­некта.
  5. Ес­ли UID равен 0 (root), polkit авто­ризу­ет зап­рос. Ина­че polkit отправ­ляет аген­ту аутен­тифика­ции спи­сок поль­зовате­лей, которым раз­решено авто­ризо­вать зап­рос.
  6. Агент аутен­тифика­ции отоб­разит поль­зовате­лю диало­говое окно для вво­да пароля, который потом отпра­вит polkit.
  7. Ес­ли polkit все же авто­ризу­ет этот зап­рос, он отпра­вит сиг­нал к accounts-daemon, а тот уже соз­даст нового поль­зовате­ля.

 

Уязвимость в схеме работы Polkit

Уяз­вимость находит­ся на чет­вертом эта­пе пос­ледова­тель­нос­ти. Ког­да Polkit зап­рашива­ет у dbus-daemon UID кон­некта, а это­го кон­некта боль­ше не сущес­тву­ет, dbus-daemon пра­виль­но обра­баты­вает эту ситу­ацию и воз­вра­щает ошиб­ку. Но ока­залось, что Polkit неп­равиль­но ее обра­баты­вает! Вмес­то того что­бы откло­нить зап­рос, Polkit пос­тупа­ет так, как если бы он исхо­дил от про­цес­са с UID, рав­ным 0, то есть немед­ленно авто­ризу­ет.


 

Эксплуатация уязвимости Polkit

Та­ким обра­зом, нам нуж­но запус­тить dbus-send и унич­тожить его, пока Polkit все еще обра­баты­вает зап­рос. Но ока­залось, что Polkit зап­рашива­ет у dbus-daemon UID про­цес­са нес­коль­ко раз по раз­ным путям. Боль­шинс­тво из этих путей пра­виль­но обра­баты­вают ошиб­ку, но один из них — нет! Если убить dbus-send дос­рочно, то коман­да будет обра­бота­на одним из «пра­виль­ных» путей и зап­рос будет откло­нен. Что­бы акти­виро­вать уяз­вимый путь, надо завер­шить про­цесс в нуж­ный момент. Поэто­му пос­ледова­тель­ность дей­ствий тре­бует­ся выпол­нить нес­коль­ко раз.


Все это уже реали­зова­но в ко­де экс­пло­ита. Нуж­но лишь запус­тить файл и дож­дать­ся при­виле­гиро­ван­ного кон­тек­ста.

Мы получа­ем при­виле­гии рута и забира­ем флаг.

Флаг рута

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


Report Page