
Beacon Object File (BOF)-Implementierung der dnscmd.exe-Funktionalität, die verwendet wird, um Remote-Codeausführung auf einem ADIDNS-Server zu erlangen, indem die ServerLevelPluginDll-Schwachstelle über MS-DNSP ausgenutzt wird.
Beacon Object File (BOF)-Implementierung der dnscmd.exe-Funktionalität, die verwendet wird, um Remote-Codeausführung auf einem ADIDNS-Server zu erlangen, indem die ServerLevelPluginDll-Ecke1 2 3 über MS-DNSP ausgenutzt wird. 4 Für die Ausnutzung ist ein Benutzerkonto erforderlich, das Mitglied der Gruppe DnsAdmins ist.
[!NOTE] Da BOFs C-Ausnahmen nicht nativ unterstützen, greift diese Erweiterung in die Methode
RtlRaiseExceptionein und gibt die Kontrollflusssteuerung während RPC-Aufrufen an den BOF zurück. Obwohl diese Methode hacky ist, ist sie notwendig, da Microsofts RPC-Implementierung stark auf RpcTryExcept für die Kontrollflusssteuerung setzt. Dies funktionierte in einer Testumgebung einwandfrei, aber beachten Sie, dass diese Technik zu Beacon-Instabilität führen kann.
Um das Projekt zu kompilieren, können Sie entweder make auf einem System mit installiertem MinGW verwenden:
make
Alternativ verwenden Sie .\build.bat, wenn Sie die x64 Native Tools-Eingabeaufforderung für Visual Studio unter Windows verwenden:
.\build.bat
Beide Kompilierungsschritte erzeugen sowohl die .o-Dateien als auch .exe-Dateien, um mit der BOF-Funktionalität in einer Laborumgebung herumzuspielen.
Die folgenden BOFs wurden erstellt, um mit dem ADIDNS-Server zu interagieren:
dnsrpc_probe – Prüft, ob der ADIDNS-Server aktiv istdnsrpc_info – Ruft die aktuellen ADIDNS-Servereinstellungen abdnsrpc_coerce_write – Dienstprogramm, um den ADIDNS-Server zu zwingen, eine Datei auf eine Netzwerkfreigabe zu schreiben, um zu testen, ob Ihr DC die angegebene Netzwerkfreigabe erreichen kann, bevor Sie ihn über das Plugin dnsrpc_set_plugin_dll zerstören.dnsrpc_set_plugin_dll – Konfiguriert die DLL, die beim Neustart des Servers geladen werden solldnsrpc_restart_server – Veranlasst den ADIDNS-Server zum Neustartdnsrpc_cleanup – Bereinigt die Registrierungsartefakte, die von den Befehlen dnsrpc_coerce_write und dnsrpc_set_plugin_dll hinterlassen wurden. Muss auf dem Domänencontroller selbst ausgeführt werden.Darüber hinaus wurde ein Beispiel-Payload in dnssrv_plugin.c bereitgestellt.
[!WARNING] Wenn der DC aus irgendeinem Grund die DLL-Payload, die Sie mit
dnsrpc_set_pugin_dllangegeben haben, nicht erreichen kann, weigert er sich, wieder hochzufahren, und Sie legen wahrscheinlich die gesamte Domäne lahm. Erwägen Sie die Verwendung vondnsrpc_coerce_write, um zu testen, ob der DC tatsächlich eine Verbindung zu Ihrer Freigabe herstellen kann, bevor Sie versehentlich das Ziel zerstören. Menschen neigen dazu, wütend zu werden, wenn ihr DNS ausfällt.Darüber hinaus führt
dnsrpc_restart_serverzu zwei Minuten DNS-Ausfallzeit. Wenn Sie den BOF mehrmals aufrufen, wächst das Timeout jedes Mal, also verwenden Sie ihn sparsam.
Um die BOFs in einer Entwicklungsumgebung zu testen, können Sie ein Tool wie TrustedSec's COFFLoader verwenden, das unter Windows wie folgt kompiliert werden kann:
cl.exe /W4 /DCOFF_STANDALONE /DDEBUG beacon_compatibility.c COFFLoader.c /Fe:COFFLoader.exe /link advapi32.lib
Um dann einen BOF auszuführen (z. B. den BOF dnsrpc_info), generieren Sie die Argumente und übergeben Sie sie an den 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
Um die IDL-Definitionen neu zu kompilieren, können Sie den folgenden Befehl verwenden:
midl /W1 /char signed /env x64 /target NT100 /Oicf dnsrpc.idl
Während der Entwicklung führt das Flag _DEBUG dazu, dass ein wmain zur endgültigen Binärdatei hinzugefügt wird, und das Flag _VERBOSE wird verwendet, um zusätzliche Debug-Protokollierung einzuschließen. Weitere Informationen finden Sie in build.bat und Makefile.
Dieses Projekt ist unter der MIT-Lizenz lizenziert – siehe die Datei LICENSE für Details. Ich übernehme keine Verantwortung für Missbrauch oder Schäden, die durch die Verwendung dieses Tools verursacht werden. Verwenden Sie es nur in Umgebungen, in denen Sie ausdrücklich die Erlaubnis dazu haben.
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 ↩