
Beacon Object File (BOF) que implementa a funcionalidade do dnscmd.exe usada para obter execução remota de código em um servidor ADIDNS, explorando a borda ServerLevelPluginDll por meio do MS-DNSP.
Implementação em Beacon Object File (BOF) da funcionalidade do dnscmd.exe usada para obter execução remota de código em um servidor ADIDNS explorando a borda ServerLevelPluginDll1 2 3 por meio do MS-DNSP. 4 A exploração requer acesso a uma conta de usuário que seja membro do grupo DnsAdmins.
[!NOTE] Devido ao fato de que BOFs não suportam exceções C nativamente, esta extensão faz hook no método
RtlRaiseExceptione retorna o fluxo de controle de volta ao BOF durante chamadas RPC. Embora esse método seja improvisado, é necessário devido ao fato de que a implementação RPC da Microsoft faz uso intenso de RpcTryExcept para o fluxo de controle. Isso funcionou bem em um ambiente de teste, mas esteja ciente de que essa técnica pode resultar em instabilidade do beacon.
Para compilar o projeto, você pode usar make em um sistema com MinGW instalado:
make
Alternativamente, use .\build.bat se estiver usando o Prompt de Comando de Ferramentas Nativas x64 para Visual Studio no Windows:
.\build.bat
Ambas as etapas de compilação produzirão tanto os arquivos .o quanto os arquivos .exe para testar a funcionalidade do BOF em um ambiente de laboratório.
Os seguintes BOFs foram criados para interagir com o servidor ADIDNS:
dnsrpc_probe - Verifica se o servidor ADIDNS está ativodnsrpc_info - Obtém as configurações atuais do servidor ADIDNSdnsrpc_coerce_write - Utilitário para forçar o servidor ADIDNS a escrever um arquivo em um compartilhamento de rede para testar se seu DC consegue alcançar o compartilhamento de rede especificado antes de danificá-lo por meio do plugin dnsrpc_set_plugin_dll.dnsrpc_set_plugin_dll - Configura a DLL a ser carregada quando o servidor for reiniciadodnsrpc_restart_server - Emite o reinício do servidor ADIDNSdnsrpc_cleanup - Limpa os artefatos do registro deixados pelos comandos dnsrpc_coerce_write e dnsrpc_set_plugin_dll. Deve ser executado no próprio controlador de domínio.Além disso, um payload de exemplo foi fornecido em dnssrv_plugin.c.
[!WARNING] Se o DC, por qualquer motivo, não conseguir acessar o payload DLL que você especificou com
dnsrpc_set_pugin_dll, ele se recusará a reiniciar e você provavelmente prejudicará todo o domínio. Considere usardnsrpc_coerce_writepara testar se o DC consegue realmente se conectar ao seu compartilhamento antes de acidentalmente destruir o alvo. As pessoas tendem a ficar irritadas quando o DNS delas cai.Além disso, o
dnsrpc_restart_serverresultará em dois minutos de indisponibilidade do DNS. Chamar o BOF várias vezes fará com que o tempo limite aumente a cada vez, então use-o com moderação.
Para testar os BOFs em um ambiente de desenvolvimento, você pode usar uma ferramenta como o COFFLoader da TrustedSec, que pode ser compilada no Windows da seguinte forma:
cl.exe /W4 /DCOFF_STANDALONE /DDEBUG beacon_compatibility.c COFFLoader.c /Fe:COFFLoader.exe /link advapi32.lib
Em seguida, para executar um BOF (ou seja: o BOF dnsrpc_info), gere os argumentos e passe-os ao 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 as definições IDL, você pode usar o seguinte comando:
midl /W1 /char signed /env x64 /target NT100 /Oicf dnsrpc.idl
Durante o desenvolvimento, a flag _DEBUG resultará na adição de um wmain ao binário final, e a flag _VERBOSE é usada para incluir registro de depuração extra. Para mais informações, consulte o build.bat e o Makefile.
Este projeto é licenciado sob a Licença MIT - consulte o arquivo LICENSE para detalhes. Não me responsabilizo por qualquer uso indevido ou danos causados pelo uso desta ferramenta. Use-a apenas em ambientes onde você tenha permissão explícita para fazê-lo.
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 ↩