Series · 4 partsInternal Network TriagePart 4 · You are here
- 1Kerberoasting Triyajı: Çoğu Servis Bileti Zaman Kaybıdır
- 2SMB Signing Açık. Bu Grafikte Sadece Bir Kenarı Kapattı
- 3Kerberos Delegasyon Triyajı: Unconstrained, Constrained ve RBCD
- 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.
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
| Sinyal | Neyi kanıtlar | Negatif kontrol | Savunmacı 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ğunu | Grafikten oturum (HasSession) kenarlarını kaldırın ve yolun hala var olduğunu doğrulayın | Nesne 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ır | Kenarı, 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ğunu | Yönetim yolunu ağ seviyesinde engelleyin ve son adımın başarısız olduğunu doğrulayın | Gü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.
Bu teknik not ne kadar güncel?
En son kaynak incelemesi, içerik güncellemesi veya yayın tarihi gösterilmektedir.
Yazar teknik incelemeyi tamamladı. Bu etiket tek başına laboratuvar yeniden üretimi iddiası taşımaz.
