SPN ve Kerberos Temeli
Active Directory ortamlarında Service Principal Name (SPN), belirli bir servis instance’ını tanımlayan benzersiz bir kimliktir. Kerberos, SPN’leri kullanarak bir servis instance’ını ilgili service logon account ile ilişkilendirir; böylece istemci uygulamalar hesap adını bilmeden o servis hesabına kimlik doğrulama talebi oluşturabilir.
Bir TGS (Ticket Granting Service) bileti talep edildiğinde, bu bilet ilgili servis hesabının NTLM password hash değeri ile şifrelenir. Kerberoasting saldırısı tam burada devreye girer: Saldırgan TGS biletini ele geçirir ve çevrimdışı olarak kırmaya çalışır. Başarılı olursa elde edilen değer servis hesabının gerçek parolasıdır.
Şifreleme Algoritmaları ve Risk
- AES – Daha güvenlidir; kırma süresi uzundur.
- RC4 – Daha hızlı kırılır; birçok ortamda hâlâ görülür.
- DES – Çok eski; genellikle devre dışıdır.
En iyi uygulamalar RC4 ve DES'in devre dışı bırakılmasını önerir. Ancak bazı uygulamalar AES’i desteklemediğinden kurumlar RC4 kullanmaya devam edebilir. Saldırganlar belirli tekniklerle encryption downgrade yaparak biletleri RC4-HMAC (etype 0x17) ile talep edebilir. RC4’ün zayıflığı zayıf parola politikalarıyla birleştiğinde, biletler kısa sürede kırılabilir.
Rubeus ile Saldırı Akışı
Rubeus, Kerberoasting’i otomatikleştiren bir araçtır. SPN’e sahip kullanıcı hesaplarını hedefler ve Domain Controller’dan bu hesaplara ait TGS biletlerini ister.
.\Rubeus.exe kerberoast /outfile:garp.txt
Komut ne yapar?
- Kerberos TGS biletlerini Kerberoasting tekniğiyle çıkarır.
- Çıkan hash değerlerini
garp.txt
dosyasına kaydeder.
Sonraki adımlar:
- Rubeus → bilet hash’lerini toplar (
garp.txt
). garp.txt
→ Kali Linux’a aktarılır.- Hashcat veya John the Ripper ile offline parola kırma yapılır.
Offline Kırma (Hashcat)
hashcat -m 13100 garp.txt /usr/share/wordlists/rockyou.txt
-m 13100
→ Kerberos 5 TGS-REP etype 23 (RC4-HMAC) modu.garp.txt
→ Rubeus’tan gelen hash’ler.rockyou.txt
→ Denenecek parola listesi.
Kırma başarılı olursa, servis hesabının gerçek parolasına erişilir.
LDAP Kerberoasting SPN Keşfi Tespiti
LDAP tabanlı keşif, Kerberoasting için uygun hedeflerin belirlenmesi aşamasıdır. SPN’e sahip kullanıcı hesapları (çoğunlukla servis hesapları) listelenir. SPN’li hesapların TGS biletleri, zayıf parolalar ve RC4/DES gibi eski algoritmalar kullanıldığında kolayca kırılabilir. Erken tespit, bilet talebi aşamasından önce engelleme imkânı sağlar.
Örnek LDAP Filtreleri / Araçlar
- PowerView – Tüm kullanıcılar:
(&(samAccountType=805306368)(samAccountName=*))
- PowerView – SPN’li kullanıcılar (Kerberoasting keşfi):
(&(samAccountType=805306368)(servicePrincipalName=*))
- Empire – Get-DomainSearcher: genel kullanıcı nesneleri için
samAccountType=805306368
805306368
→ AD'de normal kullanıcı hesap tipidir.servicePrincipalName=*
→ SPN atanmış hesapları listeler; Kerberoasting öncesi kritik adımdır.samAccountName=*
→ Brute-force / password spraying öncesi hesap isimlerini toplamak için kullanılır.- BloodHound/SharpHound bu filtreleri arka planda PowerView veya .NET LDAP sorguları ile kullanır.
ETW ile Görünürlük (SilkService-Log)
WinEventLog:SilkService-Log, ETW tabanlı özel bir provider/controller olup process, network ve logon aktivitelerini standart loglardan daha ayrıntılı kaydedebilir. ETW çok veri üretse de yüksek doğruluk sağlar ve Kerberoasting gibi şüpheli davranışların ince ayrıntılarını görünür kılar.
Kerberoasting Tespiti
SPN’e sahip hesaplar için olağandışı TGS (EventCode 4769) isteklerini izleyin. Özellikle TicketEncryptionType=0x17
(RC4-HMAC) veya DES ile şifrelenmiş biletler, çevrimdışı kırma niyetine işaret edebilir.
Splunk Örneği (RC4-HMAC Odaklı)
index=* source="WinEventLog:Security" EventCode=4769 TicketEncryptionType=0x17
| stats count min(_time) as first_seen max(_time) as last_seen dc(ClientAddress) as uniq_clients by AccountName, ServiceName
| sort - count
4648 ile Korelasyon
4648 eventi, bir kullanıcının başka bir hesap/servis kimliğiyle explicit olarak logon denemesi yaptığını gösterir. Kerberoasting’de interaktif logon oluşmasa da 4648 üretilebilir. 4769 talepleriyle 4648’i karşılaştırmak, normal aktiviteleri ayırıp şüpheli davranışı öne çıkarır.
index=* source="WinEventLog:Security" (EventCode=4769 OR EventCode=4648)
| eval evt=if(EventCode=4769, "TGS", "ExplicitLogon")
| stats values(evt) as events min(_time) as first_seen max(_time) as last_seen by AccountName, ServiceName, ClientAddress
| where mvcount(events)=2
| sort - last_seen
Kısa İpuçları
- RC4 gördüğünüzde eşikleri düşürün; kırma süresi dramatik biçimde kısalır.
- Non-domain joined istemcilerden gelen TGS istekleri anomali sayılmalıdır.
- AES’e geçişi zorlayın; mümkünse gMSA ve güçlü parola politikaları kullanın.