Exécution de commande via PSexec

Le binaire original PSexec fait parti de la suite SysInternals écrite dans les années 90 par Mark Russinovich. Cet outil permettait à l'origine d'exécuter des commandes à distance sur des hôtes Windows.

Pour fonctionner certaines conditions doivent être respectées:

  • Le port SMB de la machine distante doit être ouvert et accessible
  • Le share $Admin doit être accessible en lecture et écriture
  • Il faut un compte local valide

Globalement il suffit de lire l'output du script psexec.py pour comprendre ce qu'il se passe:

Premièrement psexec va lister les share accessibles sur le DC. Cette étape nous pouvons la reproduire assez aisément avec le script python smbclient.py:

Ces répertoires sont mappés sur les répertoires locaux suivants:

Note: il est possible de lister les répertoires partagés via l'utilitaire compmgmt.msc ou directement en CLI via la commande:

net share

Donc PSexec va lister les shares accessibles en écriture puis y uploader un binaire:

Et effectivement on retrouve bien ce fichier dans le répertoire c:\\Windows:

Ce binaire contient en fait tout ce qui est nécessaire pour lancer un service local. Il ne reste plus qu'à activer ce service et pour cela on va se servir de RPC et du SVCManager:

Et encore une fois, si on liste les services actifs via la commande:

net start

On verra bien qu'il existe un service "wdSz" en cours d'exécution:

Une fois le service lancé, PSexec communiquera via un named pipe (une liaison en soit). Les commandes seront envoyés sur le share IPC$ qui seront pipés au service précédemment lancé et vis vers ça.

PSexec s'avère donc être un incroyable outil. Malheureusement pour nous il est beaucoup trop bruyant. En effet pour pourvoir utiliser PSexec il faut uploader un fichier, créer un service et le lancer ce qui créé énormément de logs sur le serveur à attaquer.


Revision #2
Created Thu, Nov 21, 2019 3:36 PM by Defte
Updated Fri, Nov 22, 2019 10:29 AM by Defte