BloodHound CE ile Defensif AD Analizi: Saldırı Yolu Yönetimi | Tağmaç - root@Tagoletta:~#
Contents

BloodHound CE ile Defensif AD Analizi: Saldırı Yolu Yönetimi

Mon Jun 29 2026 · 19 min read

Category: Security Research

# Active-Directory# BloodHound# Blue-Team# Defense# Windows

Giriş: Saldırganın Haritasını Savunmacı Kullanmak

2016 yılında Andy Robbins, Rohan Vazarkar ve Will Schroeder DEF CON'da BloodHound'u tanıttığında, seyirci salonundan yükselen tepki karışıktı: kırmızı takım üyeleri sevinirken, birçok sistem yöneticisi bunun ne kadar tehlikeli olduğunu anlamakta zorlandı. BloodHound, Active Directory ortamlarındaki ilişkileri bir grafik veritabanında modelleyen ve bu grafik üzerinde en kısa saldırı yollarını hesaplayan açık kaynaklı bir araçtı. Bir saldırgan, etki alanında herhangi bir standart kullanıcı hesabına sahip olsa bile Domain Admin'e giden yolu otomatik olarak bulabiliyordu.

Bugün tablo farklı. SpecterOps, BloodHound'u Attack Path Management (APM) kavramına dönüştürdü: artık bu araç yalnızca saldırganların kullandığı bir keşif silahı değil, blue team'lerin sürekli olarak AD güvenlik duruşunu ölçtüğü bir savunma platformudur. BloodHound Community Edition (CE), bu yeni nesil yaklaşımın ücretsiz, açık kaynak halidir.

Bu yazıda BloodHound CE'yi defensif bir perspektiften inceleyeceğiz: kurulumdan veri toplama metodolojisine, tier model implementasyonundan özel Cypher sorgularına, saldırı yolu önceliklendirmesinden sistematik iyileştirme iş akışına kadar her adımı derinlemesine ele alacağız. Amaç, organizasyonunuzun Active Directory ortamını bir saldırganın gözüyle görerek, o saldırgan harekete geçmeden önce kritik güvenlik açıklarını kapatmaktır.

BloodHound CE vs. Legacy BloodHound: Ne Değişti?

BloodHound tarihsel olarak üç farklı ürüne evrildi. Bu ayrımı anlamak, doğru aracı seçmek için kritiktir.

Legacy BloodHound (v4 ve öncesi)

Orijinal BloodHound, Electron tabanlı bir masaüstü uygulamasıydı. Tek kullanıcılıydı, Neo4j doğrudan yerel makinede çalışırdı. Kurulumu zahmetliydi ve özellikle Windows dışı platformlarda ciddi sorunlar yaşatırdı. Hâlâ çalışan ve belirli kullanım senaryoları için yeterli olan bu sürüm, büyük kurumsal ortamlar için artık önerilmemektedir.

BloodHound CE (Community Edition — v5+)

Modern BloodHound tamamen yeniden yazıldı. React tabanlı web arayüzü, Docker Compose ile saniyeler içinde ayağa kalkan servisler, çok kullanıcılı erişim desteği (RBAC), REST API ve iki veritabanı katmanı (PostgreSQL + Neo4j) ile gelir. Kurulum tek bir komut, erişim herhangi bir tarayıcıdan. BloodHound CE, GitHub üzerinde Apache 2.0 lisansıyla dağıtılmaktadır.

BloodHound Enterprise (BHE)

SpecterOps'un ticari ürünüdür. CE'nin tüm özelliklerine ek olarak sürekli Attack Path Management, otomatik raporlama, tenant-based çoklu orman desteği, Tier Zero asset yönetimi ve SIEM entegrasyonları sunar. Büyük kurumsal ortamlar için tasarlanmıştır; fiyatlandırma lisans bazındadır.

SharpHound vs BloodHound.py: Veri Toplayıcılar

  • SharpHound (.NET): Resmi kolektör. Windows'tan çalışır, domain-joined makine gerektirmez (uzaktan da kullanılabilir), en kapsamlı veri setini üretir. Tüm koleksiyon metodlarını destekler: ACL, Session, LoggedOn, ObjectProps, Trusts, Container, CertServices, GPOLocalGroup.
  • BloodHound.py (Python): Topluluk destekli, Linux/macOS'tan çalışır. Ağ erişimi ve geçerli domain kimlik bilgileri yeterlidir. Domain-joined makine gerekmez. LDAP+Kerberos üzerinden çalışır; SharpHound'a kıyasla bazı koleksiyon metodları eksik veya daha yavaş olabilir.

BloodHound CE Kurulum

BloodHound CE'nin en hızlı yolu Docker Compose'dur. Production ortamlarda ayrı bir analiz makinesi (jump host veya güvenli iş istasyonu) kullanmanız önerilir.

# Tek komutla kurulum — Docker ve Docker Compose gerekli
curl -L https://ghst.ly/getbhce | docker compose -f - up

# Arka planda çalıştır
curl -L https://ghst.ly/getbhce | docker compose -f - up -d

# Varsayılan URL: http://localhost:8080
# İlk giriş şifresi Docker log çıktısında gösterilir:
docker logs bloodhound-ce_bloodhound_1 2>&1 | grep "Initial Password"

Kurulum tamamlandığında BloodHound CE üç konteyner çalıştırır:

  • bloodhound: Ana BloodHound uygulaması (Go backend + React frontend)
  • graph-db: Neo4j 4.4 (Cypher sorgu motoru)
  • app-db: PostgreSQL (kullanıcı yönetimi, uygulama verisi)

İlk girişte şifreyi değiştirin ve analiz için bir domain kullanıcısı ya da API token oluşturun.

Güvenli Kurulum Notları:

# Production'da 0.0.0.0 yerine localhost'a bağla
# docker-compose.yml'de:
# ports:
#   - "127.0.0.1:8080:8080"

# TLS için önünde nginx reverse proxy kullanın
# Koleksiyon sırasında uç noktayı VPN arkasında tutun

SharpHound ile Veri Toplama

Veri toplama, tüm analizin temelidir. SharpHound'un ne topladığını ve nasıl çalıştırıldığını anlamak, hem doğru analiz için hem de koleksiyonun yarattığı ağ gürültüsünü değerlendirmek için kritiktir.

Temel Koleksiyon Metodları:

# Tüm veriyi topla (en kapsamlı, en gürültülü)
.\SharpHound.exe -c All --zipfilename corp_bhdata.zip

# Sadece DC'lerden topla — çok daha az gürültülü, hızlı
.\SharpHound.exe -c DCOnly

# Yalnızca ACL ve grup bilgisi (oturum verisi olmadan)
.\SharpHound.exe -c ACL,Group,ObjectProps,Container

# Session verisi — hangi kullanıcı hangi makinede oturum açmış
# Bu koleksiyon lokal admin hakları gerektirir (SMB üzerinden)
.\SharpHound.exe -c Session,LoggedOn --computermaxconn 5

# Belirli OU hedefle (büyük ortamlarda parçalı koleksiyon)
.\SharpHound.exe -c All --searchbase "OU=Workstations,DC=corp,DC=local"

# ADCS verisi (sertifika şablonları, CA'lar)
.\SharpHound.exe -c CertServices

# Uzak domain koleksiyonu (domain-joined olmayan makineden)
.\SharpHound.exe -c All -d corp.local --ldapusername jdoe --ldappassword 'P@ssw0rd'
# Linux'tan uzak koleksiyon (BloodHound.py)
pip3 install bloodhound
python3 bloodhound.py \
  -u jdoe \
  -p 'Password123' \
  -d corp.local \
  -dc dc01.corp.local \
  -c all \
  --zip \
  --dns-tcp

# Kerberos kimlik doğrulama ile (Pass-the-Hash veya PKINIT)
python3 bloodhound.py \
  -u [email protected] \
  --hashes :aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0 \
  -d corp.local \
  -dc dc01.corp.local \
  -c all \
  --zip

Koleksiyon Güvenliği ve Gürültü Yönetimi:

BloodHound koleksiyonu domain ortamında iz bırakır. Blue team olarak kendi koleksiyonunuzu yetkilendirdiğiniz bir zaman penceresi belirleyin:

  • Session koleksiyonu: Her hedefe SMB bağlantısı açar. IDS/IPS tarafından yakalanabilir.
  • LoggedOn koleksiyonu: Uzak registry (RemoteRegistry servisi) gerektirir, etkinleştirilmemiş sistemlerde çalışmaz.
  • ACL koleksiyonu: LDAP üzerinden çalışır, neredeyse sessizdir. Tercih edilir başlangıç noktası.
  • Koleksiyon için hizmet hesabı oluşturun: svc_bloodhound. Minimum haklar: domain user + RemoteRegistry okuma.

Tier Model (Katmanlı Yönetim Modeli)

BloodHound verisi ne kadar zengin olursa olsun, bir bağlam olmadan anlamsızdır. Bu bağlam Tier Modeldir — Microsoft'un ESAE (Enhanced Security Admin Environment) ve PAW (Privileged Access Workstations) çerçevesine dayanan kimlik bilgisi izolasyon mimarisi.

Tier 0 — Kontrol Düzlemi (Control Plane)

Tier 0, kimlik düzlemini kontrol eden varlıkları kapsar. Bu tier'ın güvenliği ihlal edilirse organizasyonun tüm dijital varlıkları tehlike altındadır.

Tier 0 varlıkları:

  • Domain Controllers (tüm DC'ler, RODC dahil)
  • Enterprise CA sunucuları (ADCS PKI altyapısı)
  • ADFS sunucuları (federation ve token imzalama)
  • Azure AD Connect / AAD Sync (kimlik senkronizasyonu, hash sync içerir)
  • Tier 0'ı yöneten yedekleme sistemleri (Veeam, Backup Exec — AD aware)
  • Domain Admins, Enterprise Admins, Schema Admins grupları
  • Tier 0 PAW'ları (bu varlıkları yöneten ayrıcalıklı erişim iş istasyonları)

Tier 1 — Sunucu Katmanı

Kurumsal uygulamalar, veritabanları ve altyapı servisleri. Tier 0 kimlik bilgileri bu tier'da asla kullanılmaz.

Tier 1 varlıkları:

  • Uygulama sunucuları (IIS, Tomcat, JBoss)
  • Veritabanı sunucuları (SQL Server, Oracle)
  • Dosya sunucuları (DFS, SMB paylaşımları)
  • Exchange / mail sunucuları (Exchange WriteDACL riski özellikle önemli)
  • SCCM / Intune yönetim sunucuları
  • Tier 1 servis hesapları

Tier 2 — Kullanıcı Katmanı

İnternet'e en çok maruz kalan, phishing ve başlangıç erişim saldırıları için birincil hedef tier.

Tier 2 varlıkları:

  • Kullanıcı workstationları ve laptoplar
  • Sanal masaüstleri (VDI)
  • Helpdesk hesapları (Tier 2 sınırı içinde tutulmalı)
  • Standart domain kullanıcıları

BloodHound ile Tier İhlallerini Tespit Etme:

Tier model uygulamadan önce mevcut ihlalleri tespit etmelisiniz. BloodHound bu konuda son derece değerlidir:

// Tier 2 kullanıcısından Tier 0 varlığına herhangi bir yol
// (Önce node'lara tier property ekleyin — BH custom properties veya dış etiketleme)
MATCH p=shortestPath(
  (u:User {enabled:true})
  -[*1..8]->
  (t:Computer)
)
WHERE t.name IN ['DC01.CORP.LOCAL', 'CA01.CORP.LOCAL', 'ADFSRV01.CORP.LOCAL']
AND NOT u.name STARTS WITH 'CORP\\DA-'
RETURN u.name, t.name, length(p) as Hops
ORDER BY Hops ASC

// Servis hesabı Tier 0 grubunda mı?
MATCH (u:User)-[:MemberOf*1..]->(g:Group)
WHERE g.name =~ '(?i).*(domain admins|enterprise admins|schema admins).*'
AND u.name =~ '(?i).*(svc_|service_|sa_).*'
RETURN u.name, g.name

Kritik Saldırı Yolu Türleri ve Tespiti

BloodHound'un güçlü olduğu birkaç kritik saldırı kategorisi vardır. Her birini, nasıl tespit edileceğini ve nasıl iyileştirileceğini tek tek ele alalım.

1. Kerberoasting Yolları

Kerberoasting, SPN (Service Principal Name) kayıtlı hesapların TGS biletlerini çevrimdışı kırmaya dayanan bir saldırıdır. BloodHound'da hasspn:true özelliğiyle sorgulanır.

Risk faktörleri:

  • Hesap admincount:true ise — doğrudan Domain Admin yolu
  • Şifre son değiştirilme tarihi eski ise — zayıf şifre olasılığı yüksek
  • RC4 şifreleme destekleniyorsa — modern GPU'larla çok hızlı kırılır
  • Hesap son giriş tarihi eski ise — sahipsiz hesap
// Kerberoastable hesaplar ve DA'ya uzaklıkları
MATCH (u:User {hasspn:true, enabled:true})
OPTIONAL MATCH p=shortestPath(
  (u)-[*1..10]->
  (g:Group {name:"DOMAIN [email protected]"})
)
RETURN u.name,
       u.serviceprincipalnames,
       u.pwdlastset,
       u.admincount,
       length(p) as HopsToDA
ORDER BY HopsToDA ASC NULLS LAST

// Yüksek değerli Kerberoastable hesaplar (DA yolunda)
MATCH (u:User {hasspn:true, enabled:true, admincount:true})
RETURN u.name,
       u.serviceprincipalnames,
       datetime({epochSeconds: toInteger(u.pwdlastset)}) as PasswordLastSet

İyileştirme öncelikleri:

  • Tüm Kerberoastable admin hesapları → gMSA (Group Managed Service Account) ile değiştir
  • gMSA mümkün değilse: AES256 şifreleme zorla, 25+ karakter şifre, 180 günde bir rotasyon
  • Hesabı Protected Users grubuna al (RC4 kaldırır, TGS süresi kısalır)

2. AS-REP Roasting

Kerberos ön kimlik doğrulaması devre dışı bırakılmış hesaplar, herhangi bir kimlik doğrulaması olmadan şifreli yanıt alabilir — bu yanıt çevrimdışı kırılabilir.

// AS-REP Roastable hesaplar ve etkileri
MATCH (u:User {dontreqpreauth:true, enabled:true})
OPTIONAL MATCH p=shortestPath(
  (u)-[*1..10]->
  (g:Group {name:"DOMAIN [email protected]"})
)
RETURN u.name,
       u.admincount,
       u.description,
       length(p) as HopsToDA
ORDER BY u.admincount DESC, HopsToDA ASC

// AS-REP Roastable + son 90 günde aktif
MATCH (u:User {dontreqpreauth:true, enabled:true})
WHERE u.lastlogontimestamp > (timestamp()/1000 - 7776000)
RETURN u.name, u.lastlogontimestamp, u.admincount

İyileştirme: Tüm hesaplar için Kerberos ön kimlik doğrulamasını etkinleştirin. Bu seçenek genellikle UNIX/Linux sistemlerin eski sürümlerini desteklemek için devre dışı bırakılmıştır — modern Kerberos istemcileri bunu destekler.

3. Unconstrained Delegation

Unconstrained delegation yapılandırılmış bir bilgisayara herhangi bir kullanıcı bağlandığında, o kullanıcının TGT'si bilgisayar belleğinde (LSASS) saklanır. Saldırgan bu bilgisayarı ele geçirirse ve PrintSpooler (MS-RPRN) gibi coercion saldırılarıyla DC'yi bu bilgisayara bağlatabilirse, DC'nin TGT'sini çalabilir — bu tam domain compromise anlamına gelir.

// Unconstrained delegation bilgisayarlar (DC'ler hariç)
MATCH (c:Computer {unconstraineddelegation:true, enabled:true})
WHERE NOT c.name CONTAINS 'DC'
RETURN c.name,
       c.operatingsystem,
       c.lastlogontimestamp,
       c.haslaps
ORDER BY c.name

// Bu bilgisayarlara lokal admin olan kullanıcılar
MATCH (u:User)-[:AdminTo]->(c:Computer {unconstraineddelegation:true, enabled:true})
WHERE NOT c.name CONTAINS 'DC'
RETURN u.name, c.name, u.enabled

İyileştirme seçenekleri:

  1. Unconstrained delegation'ı tamamen devre dışı bırak
  2. Resource-Based Constrained Delegation (RBCD) ile değiştir
  3. Bilgisayarı Protected Users grubuna ekle (delegation engellenir)
  4. "Account is sensitive and cannot be delegated" bayrağını set et (hesap bazında)
  5. DC'de PrintSpooler servisi devre dışı bırak (coercion engeli)

4. DCSync Hakları

DCSync, Domain Controller'ı taklit ederek tüm domain'in hash'lerini çeken bir saldırı tekniğidir. Bir hesabın bunu yapabilmesi için AD'de özel replikasyon izinleri (DS-Replication-Get-Changes-All) olması gerekir. Bu izin sadece DC bilgisayar hesaplarında ve bazı özel servis hesaplarında (MSOL_, AZURE_) olmalıdır.

// DCSync hakları olan tüm principal'lar
MATCH p=(n)-[:DCSync]->(d:Domain)
RETURN n.name, n.objectid, labels(n) as NodeType

// DC bilgisayarları hariç tut — bunlar meşru
MATCH p=(n)-[:DCSync]->(d:Domain)
WHERE NOT (n:Computer AND (
  n.name CONTAINS 'DC'
  OR n.name CONTAINS 'DOMAINCTRL'
))
RETURN n.name, labels(n) as NodeType, n.objectid

// DCSync + Domain Admin olmayan hesaplar
MATCH (n)-[:DCSync]->(d:Domain)
WHERE NOT EXISTS {
  MATCH (n)-[:MemberOf*..]->(g:Group {name:"DOMAIN [email protected]"})
}
RETURN n.name, labels(n)

İyileştirme: Azure AD Connect ve ADFS servis hesapları dışında hiçbir hesapta DCSync hakkı olmamalıdır. Yetkisiz DCSync hakları için hemen kaldırın ve son 30 günlük NTDS audit loglarını inceleyin.

5. LAPS Olmayan Bilgisayarlar

LAPS (Local Administrator Password Solution), her workstation'ın lokal Administrator şifresini otomatik olarak döndürür ve AD'de şifrelenmiş olarak depolar. LAPS olmayan ortamlarda tüm workstation'lar aynı lokal admin şifresine sahip olabilir — bir makineyi ele geçirmek tüm ağa pivot imkânı verir.

// LAPS olmayan aktif bilgisayarlar
MATCH (c:Computer {enabled:true})
WHERE c.haslaps = false
RETURN c.name,
       c.operatingsystem,
       c.lastlogontimestamp
ORDER BY c.lastlogontimestamp DESC NULLS LAST

// LAPS oranı (yüzde)
MATCH (c:Computer {enabled:true})
WITH count(c) as total
MATCH (c:Computer {enabled:true, haslaps:true})
RETURN count(c) as WithLAPS, total, (count(c)*100/total) as Percentage

// İşletim sistemine göre LAPS durumu
MATCH (c:Computer {enabled:true})
RETURN c.operatingsystem,
       count(c) as Total,
       sum(CASE WHEN c.haslaps THEN 1 ELSE 0 END) as WithLAPS
ORDER BY c.operatingsystem

Defensif Cypher Sorguları — Tam Kütüphane

Aşağıda blue team'lerin BloodHound CE'de düzenli olarak çalıştırması gereken sekiz temel sorgu kategorisi detaylandırılmıştır.

Sorgu 1: Domain Admin'e En Kısa Yollar

// Tüm etkin kullanıcılardan DA'ya en kısa yol (ilk 20)
MATCH p=shortestPath(
  (u:User {enabled:true})
  -[*1..10]->
  (g:Group {name:"DOMAIN [email protected]"})
)
WHERE NOT u.name STARTS WITH 'CORP\\DA-'
RETURN u.name, length(p) as PathLength
ORDER BY PathLength ASC
LIMIT 20

// En kısa yol uzunluğu dağılımı (kaç kullanıcı kaç adımda)
MATCH p=shortestPath(
  (u:User {enabled:true})
  -[*1..10]->
  (g:Group {name:"DOMAIN [email protected]"})
)
WITH length(p) as hops, count(u) as UserCount
RETURN hops, UserCount
ORDER BY hops ASC

Sorgu 2: DCSync Hakları

// DCSync haklarını tam olarak göster
MATCH p=(n)-[:DCSync]->(d:Domain)
WHERE NOT (n:Computer AND n.name CONTAINS 'DC')
RETURN n.name,
       n.objectid,
       labels(n) as NodeType,
       d.name as Domain
ORDER BY n.name

Sorgu 3: Unconstrained Delegation Bilgisayarlar

// Unconstrained delegation + LAPS durumu + son aktiflik
MATCH (c:Computer {unconstraineddelegation:true, enabled:true})
WHERE NOT c.name CONTAINS 'DC'
RETURN c.name,
       c.operatingsystem,
       c.haslaps,
       datetime({epochSeconds: toInteger(c.lastlogontimestamp)}) as LastSeen
ORDER BY c.lastlogontimestamp DESC NULLS LAST

Sorgu 4: Kerberoastable Hesaplar (Tier 2'den Ulaşılabilir)

// Tier 2 kullanıcısından ulaşılabilir Kerberoastable hesaplar
MATCH p=shortestPath(
  (u:User {enabled:true})
  -[*1..5]->
  (k:User {hasspn:true, enabled:true})
)
WHERE NOT u.admincount
RETURN u.name as SourceUser,
       k.name as KerberoastableTarget,
       k.serviceprincipalnames as SPNs,
       length(p) as Hops
ORDER BY Hops ASC
LIMIT 50

Sorgu 5: Kullanılmayan Admin Hesapları (90+ gün)

// 90 gün boyunca kullanılmayan admincount hesapları
MATCH (u:User {admincount:true, enabled:true})
WHERE u.lastlogontimestamp < (timestamp() / 1000 - 7776000)
RETURN u.name,
       u.description,
       datetime({epochSeconds: toInteger(u.lastlogontimestamp)}) as LastLogon,
       datetime({epochSeconds: toInteger(u.pwdlastset)}) as PasswordLastSet
ORDER BY u.lastlogontimestamp ASC

// Hiç giriş yapmamış admin hesapları
MATCH (u:User {admincount:true, enabled:true})
WHERE u.lastlogontimestamp <= 0 OR u.lastlogontimestamp IS NULL
RETURN u.name, u.description, u.whencreated

Sorgu 6: LAPS Olmayan Bilgisayarlar

// LAPS eksik, aktif, domain-joined bilgisayarlar
MATCH (c:Computer {enabled:true})
WHERE c.haslaps = false
RETURN c.name,
       c.operatingsystem,
       datetime({epochSeconds: toInteger(c.lastlogontimestamp)}) as LastSeen
ORDER BY c.operatingsystem, c.name

Sorgu 7: AS-REP Roastable Hesaplar

// Kerberos ön auth devre dışı, etkin hesaplar
MATCH (u:User {dontreqpreauth:true, enabled:true})
OPTIONAL MATCH p=shortestPath(
  (u)-[*1..10]->
  (g:Group {name:"DOMAIN [email protected]"})
)
RETURN u.name,
       u.admincount,
       u.description,
       length(p) as HopsToDA
ORDER BY HopsToDA ASC NULLS LAST

Sorgu 8: AdminSDHolder Dışı GenericAll Yetkisi

// Yüksek değerli hedeflere sahip, düşük ayrıcalıklı hesaplar
MATCH (u:User {enabled:true})-[:GenericAll|GenericWrite]->(t)
WHERE NOT u.admincount
AND (t:Group OR t:Computer OR t:User)
AND (t.highvalue OR t.admincount)
RETURN u.name as Attacker,
       t.name as HighValueTarget,
       labels(t) as TargetType
ORDER BY u.name

Bonus — Shadow Credentials (msDS-KeyCredentialLink):

// GenericWrite/GenericAll → msDS-KeyCredentialLink manipülasyonu
MATCH (u:User {enabled:true})-[r:GenericWrite|GenericAll|WriteAccountRestrictions]->(t:User|Computer)
WHERE NOT u.admincount
RETURN u.name as Source,
       t.name as Target,
       type(r) as EdgeType,
       t.enabled as TargetEnabled
ORDER BY u.name

Bonus — ADCS ESC Yolları:

// Sertifika şablonu aracılığıyla DC'ye yol
MATCH p=(u:User {enabled:true})
  -[:Enroll|GenericAll|GenericWrite]->
  (ct:CertTemplate)
  -[:PublishedTo]->
  (ca:EnterpriseCA)
WHERE ct.enrolleeSuppliesSubject = true
OR ct.authenticationenabled = true
RETURN u.name, ct.name, ca.name, ct.enrolleeSuppliesSubject

// ADCS ESC1: Herhangi bir kullanıcı enroll edebilir + EKU authentication
MATCH (ct:CertTemplate)
WHERE ct.enrolleeSuppliesSubject = true
AND ct.authenticationenabled = true
AND ct.requiresmanagerapproval = false
RETURN ct.name, ct.oid

Saldırı Yolu Önceliklendirme

Büyük organizasyonlarda yüzlerce saldırı yolu bulunabilir. Hepsini aynı anda düzeltmek mümkün değildir. Önceliklendirme için sistematik bir yaklaşım gerekir.

Risk Skoru Hesaplama:

Risk skoru = Etki × Olasılık × Exposure

  • Etki (1-5): Yol nereye götürüyor? Tier 0'a mı (5), Tier 1'e mi (3), Tier 2'ye mi (1)?
  • Olasılık (1-5): Yol uzunluğu. 1-2 hop (5), 3-4 hop (3), 5+ hop (1).
  • Exposure (1-3): Başlangıç hesabı internete maruz mu? Helpdesk/VPN/Webmail hesabı (3), internal-only kullanıcı (1).

Önceliklendirme Matrisi:

Risk Skoru Aksiyon SLA
60-75 ACİL — Hemen ele al 24-48 saat
40-59 YÜKSEK — Bu sprint 1 hafta
20-39 ORTA — Planlı düzeltme 1 ay
0-19 DÜŞÜK — Backlog 3 ay
// Önceliklendirme verisi: yol uzunluğu + hesap aktifliği + admin durumu
MATCH p=shortestPath(
  (u:User {enabled:true})
  -[*1..10]->
  (g:Group {name:"DOMAIN [email protected]"})
)
WITH u, length(p) as hops
RETURN u.name,
       hops,
       u.admincount,
       u.lastlogontimestamp,
       CASE
         WHEN hops <= 2 THEN 'CRITICAL'
         WHEN hops <= 4 THEN 'HIGH'
         WHEN hops <= 6 THEN 'MEDIUM'
         ELSE 'LOW'
       END as Priority
ORDER BY hops ASC, u.lastlogontimestamp DESC
LIMIT 100

BloodHound CE Attack Paths Sekmesi:

BloodHound CE v5'in "Attack Paths" sekmesi bu önceliklendirmeyi otomatik olarak yapar. Sekmeye erişim:

  1. Sol menü → "Explore" yerine "Attack Paths"
  2. Domain seçin
  3. Tier Zero varlıklarınızı tanımlayın (özelleştirilebilir)
  4. "Findings" bölümü otomatik önceliklendirilmiş liste sunar

Saldırı Yolu İyileştirme İş Akışı

Her kenar (edge) türü için spesifik iyileştirme adımları:

GenericAll / GenericWrite → Kaldır

# PowerView ile ACE kaldır
Import-Module PowerView.ps1

# Kimin erişimi var kontrol et
Get-DomainObjectAcl -Identity "SVC_SQL" -ResolveGUIDs |
  Where-Object {$_.ActiveDirectoryRights -match "GenericAll"}

# ACE kaldır
Remove-DomainObjectAcl `
  -TargetIdentity "SVC_SQL" `
  -PrincipalIdentity "jdoe" `
  -Rights All `
  -Verbose

# AD Module ile kaldır (PowerView yerine)
$acl = Get-Acl "AD:\CN=SVC_SQL,OU=ServiceAccounts,DC=corp,DC=local"
# GenericAll ACE'yi bul ve kaldır
$ace = $acl.Access | Where-Object {
  $_.IdentityReference -eq "CORP\jdoe" -and
  $_.ActiveDirectoryRights -match "GenericControl"
}
$acl.RemoveAccessRule($ace)
Set-Acl "AD:\CN=SVC_SQL,OU=ServiceAccounts,DC=corp,DC=local" $acl

MemberOf (Yanlış Grup Üyeliği) → Kaldır

# Hesabı Domain Admins'ten kaldır
Remove-ADGroupMember `
  -Identity "Domain Admins" `
  -Members "SVC_SQL" `
  -Confirm:$false

# Tüm admin grup üyeliklerini kontrol et
Get-ADUser "SVC_SQL" -Properties MemberOf |
  Select-Object -ExpandProperty MemberOf |
  Get-ADGroup |
  Where-Object {$_.AdminCount -eq 1}

Unconstrained Delegation → Kaldır veya Kısıtla

# Unconstrained delegation'ı kaldır
Set-ADComputer "APPSERVER01" `
  -TrustedForDelegation $false

# Constrained delegation ile değiştir
Set-ADComputer "APPSERVER01" `
  -TrustedToAuthForDelegation $true  # Protocol transition
Set-ADComputer "APPSERVER01" `
  -ServicePrincipalNames @{Add="HTTP/webapp.corp.local"}

# Protected Users grubuna ekle (hesap bazında — delegation tamamen engellenir)
Add-ADGroupMember "Protected Users" -Members "APPSERVER01$"

Kerberoastable Hesap → gMSA ile Değiştir

# gMSA oluştur
New-ADServiceAccount `
  -Name "gMSA_SQL" `
  -DNSHostName "sql-srv01.corp.local" `
  -PrincipalsAllowedToRetrieveManagedPassword "SQL-SRV01$" `
  -KerberosEncryptionType AES128,AES256

# SQL Server servisini gMSA ile yapılandır
# SQL Server Configuration Manager → Service Account → NT SERVICE\gMSA_SQL$

# Eski servis hesabını devre dışı bırak
Disable-ADAccount "svc_sql"

HasSession → PAW Uygula

# Tier 0 admin hesaplarının Tier 2 makinelerde oturum açmasını engelle
# Restricted Admin Mode GPO
# Computer Config → Admin Templates → System → Credentials Delegation
# "Restrict delegation of credentials to remote servers" = Enabled

# Protected Users grubuna admin hesapları ekle
Add-ADGroupMember "Protected Users" -Members "DA-jsmith"

# Logon workstations kısıtla (hesap bazında)
Set-ADUser "DA-jsmith" -LogonWorkstations "PAW-01,PAW-02,PAW-03"

BloodHound ile ADCS (Active Directory Certificate Services) Analizi

ADCS, son yıllarda kritik bir saldırı yüzeyi olarak ön plana çıktı. Will Schroeder ve Lee Christensen'ın "Certified Pre-Owned" araştırması, onlarca farklı sertifika şablonu kötüye kullanım senaryosunu belgeledi. BloodHound CE, ADCS ilişkilerini (CertTemplate, EnterpriseCA, IssuedSignedBy) grafik üzerinde modelleyerek bu saldırı yollarını görselleştirir.

ESC1 — Enrollee Supplies Subject + EKU Auth:

// ESC1: Herhangi kullanıcı kendini DC olarak tanıtabilen sertifika alabilir
MATCH (ct:CertTemplate)
WHERE ct.enrolleeSuppliesSubject = true
AND ct.authenticationenabled = true
AND ct.requiresmanagerapproval = false
AND ct.nosecurityextension = false
MATCH (ca:EnterpriseCA)-[:PublishedTo]->(ct)
MATCH (u:User {enabled:true})-[:Enroll|GenericAll|GenericWrite]->(ct)
RETURN u.name, ct.name, ca.name
ORDER BY u.name

ESC4 — Template Overwrite:

// ESC4: Kullanıcı sertifika şablonunu değiştirebilir
MATCH (u:User {enabled:true})-[:GenericAll|GenericWrite|WriteDacl|WriteOwner]->(ct:CertTemplate)
WHERE NOT u.admincount
RETURN u.name, ct.name, u.enabled
ORDER BY u.name

ESC7 — CA Officer/Manager:

// ESC7: CA manage yetkisi — isteğe bağlı sertifika onayı
MATCH (u:User {enabled:true})-[:ManageCertificates|ManageCA]->(ca:EnterpriseCA)
WHERE NOT u.admincount
RETURN u.name, ca.name

ADCS İyileştirme Kontrol Listesi:

# Tüm sertifika şablonlarını listele
certutil -v -template | Select-String "Template Name:"

# ESC1 için: EnrolleesCanRequestCertificates kaldır
# Certificates snap-in (certtmpl.msc):
# Şablon → Özellikler → Konu Adı → "Bu bilgiyi Active Directory'den al" seçin

# Manager approval zorunlu kıl (kritik şablonlar için)
# Şablon → Özellikler → Verme Gereksinimleri → "CA yöneticisinin onayı" = ON

# NTLM relay için HTTP'yi devre dışı bırak (ESC8)
# IIS Authentication → Devre Dışı Bırak: Windows Authentication (NTLM)
# Etkinleştir: HTTPS + FQDN enrollment

Otomatik Raporlama ve Sürekli İzleme

BloodHound CE, REST API sunar. Bu API'yi kullanarak haftalık otomatik raporlama sistemi kurabilirsiniz.

# BloodHound CE API kimlik doğrulama
TOKEN=$(curl -s -X POST http://localhost:8080/api/v2/auth/login \
  -H "Content-Type: application/json" \
  -d '{"login_name":"admin","secret":"YourPassword123"}' \
  | jq -r '.data.session_token')

echo "Token: $TOKEN"
#!/usr/bin/env python3
"""
BloodHound CE Haftalık Defensif Rapor
Her Pazartesi sabahı çalıştırın: cron 0 8 * * 1
"""
import requests
import json
from datetime import datetime, timedelta

BHCE_URL = "http://localhost:8080"
USERNAME = "svc_reporting"
PASSWORD = "SecureP@ss!"

def get_token():
    r = requests.post(f"{BHCE_URL}/api/v2/auth/login",
                      json={"login_name": USERNAME, "secret": PASSWORD})
    return r.json()["data"]["session_token"]

def run_cypher(token, query):
    headers = {"Authorization": f"Bearer {token}",
               "Content-Type": "application/json"}
    r = requests.post(f"{BHCE_URL}/api/v2/graphs/cypher",
                      headers=headers,
                      json={"query": query})
    return r.json()

def generate_weekly_report():
    token = get_token()
    report = {
        "date": datetime.now().isoformat(),
        "findings": {}
    }

    # En kısa yollar
    da_paths = run_cypher(token, """
        MATCH p=shortestPath(
          (u:User {enabled:true})-[*1..10]->
          (g:Group {name:"DOMAIN [email protected]"})
        )
        RETURN u.name, length(p) as hops
        ORDER BY hops ASC LIMIT 20
    """)
    report["findings"]["shortest_paths_to_da"] = da_paths

    # DCSync hakları
    dcsync = run_cypher(token, """
        MATCH (n)-[:DCSync]->(d:Domain)
        WHERE NOT (n:Computer AND n.name CONTAINS 'DC')
        RETURN n.name, labels(n)
    """)
    report["findings"]["dcsync_accounts"] = dcsync

    # Stale adminler
    stale = run_cypher(token, f"""
        MATCH (u:User {admincount:true, enabled:true})
        WHERE u.lastlogontimestamp < {int((datetime.now() - timedelta(days=90)).timestamp())}
        RETURN u.name, u.lastlogontimestamp
        ORDER BY u.lastlogontimestamp ASC
    """)
    report["findings"]["stale_admins"] = stale

    # Raporu kaydet
    filename = f"bhce_report_{datetime.now().strftime('%Y%m%d')}.json"
    with open(filename, 'w') as f:
        json.dump(report, f, indent=2)

    print(f"[+] Rapor kaydedildi: {filename}")
    return report

if __name__ == "__main__":
    report = generate_weekly_report()

    # Kritik bulgular için uyarı
    if report["findings"]["dcsync_accounts"].get("data", {}).get("nodes"):
        print("[!] KRİTİK: Yetkisiz DCSync hesapları tespit edildi!")
        # E-posta/Slack/Teams bildirimi gönderin

Delta Analizi — Haftadan Haftaya Değişim:

def compare_reports(old_report, new_report):
    """Önceki haftaya göre yeni saldırı yollarını tespit et"""
    old_users = set(
        item["u.name"]
        for item in old_report["findings"]["shortest_paths_to_da"].get("data", {}).get("nodes", [])
    )
    new_users = set(
        item["u.name"]
        for item in new_report["findings"]["shortest_paths_to_da"].get("data", {}).get("nodes", [])
    )

    new_exposures = new_users - old_users
    fixed_paths = old_users - new_users

    if new_exposures:
        print(f"[!] YENİ MARUZ KALAN HESAPLAR: {new_exposures}")
    if fixed_paths:
        print(f"[+] İYİLEŞTİRİLEN HESAPLAR: {fixed_paths}")

Savunma Yatırımı Öncelikleri

BloodHound analizi tamamlandığında, mevcut bulgulara bakılmaksızın şu temel güvenlik kontrolleri her AD ortamında olmalıdır:

1. Tier 0 İzolasyonu

  • DC'ler, CA'lar ve ADFS için ayrı OU yapısı
  • PAW (Privileged Access Workstation): Tier 0 yönetimi için ayrı, hardened iş istasyonları
  • Admin hesapları için ayrı kimlik bilgileri (jsmithDA-jsmith)
  • JIT (Just-In-Time) erişim: admin hakları sadece gerektiğinde ve süre sınırlı

2. Tüm Admin Hesapları için MFA

  • Azure AD MFA veya Microsoft Authenticator
  • Smart card / Windows Hello for Business (FIDO2)
  • Phishing-resistant MFA tercih edilmeli
  • Conditional Access ile konuma ve cihaza göre kısıtlama

3. LAPS Deployment

  • Windows LAPS (Windows 11 / Server 2022 dahili)
  • Eski Windows: Microsoft LAPS MSI
  • Her workstation ve server'a — DC'ler hariç
  • Şifre rotasyonu: 24 saat (workstations), 48 saat (servers)
  • LAPS şifresine erişimi ayrıcalıklı gruplara sınırlayın

4. SMB Signing Zorunlu

# GPO: Computer Configuration → Windows Settings →
# Security Settings → Local Policies → Security Options
# "Microsoft network server: Digitally sign communications (always)" = Enabled
# "Microsoft network client: Digitally sign communications (always)" = Enabled

5. Protected Users Grubu

  • Tüm Tier 0 hesapları Protected Users üyesi olmalı
  • Etkiler: RC4 kaldırır, delegation engeller, NTLM kaldırır, TGT süresi kısalır
  • Dikkat: Bazı eski uygulamalar NTLM gerektiriyor olabilir — test edin!

6. Credential Guard

# Credential Guard aktifleştir (UEFI + Secure Boot gerekli)
# GPO: Computer Config → Admin Templates → System → Device Guard
# "Turn On Virtualization Based Security" = Enabled
# "Credential Guard Configuration" = Enabled with UEFI lock

# PowerShell ile kontrol
(Get-ComputerInfo).DeviceGuardSecurityServicesRunning

7. Haftalık BloodHound Analizi

  • SharpHound koleksiyonu: Her Pazar gecesi otomatik
  • Delta analizi: Yeni yollar var mı?
  • Ticket oluştur: Öncelikli bulgular için Jira/ServiceNow
  • Metrikleri izle: Domain'deki ortalama yol uzunluğu trend analizi

8. Audit Logging (Olay İzleme)

# DCSync attempt detection — Event ID 4662
# DS-Replication-Get-Changes-All erişim girişimi
# SIEM kuralı: Event 4662 + AccessMask = 0x100 veya 0x10

# AdminSDHolder değişiklik tespiti — Event ID 5136
# SIEM kuralı: 5136 + ObjectClass = ms-DS-Admin-Count

# Yetkisiz ACL değişikliği — Event ID 5136, 4670
# Kerberoast girişimi — Event ID 4769 + TicketOptions 0x40810000

Referanslar ve Kaynaklar

Birincil Kaynaklar:

  • Andy Robbins, Rohan Vazarkar, Will Schroeder — BloodHound (2016) ve tüm subsequent research
  • SpecterOps — Attack Path Management metodolojisi ve BloodHound CE
  • GitHub: github.com/SpecterOps/BloodHound (Apache 2.0)

Akademik ve Teknik Referanslar:

  • Microsoft ESAE (Enhanced Security Admin Environment) — Emekli oldu, yerine Enterprise Access Model geçti
  • Microsoft Enterprise Access Model — Katmanlı yönetim için güncel rehber
  • "Certified Pre-Owned" — Will Schroeder, Lee Christensen (ADCS saldırıları)
  • "The Dog Whisperer's Handbook" — harmj0y (BloodHound kullanım rehberi)
  • "An Ace Up the Sleeve" — Andy Robbins, Will Schroeder (ACL saldırıları)
  • "Not a Security Boundary" — Andy Robbins (forest trust saldırıları)

Araçlar:

  • SharpHound: github.com/SpecterOps/SharpHound
  • BloodHound.py: github.com/dirkjanm/BloodHound.py
  • PowerView: github.com/PowerShellMafia/PowerSploit
  • Impacket: github.com/fortra/impacket (DCSync, AS-REP roasting, Kerberoasting)
  • Certipy: github.com/ly4k/Certipy (ADCS saldırı ve analiz)

Sıkça Sorulan Sorular

BloodHound Community Edition nedir?

BloodHound CE, SpecterOps tarafından geliştirilen ücretsiz ve açık kaynaklı bir graf aracıdır; Active Directory ve Azure'daki ilişkileri haritalayarak saldırı yollarını ortaya çıkarır. Savunmacılar, bir saldırganın Domain Admin'e ulaşabileceği en kısa yolları bulup kesmek için kullanır.

Mavi takımlar BloodHound'u savunmada nasıl kullanır?

SharpHound/AzureHound verilerini düzenli toplayarak, yüksek değerli darboğaz (choke-point) kenarlarını önceliklendirerek, katmanlı yönetim (tier) modeli uygulayarak ve saldırı yolu maruziyetini tek seferlik denetim yerine zaman içinde izlenen bir güvenlik metriği olarak takip ederek.

Attack Path Management nedir?

SpecterOps tarafından tanımlanan, kritik varlıklara giden saldırı yollarını belirleme, önceliklendirme ve giderme disiplinidir — her yanlış yapılandırmanın peşinden koşmak yerine, aynı anda birçok yolu ortadan kaldıran az sayıdaki yüksek etkili kenara odaklanır.

Özel Cypher sorguları ne için kullanılır?

Cypher, BloodHound'un graf sorgu dilidir. Mavi takımlar, varsayılan sorguların kaçırdığı riskleri ortaya çıkarmak için özel sorgular yazar — örneğin tier-0 nesnelerini kontrol eden tier-0 dışı principal'lar, gölge adminler veya ortama özgü tehlikeli ACL zincirleri.