
Beacon Object File (BOF) que implementa la funcionalidad de dnscmd.exe utilizada para obtener ejecución remota de código en un servidor ADIDNS explotando el edge ServerLevelPluginDll mediante MS-DNSP.
Implementación de Beacon Object File (BOF) de la funcionalidad de dnscmd.exe utilizada para obtener ejecución remota de código en un servidor ADIDNS explotando el edge ServerLevelPluginDll1 2 3 mediante MS-DNSP. 4 La explotación requiere acceso a una cuenta de usuario que sea miembro del grupo DnsAdmins.
[!NOTE] Debido a que los BOFs no soportan excepciones de C de forma nativa, esta extensión se engancha al método
RtlRaiseExceptiony devuelve el flujo de control al BOF durante las llamadas RPC. Aunque este método es chapucero, es necesario debido a que la implementación de RPC de Microsoft hace un uso intensivo de RpcTryExcept para el flujo de control. Esto funcionó bien en un entorno de pruebas, pero ten en cuenta que esta técnica podría provocar inestabilidad en el beacon.
Para compilar el proyecto, puedes usar make en un sistema con MinGW instalado:
make
Alternativamente, usa .\build.bat si estás usando el Símbolo del sistema de herramientas nativas x64 para Visual Studio en Windows:
.\build.bat
Ambos pasos de compilación producirán tanto los archivos .o como los archivos .exe para experimentar con la funcionalidad del BOF en un entorno de laboratorio.
Se han creado los siguientes BOFs para interactuar con el servidor ADIDNS:
dnsrpc_probe - Comprueba si el servidor ADIDNS está activodnsrpc_info - Obtiene la configuración actual del servidor ADIDNSdnsrpc_coerce_write - Utilidad para forzar al servidor ADIDNS a escribir un archivo en un recurso compartido de red para comprobar si tu DC puede alcanzar dicho recurso antes de dejarlo inservible mediante el plugin dnsrpc_set_plugin_dll.dnsrpc_set_plugin_dll - Configura la DLL que se cargará cuando se reinicie el servidordnsrpc_restart_server - Ordena al servidor ADIDNS reiniciarsednsrpc_cleanup - Limpia los artefactos del registro dejados por los comandos dnsrpc_coerce_write y dnsrpc_set_plugin_dll. Debe ejecutarse en el propio controlador de dominio.Además, se ha proporcionado un payload de ejemplo en dnssrv_plugin.c.
[!WARNING] Si el DC, por cualquier motivo, no puede acceder al payload DLL que especificaste con
dnsrpc_set_pugin_dll, se negará a reiniciarse y probablemente dejarás todo el dominio inservible. Considera usardnsrpc_coerce_writepara comprobar si el DC puede conectarse realmente a tu recurso compartido antes de destruir accidentalmente el objetivo. La gente tiende a enfadarse cuando su DNS se cae.Además,
dnsrpc_restart_serverprovocará dos minutos de caída del DNS. Llamar al BOF varias veces hará que el tiempo de espera aumente cada vez, así que úsalo con moderación.
Para probar los BOFs en un entorno de desarrollo, puedes usar una herramienta como COFFLoader de TrustedSec, que se puede compilar en Windows de la siguiente manera:
cl.exe /W4 /DCOFF_STANDALONE /DDEBUG beacon_compatibility.c COFFLoader.c /Fe:COFFLoader.exe /link advapi32.lib
Luego, para ejecutar un BOF (es decir, el BOF dnsrpc_info), genera los argumentos y pásalos al COFFLoader:
> python beacon_generate.py
Beacon Argument Generator
Beacon>addWString DC01
Beacon>generate
b'0e0000000a00000044004300300031000000'
Beacon> exit
> cl.exe /c /GS- dnsrpc_info.c /Fo:dist\dnsrpc_info.o
> COFFLoader.exe go dist\dnsrpc_info.o 0e0000000a00000044004300300031000000
...
$SG77912
: Section: 3, Value: 0xA08
$SG77914H
: Section: 3, Value: 0xA48
$SG77915X
: Section: 3, Value: 0xA58
.chks64: Section: 11, Value: 0x0
X: Section: 0, Value: 0x0
Back
Returning
Ran/parsed the coff
Outdata Below:
server name: DC01.research.lan
server version: 4F7C000A (10.0 build 20348)
rpc structure version: 2 (longhorn)
directory services available: yes
admin configured: yes
allow update: yes
is read-only domain controller: no
boot method: 3 (registry)
no recursion: no
round robin: yes
secure responses: yes
forward timeout: 3
recursion retry: 3
recursion timeout: 8
max cache ttl: 86400
directory services polling interval: 180
scavenging interval: 0
log level: 0x00000000
directory services container: cn=MicrosoftDNS,cn=System,DC=research,DC=lan
domain name: research.lan
forest name: research.lan
log file path: (none)
server addresses: fe80:0000:0000:0000:4cbe:0281:82dd:76ed, 172.16.50.107
listen addresses: (none)
forwarders: 8.8.8.8, 1.1.1.1
Para recompilar las definiciones IDL, puedes usar el siguiente comando:
midl /W1 /char signed /env x64 /target NT100 /Oicf dnsrpc.idl
Durante el desarrollo, el flag _DEBUG añadirá un wmain al binario final, y el flag _VERBOSE se usa para incluir registro de depuración adicional. Para más información, consulta build.bat y Makefile.
Este proyecto está licenciado bajo la Licencia MIT; consulta el archivo LICENSE para más detalles. No me hago responsable de ningún uso indebido o daño causado por el uso de esta herramienta. Úsala únicamente en entornos donde tengas permiso explícito para hacerlo.
https://raw.githubusercontent.com/paradoxis/dnsrpc-bof/HEAD/%3Chttps:/medium.com/@esnesenon/feature-not-bug-dnsadmin-to-dc-compromise-in-one-line-a0f779b8dc83%3E ↩
https://raw.githubusercontent.com/paradoxis/dnsrpc-bof/HEAD/%3Chttps:/www.semperis.com/blog/dnsadmins-revisited/%3E ↩
https://raw.githubusercontent.com/paradoxis/dnsrpc-bof/HEAD/%3Chttps:/www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/from-dnsadmins-to-system-to-domain-compromise%3E ↩
https://raw.githubusercontent.com/paradoxis/dnsrpc-bof/HEAD/%3Chttps:/learn.microsoft.com/en-us/openspecs/windows_protocols/ms-dnsp/9500a7e8-165d-4b13-be86-0ddc43100eef%3E ↩