Exécution de commande via WMI

WMI (pour Windows Management Instrumentation) est une interface standardisée permettant aux processus et autres scripts d'administration Windows d'accéder aux informations liées à l'état du système d'exploitation Windows. WMI n'est en fait rien d'autres qu'une énorme base de données contenant des informations relatives à votre système d'exploitation.

Comme toute base de données, il est possible d'accéder aux data via des requêtes. Pour WMI on dispose du langage WQL très semblable au langage SQL. Pour intéroger la base en mode WQL on pourra utiliser l'outil wbemtest:

Il suffira de se connecter au service winmgmt local qui tourne sur le port 135 puis de cliquer sur requête pour écrire et envoyer notre requête WQL:

Le souci c'est que c'est pas très pratique à utiliser. En effet il faut connaître l'ensemble des classes et leurs attributs afin de les requêter. Heureusement pour nous il existe le binaire wmic qui va grandement nous faciliter la vie.

Pour accéder à l'interface WMIC il suffit de taper la commande:

On pourra ainsi accéder aux noms des utilisateurs locaux de la machine:

useraccount name,sid

Lister les processus actifs:

process get description,processid,parentprocessid,commandline /format:csv

Mais surtout nous allons pouvoir créer des processus:

process call create notepad

Étant donné que l'on peut exécuter des commandes à distance nous allons pouvoir uploader un fichier encodé en base64 puis le décoder via un script VBS via la méthode du:

echo "payload encodé en base64" >> file

Le déchiffrer puis l'exécuter sur le serveur. Cette exploitation a été présenté par Andrei Dumitrescu en 2014. Un POC a d'ailleurs été publié sur le Github d'Orange Cyberdefense.

Aujourd'hui il existe des attaques un peu plus sophistiquée dont celle utilisée par le script wmiexec.py de la suite impacket. Globalement cette dernière fonctionne plus ou moins de la même manière que l'attaque via smbexec.

Tout d'abord le tool va établir une connexion via le port 135 en direction de l'interface WMI. Ensuite une commande sera exécutée via le payload suivant:

wmic process call create "cmd /c 'commande à exécuter'"

Le résultat sera ensuite stocké dans un fichier sur le share ADMIN$:

Enfin, le contenu de ce fichier sera récupéré via SMB puis supprimer du serveur.

Cette fois-ci aucun service n'est créé mais il y a toujours le problème de l'écriture d'un fichier sur le disque qui pourrait être flaggé par un anti virus. Pour répondre à cette problématique le chercheur Andrei Dumitrescu a développé un nouveau vecteur d'attaque qu'il a présenté lors du STICC 2019.

Sa présentation est disponible ici.


Revision #1
Created Fri, Nov 22, 2019 11:00 AM by Defte
Updated Sun, Nov 24, 2019 9:19 AM by Defte