Пентест Active Directory на машине HTB Intelligence

Пентест Active Directory на машине HTB Intelligence

В этой статье продолжим тему взлома Active Directory. Я покажу, как на примере задания Hack The Box Intelligence пентестить Active Directory.

Еще по теме: Уклонение от Honeytoken при атаке Active Directory

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

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

И запус­каем ска­ниро­вание. Для ска­ниро­вания пор­тов лучше всего подходит Nmap. Можно улуч­шить резуль­таты сканирования с помощью этого скрип­та:

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

Скрипт нашел большое количество открытых портов, что для ОС Windows очень харак­терно:

  • порт 53 — служ­ба DNS. Порт учас­тву­ет в трас­товых отно­шени­ях меж­ду домена­ми;
  • порт 80 (HTTP) — веб‑сер­вер Microsoft IIS/10.0;
  • порт 88 — служ­ба Kerberos. Так­же исполь­зует­ся в довери­тель­ных отно­шени­ях меж­ду лесами;
  • порт 135 — служ­ба уда­лен­ного вызова про­цедур (Microsoft RPC). Исполь­зует­ся для опе­раций вза­имо­дей­ствия кон­трол­лер — кон­трол­лер и кон­трол­лер — кли­ент;
  • порт 139 — служ­ба сеан­сов NetBIOS, NetLogon;
  • порт 389 — служ­ба LDAP;
  • порт 445 — служ­ба SMB;
  • порт 464 — служ­ба сме­ны пароля Kerberos;
  • порт 593 (HTTP-RPC-EPMAP) — исполь­зует­ся в служ­бах DCOM и MS Exchange;
  • порт 636 — LDAP с шиф­ровани­ем SSL или TLS;
  • порт 3268 (LDAP) — для дос­тупа к Global Catalog от кли­ента к кон­трол­леру;
  • порт 3269 (LDAPS) — для дос­тупа к Global Catalog от кли­ента к кон­трол­леру через защищен­ное соеди­нение;
  • порт 5985 — отве­чает за служ­бу уда­лен­ного управле­ния WinRM;
  • порт 9389 — веб‑служ­бы AD DS.

Также в сер­тифика­те LDAP нашлось новое домен­ное имя dc.intelligence.htb. Возьмем на заметку и обно­вим запись в фай­ле /etc/hosts:

Для начала запус­каем скрип­ты Nmap для получе­ния информа­ции с DNS:

Но положительно результата это не принесло. Не вышло авто­ризо­вать­ся как ано­нимный пользователь в SMB и LDAP. Поэто­му будем про­бивать веб.

Хорошенько рассмотрим сайт и попробуем найти цен­ную информацию. Сам сайт на пер­вый взгляд выглядит непримечательно. Из инте­рес­ного — на главной стра­нице сайта есть два файла PDF.

Разведка

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

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

Просмотр метаданных докумен­тов
Просмотр метаданных докумен­тов

Точка входа

Перечисление аккаунтов

Мы наш­ли два име­ни, а это означает,  что теперь можно попробовать найти акка­унты через аутен­тифика­цию Kerberos. Дело в том, что Kerberos укажет отсуствие поль­зовате­ля в базе. Надо только сфор­мировать все воз­можные варианты акка­унтов и про­сеивать их. Например, для пары name surname мож­но сос­тавить такие име­на:

Что­бы сос­тавлять логины по такому шаб­лону, можно прибегнуть к этому Python скрипту:

А теперь заюзаем kerbrute для перебо­ра лоигнов. Ука­жем опцию перечис­ления поль­зовате­лей и переда­дим их спи­сок.

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

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

Воз­вра­щаем­ся к вебу, на этот раз воору­жимся Burp Suite. Используя Burp Proxy обра­щаем вни­мание на мес­то хра­нения фай­лов и их наз­вания.

Вклад­ка Burp Proxy
Burp Proxy

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

Burp Intruder — вклад­ка Position
Burp Intruder — вклад­ка Position

 

Burp Intruder — вклад­ка Payload (payload 1)
Burp Intruder — вклад­ка Payload (пейлоад 1)

 

Burp Intruder — вклад­ка Payload (payload 2)
Burp Intruder — вклад­ка Payload (пейлоад 2)

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

Ре­зуль­тат ата­ки
Ре­зуль­тат ата­ки

Теперь скачаем их. Сна­чала сох­раним необходимые нам наг­рузки средс­тва­ми Burp. Для это­го отме­чаем в филь­тре, что нас инте­ресу­ет толь­ко код отве­та 200, а после этого выбира­ем Save —> Results table.

Сох­ранение наг­рузок в файл
Сох­ранение наг­рузок в файл

Пос­тавим в качес­тве раз­делите­ля про­бел и выберем толь­ко две наг­рузки. Я сох­ранил наг­рузки в файл save.txt, а потом ска­чал все эти докумен­ты через wget.

Точка опоры

Для пар­синга фай­ла save.txt и запус­ка wget будем исполь­зовать awk.

А пос­ле заг­рузки докумен­тов получим всех поль­зовате­лей (84 поль­зовате­ля) и про­верим их сущес­тво­вание в сис­теме.

Про­вер­ка сущес­тво­вания акка­унтов
Про­вер­ка сущес­тво­вания акка­унтов

В ито­ге все поль­зовате­ли есть в сис­теме. Я сно­ва попытал­ся их бру­тить, но ничего не выш­ло. Может, в докумен­тах есть важ­ная информа­ция?

Парсинг текста из PDF

Для про­вер­ки боль­шого количес­тва докумен­тов удоб­но исполь­зовать Python и биб­лиоте­ку pdfminer. Уста­новить ее мож­но через pip:

Бу­дем искать в тек­сте каж­дого докумен­та важ­ные подс­тро­ки: user, username, login, pass, password, passphere, secret.

Со­дер­жимое най­ден­ного докумен­та PDF
Со­дер­жимое най­ден­ного докумен­та PDF

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

Атака Password Spraying

Мы име­ем 85 поль­зовате­лей и один пароль, поэто­му нам нуж­но переб­рать этот пароль по всем поль­зовате­лям (тех­ника Password Spraying). Для бру­та возь­мем уже очень зна­мени­тый мощ­ный инс­тру­мент — CrackMapExec. В парамет­рах прог­раммы, помимо адре­са хос­та, ука­зыва­ем про­токол SMB, сло­варь с име­нами поль­зовате­лей и извес­тный пароль.

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

Ав­торизо­вать­ся по WinRM не получи­лось, поэто­му прос­мотрим дос­тупные ресур­сы SMB.

Дос­тупные общие ресур­сы
Дос­тупные общие ресур­сы

Те­перь нам ста­ли дос­тупны для чте­ния дирек­тории Users и IT. Сно­ва рекур­сивно выводим все содер­жимое ресур­са, где и находим флаг поль­зовате­ля, а так­же какой‑то скрипт на PowerShell.

Со­дер­жимое рабоче­го сто­ла поль­зовате­ля
Со­дер­жимое рабоче­го сто­ла поль­зовате­ля
Со­дер­жимое ресур­са IT
Со­дер­жимое ресур­са IT

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

Продвижение

Мы наш­ли еще один инте­рес­ный файл — скрипт на PowerShell. Ска­чива­ем его и смот­рим, что внут­ри.

Заг­рузка фай­ла
Заг­рузка фай­ла
Со­дер­жимое ска­чан­ного скрип­та
Со­дер­жимое ска­чан­ного скрип­та

Этот скрипт каж­дые пять минут зап­рашива­ет все DNS-записи домена intelligence.htb, которые начина­ются с пос­ледова­тель­нос­ти web. Затем выпол­няют­ся HTTP-зап­росы с исполь­зовани­ем каких‑то учет­ных дан­ных (параметр -UseDefaultCredentials). Если сер­вер недос­тупен, то отправ­ляет­ся сооб­щение на элек­трон­ную поч­ту поль­зовате­ля TED.GRAVES. Видимо, его учет­ные дан­ные и исполь­зуют­ся для дос­тупа к сер­верам с прис­тавкой web.

Утечка NTLM-хеша

Ес­ли мы смо­жем соз­дать свою запись DNS, то зап­рос будет идти на наш хост. Это поз­волит нам получить учет­ные дан­ные целево­го поль­зовате­ля с помощью Responder. Сна­чала акти­виру­ем наш отлавли­ватель.

А теперь исполь­зуем dnstool из пакета ути­лит krbrelayx для добав­ления записи DNS с нашим IP-адре­сом.

Соз­дание записи DNS
Соз­дание записи DNS

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

Ло­ги Responder
Ло­ги Responder

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

По­луче­ние типа хеша
По­луче­ние типа хеша

Нас инте­ресу­ет чис­ло в гра­фе MODE — это и есть тип хеша. Его мы переда­ем hashcat в парамет­ре -m. Параметр -a, рав­ный нулю, говорит о перебо­ре по сло­варю.

Па­роль поль­зовате­ля
Па­роль поль­зовате­ля

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

Повышение привилегий

Для поис­ка путей экс­плу­ата­ции и повыше­ния при­виле­гий в Active Directory написа­но мно­го скрип­тов на PowerShell, и самый популяр­ный из них — PowerView. Его даже перепи­сали на C#, что­бы работать без PowerShell. Единс­твен­ный минус — нуж­но уже при­сутс­тво­вать в сре­де Active Directory. Но мало кто зна­ет, что его так­же перепи­сали и на Python, ути­лита называ­ется pywerview. Имен­но этой вер­сией мы и вос­поль­зуем­ся.

Пер­вым делом узна­ем информа­цию о поль­зовате­лях, груп­пах и слу­жеб­ных акка­унтах с помощью команд get-netuser, get-netgroup и get-netcomputer.

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

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

Пос­ледняя коман­да откры­вает мно­го инте­рес­ной информа­ции. Во‑пер­вых, слу­жеб­ная учет­ная запись svc_int$ ока­залась записью MSA, и для нее уста­нов­лен флаг msds-allowedtodelegateto. Раз­бира­ем по поряд­ку.

Управляемые учетные записи Active Directory

Уп­равля­емые учет­ные записи (Managed Service Accounts, MSA) — это спе­циаль­ный тип учет­ных записей Active Directory, которые мож­но исполь­зовать для безопас­ного запус­ка служб, при­ложе­ний и заданий пла­ниров­щика. Основная их идея в том, что паролем таких учет­ных записей пол­ностью управля­ет Active Directory. Для них авто­мати­чес­ки генери­рует­ся слож­ный пароль дли­ной 240 сим­волов, который меня­ется авто­мати­чес­ки каж­дые 30 дней.

Для аутен­тифика­ции исполь­зует­ся толь­ко Kerberos, так как инте­рак­тивный вход невоз­можен. Это свя­зано с тем, что пароль не известен никому и не хра­нит­ся в локаль­ной сис­теме, поэто­му его нель­зя извлечь из сис­темно­го про­цес­са LSASS с помощью mimikatz.

Но и такими учет­ными запися­ми нуж­но как‑то управлять, а это зна­чит, что если у нас есть дос­туп к ним, то мы можем получить хеш ее пароля. Для это­го написан инс­тру­мент gMSADumper.

По­луче­ние хеша учет­ной записи svc_int$
По­луче­ние хеша учет­ной записи svc_int$

У нас есть хеш пароля учет­ной записи!

Ограниченное делегирование (Kerberos Constrained Delegation)

Те­перь вспом­ним про атри­бут msds-allowedtodelegateto, который дол­жен содер­жать спи­сок имен SPN. Этот атри­бут исполь­зует­ся для нас­трой­ки служ­бы таким обра­зом, что­бы она мог­ла получать билеты служ­бы, которые мож­но исполь­зовать для огра­ничен­ного делеги­рова­ния.

Ог­раничен­ное делеги­рова­ние исполь­зует два основных рас­ширения Kerberos: S4U2Self и S4U2Proxy. На высоком уров­не S4U2Self поз­воля­ет учет­ной записи зап­рашивать билет служ­бы для себя от име­ни любого дру­гого поль­зовате­ля (без пароля). Если бит TRUSTED_TO_AUTH_FOR_DELEGATION уста­нов­лен (как в нашем слу­чае), то билет (TGS) будет помечен как делеги­рован­ный.

Фла­ги UAC
Фла­ги UAC

За­тем S4U2Proxy исполь­зует­ся учет­ной записью с помощью делеги­рован­ного TGS, что­бы зап­росить TGS для ука­зан­ного SPN. Таким обра­зом, имея TGS для целево­го SPN, мы смо­жем выпол­нять дей­ствия от име­ни учет­ной записи служ­бы.

Silver Ticket

Да­вайте сде­лаем Silver Ticket для SPN WWW. Но перед этим нуж­но выс­тавить сис­темное вре­мя как на сер­вере (для аутен­тифика­ции Kerberos необ­ходимо раз­личие в сис­темном вре­мени не более пяти минут).

Зап­рос и уста­нов­ка сис­темно­го вре­мени с сер­вера NTP
Зап­рос и уста­нов­ка сис­темно­го вре­мени с сер­вера NTP

За­тем соз­даем и экспор­тиру­ем билет. Для это­го нам понадо­бит­ся скрипт getST из пакета impacket. Ука­зыва­ем SPN (параметр -spn), учет­ные дан­ные и поль­зовате­ля.

Соз­дание и экспорт билета
Соз­дание и экспорт билета

А теперь поп­робу­ем под­клю­чить­ся к обще­му ресур­су от име­ни адми­нис­тра­тора. В парамет­рах ука­зыва­ем опции авто­риза­ции Kerberos ( -k) без вво­да пароля ( -no-pass).

Под­клю­чение к обще­му ресур­су
Под­клю­чение к обще­му ресур­су

 

Флаг рута
Флаг рута

Мы получи­ли флаг рута, а зна­чит, машина зах­вачена!

Еще по теме: Обход PowerShell AMSI при атаке на Active Directory

ВКонтакте
OK
Telegram
WhatsApp
Viber

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *