Series · 4 partsInternal Network TriagePart 4 · You are here
  1. 1Kerberoasting Triyajı: Çoğu Servis Bileti Zaman Kaybıdır
  2. 2SMB Signing Açık. Bu Grafikte Sadece Bir Kenarı Kapattı
  3. 3Kerberos Delegasyon Triyajı: Unconstrained, Constrained ve RBCD
  4. 4BloodHound Edge Analizi: Çizge Var, Peki Saldırı Yolu Kanıtı Nerede?You are here

60 saniyede BloodHound analiz triyajı

BloodHound, Active Directory ilişkilerini bir grafik (graph) yapısına dönüştürür. Kullanıcılar, bilgisayarlar, gruplar, aktif oturumlar ve izinler birer düğüm (node) ve kenar (edge) haline gelir; yol sorguları (path queries) ise ele geçirilen bir kimliğin ayrıcalıklı bir hedefe nasıl ulaşabileceğini gösterir. Ancak bu grafik toplanmış anlık verilerin bir haritasıdır; her rotanın o anda hala çalıştığının garantisi değildir.

Herkes sızma testinde ilk olarak aynı sorguyu çalıştırır: Ele geçirilen bir hesabı owned olarak işaretle, Domain Admins grubuna giden en kısa yolu (shortestPath) iste ve çıkan grafiğin ekran görüntüsünü al. Bu iyi bir sorgudur. Ancak aynı zamanda pratikte çalışmama ihtimali en yüksek olan rotayı elinize veren sorgudur; ve bunun nedeni verinin hatalı olması değildir.

BloodHound her ilişkiyi birbirinin tıpatıp aynısı olan standart bir ok işaretiyle çizer. Oysa bu okların arkasındaki gerçeklerin raf ömrü birbirinden gece ile gündüz kadar farklıdır.

Üç farklı ömür, tek bir görsel

ACL kenarlarıGenericWrite, WriteDacl, Owns, AddMember, ForceChangePassword. Bunlar doğrudan Active Directory nesne güvenlik tanımlayıcılarından (Security Descriptor / DACL) gelir. Yıllar önce tamamlanmış bir proje sırasında tanımlanmışlardır ve o günden beri kimse onlara dokunmamıştır. Veri topladığınız anda oradalarsa, şu anda da oradadırlar ve önümüzdeki hafta da orada kalacaklardır.

Üyelik ve hak kenarlarıMemberOf, AdminTo, CanRDP, CanPSRemote. Bir pentest süresince oldukça kararlıdırlar, ancak değişebilirler. Bir grup temizlenebilir ya da bir makine yeniden kurulabilir.

Oturum kenarları (Session edges)HasSession. Bir kullanıcının, veri toplama anında o makinede oturum açmış olduğunu gösterir. Bütün anlamı bundan ibarettir. Kullanıcı doksan saniye sonra oturumu kapatmış olabilir. Binlerce son kullanıcı iş istasyonunun bulunduğu bir kurumsal ağda, sabah toplanan oturum grafiği öğleden sonra büyük ölçüde kurgudan ibarettir.

Her üç kenar türü de arayüzde aynı kalınlıkta standart bir ok olarak render edilir. En kısa yol algoritması (shortestPath) ise doğası gereği en az sekme (hop) sayısına sahip rotayı bulur. Oturum kenarları harika birer kestirmedir — tek bir HasSession sizi bir iş istasyonundan doğrudan bir Domain Admin kimlik bilgisine zıplatabilir — bu yüzden algoritma öncelikle onlara yönelir. Sonuç olarak: En kısa yol, veri setindeki en çabuk bayatlayan olgulara karşı sistematik olarak yanlıdır.

İlk denediğiniz yolun gerçek temas anında bu kadar sık çökmesinin ve nihayetinde denediğiniz beşinci yolun — daha uzun, daha zahmetli ama tamamen ACL’lerden oluşan yolun — her çalıştırdığınızda kusursuz işlemesinin asıl sebebi budur.

ACL GenericWrite · WriteDacl HAKLAR (RIGHTS) MemberOf · AdminTo OTURUM (SESSION) HasSession DAKİKALAR SAATLER GÜNLER AYLAR YILLAR EN KISA YOL en soldaki çubuğu tercih eder — bir oturum tek adımdır, bu yüzden uzunlukta kazanır
Bunların her biri aynı ok olarak görünür. Bir oturum kenarı bir iş istasyonundan bir Domain Admin parolasına tek adımdır; en kısa yol bunu seçer — oysa bu, siz adımı atana kadar süresi dolmuş olma ihtimali en yüksek bilgidir.

Bunun yerine kalıcı olan yolu isteyin

Çözüm daha iyi bir araç bulmak değil, sorguyu zamanla çürümeyen kenar türleriyle sınırlandırmaktır.

// Deterministik yol: Yalnızca ACL kenarları. Daha uzun, ama yarın da çalışır.
MATCH p = shortestPath(
  (n {owned: true})-[:Owns|GenericAll|GenericWrite|WriteDacl|WriteOwner|
                     AddMember|ForceChangePassword|AllExtendedRights*1..]->
  (g:Group {name: 'DOMAIN [email protected]'})
)
RETURN p

Ardından soruyu tersine çevirin — “Domain Admin’e nasıl giderim” yerine “Elimde tuttuğum bu tek hesap gerçekte nerelere erişebiliyor”:

MATCH (u:User {name: '[email protected]'})
MATCH p = (u)-[:MemberOf|AdminTo|GenericAll|GenericWrite|WriteDacl*1..3]->(c:Computer)
RETURN DISTINCT c.name, length(p) AS hops
ORDER BY hops

Ve geçici kenarları sessizce kabul etmek yerine onları açıkça görünür kılın:

// Yollarımdan hangileri birinin hala oturum açmış olmasına bağımlı?
MATCH p = shortestPath((n {owned: true})-[*1..]->(g:Group {name: 'DOMAIN [email protected]'}))
WHERE any(r IN relationships(p) WHERE type(r) = 'HasSession')
RETURN p

Eğer elinizdeki her yol canlı bir oturumdan geçiyorsa, henüz elinizde güvenilir bir bulgu yoktur. Yalnızca bir ekran görüntünüz vardır.

Göründüğünden çok daha değerli olan kenarlar

İki ilişki türü genellikle gereğinden az önemsenir; çünkü sıkıcı görünen bir adıma yalnızca tek bir sekme mesafededirler:

ReadLAPSPassword ilk bakışta sıradan bir bilgi ifşası gibi okunur. Oysa bu hakka sahip olan herkes için, o makinede kalıcı olarak yerel yönetici (Local Administrator) olmak demektir — ve LAPS dağıtımları bu okuma yetkisini genellikle insanların onayladığını unuttuğu geniş yardım masası (helpdesk) gruplarına devreder.

ReadGMSAPassword de aynı yapıdadır. Önemlidir; çünkü servis hesaplarını gMSA’ya taşımak Kerberoasting için doğru iyileştirme adımıdır — ancak sorunu silmek yerine bir DACL içine taşır. Eğer okuma hakkı gereğinden geniş verilmişse, gMSA 240 baytlık makine tarafından üretilmiş karmaşık bir parolaya sahip olsa bile, yetkili herhangi bir grup tarafından düz metin olarak okunabilir.

Her ikisi de ACL sınıfı kenarlardır. Kalıcıdırlar ve genellikle bir adım daha fazla gerektirdikleri için varsayılan en kısa yol sorgusunda görünmezler.

Grafiğin göremediği kör noktalar

Bir sızma testi raporunda bunu açıkça belirtmek gerekir; çünkü görsel aksini ima eder: Grafikte bir yolun bulunmaması, gerçekte hiçbir saldırı yolunun var olmadığı anlamına gelmez.

BloodHound yalnızca Active Directory ilişkilerini modeller. AD içinde hiç yer almayan ortak yerel yönetici parolalarını, paylaşımdaki bir deployment script’inde unutulmuş kimlik bilgilerini, bir veritabanına domain hesabıyla bağlanan bir web uygulamasını veya CI/CD sisteminde yaşayan yetkileri modellemez. Bunlar gerçek saldırı kenarlarıdır; yalnızca BloodHound toplayıcısının (collector) okuduğu türden veriler değildir.

Bunun ofansif taraftaki karşılığı da kritiktir: Grafik size hiçbir yol göstermediğinde, bu bir sonraki adımın olmadığı anlamına gelmez; genellikle bir sonraki adımın Active Directory sınırlarının dışında olduğu anlamına gelir.

Evidence matrix

SinyalNeyi kanıtlarNegatif kontrolSavunmacı doğrulaması
Bir ACL veya sahiplik kenarının iki farklı veri toplama döngüsünden sağ çıkmasıYolun sürekli bir denetim hatası olarak ele alınacak kadar kalıcı olduğunuGrafikten oturum (HasSession) kenarlarını kaldırın ve yolun hala var olduğunu doğrulayınNesne DACL’lerini yeniden toplayın ve iç içe gruplar üzerinden efektif hakları hesaplayın
Oturum kenarının yakın bir zaman damgasına ve erişilebilir bir host’a sahip olmasıVeri toplama anında geçici bir kimlik bilgisi fırsatının var olduğunuİlgili kullanıcının oturumunu kapatın ve tekrar veri toplayın; kenar kaybolmalıdırKenarı, oturum açma (logon) telemetrisi ve veri toplama penceresiyle korele edin
Grup üyeliğinin düşük seviyeli bir hesabı kalıcı bir yetkiye bağlamasıRota tasarımının bir uç nokta kazasına değil, kimlik yönetişimine dayandığınıTest amaçlı üyeliği kaldırın ve yolu yeniden hesaplayınİç içe grup üyeliklerini, grup sahibini, kullanım amacını ve süre sonunu gözden geçirin
Belirtilen hedefin test uzmanının ağ konumundan erişilebilir olmasıGrafik yolunun yalnızca teorik değil, operasyonel olarak da uygulanabilir olduğunuYönetim yolunu ağ seviyesinde engelleyin ve son adımın başarısız olduğunu doğrulayınGüvenlik duvarı, tiering ve idari oturum kısıtlamalarını AD verilerinden bağımsız doğrulayın

Sürekli karşılaştığım örüntü

Sonuçta kritik hale gelen ACL kenarları neredeyse hiçbir zaman doğrudan bir bireye atanmaz. Bir proje için bir OU üzerinde geniş haklar verilen bir grup olarak sisteme girerler ve proje bittikten sonra erişimi geri almak kimsenin sorumluluğunda olmadığı için sistemde kalırlar. Ardından grupların iç içe geçmesi (nesting) gerisini halleder: Grup ilgisiz bir nedenle başka bir gruba eklenir ve başlangıçta tek bir ekiple sınırlı olan bir ayrıcalık, sessizce üç farklı ekibin erişimine açılır.

Bu yüzden insanların yazdığı “Kullanıcı X’ten Domain Admin’e yol var” şeklindeki bulgular yanlış şekilde kapatılır. Tek bir üyeliği kaldırırsınız ve o özel yol kaybolur; ancak o yolu mümkün kılan kök izin tam olarak olduğu yerde kalmaya devam eder.

Savunmacılara teslim edilmesi gerekenler

Yolu değil, spesifik kenarı (edge) raporlayın. Yol bir demonstrasyondur. Asıl teknik bulgu; belirli bir nesne üzerindeki spesifik izin ve bu izne hangi iç içe grup yapısıyla ulaşıldığıdır. İptal edilebilecek olan şey budur.

Kalıcı olanı geçici olandan ayırın. Bir yol canlı bir oturuma dayanıyorsa, bunu açıkça belirtin. Bu yine de raporlanmaya değer bir kimlik maruziyetidir; ancak bir DACL yanlış yapılandırmasından tamamen farklı bir iyileştirme gerektirir ve ikisini birbirine karıştırmak her ikisinin de yanlış yönetilmesine yol açar.

Onlara ters sorguyu verin. Savunucular “bu grup nerelere erişebilir” sorgusundan, herhangi bir saldırı yolu grafiğinden çok daha fazla fayda sağlar; çünkü bu, doğrudan aksiyon alabilecekleri somut bir varlığa eşlenir: sahip oldukları bir grup ve o grubun erişebildiği hedeflerin net listesi.

Grafik bulgunun kendisi değildir. Grafik, bulgunun teknik gerekçesidir.

Kaynaklar ve güncellik

Bu teknik not ne kadar güncel?

Kontrol edilen kaynaklar19 Haziran 2025

En son kaynak incelemesi, içerik güncellemesi veya yayın tarihi gösterilmektedir.

İnceleme DurumuYazar incelemesi tamamlandı

Yazar teknik incelemeyi tamamladı. Bu etiket tek başına laboratuvar yeniden üretimi iddiası taşımaz.