
CobaltStrike BOF pour lancer des Beacons en utilisant le détournement de répertoire d'application DLL
DropSpawn est un BOF CobaltStrike utilisé pour lancer des Beacons supplémentaires via une méthode relativement méconnue de détournement de DLL. Fonctionne en x86-x86, x64-x64, et x86-x64/vice versa. À utiliser comme alternative à l'injection de processus.
Les exécutables Windows suivent l'ordre de recherche des DLL lorsqu'ils tentent de charger des DLL dont les chemins absolus n'ont pas été spécifiés :

Le détournement de DLL nécessite généralement que soit :
A. Un utilisateur dispose de droits d'écriture dans un dossier ayant une priorité d'ordre de recherche supérieure à celle où se trouve la véritable DLL
ou
B. Que la DLL en question n'existe nulle part sur le système, auquel cas elle peut être placée dans un dossier accessible en écriture par l'utilisateur dans la variable %PATH% de celui-ci (comme %USERPROFILE%\appdata\local\microsoft\windowsapps).
Ces exigences excluent le détournement de DLL pour les exécutables résidant dans C:\Windows\System32 car presque toutes les DLL que ces exécutables chargent résident également dans System32. Copier un exécutable de System32 vers un emplacement accessible en écriture par l'utilisateur et l'exécuter à partir de là est une option, mais ce n'est pas très sûr du point de vue OPSEC car les binaires de System32 exécutés depuis des emplacements alternatifs sont faciles à identifier.
DropSpawn permet le détournement de DLL à l'aide d'exécutables de System32 (et d'autres trouvés dans des dossiers supplémentaires non accessibles en écriture par l'utilisateur) en usurpant le « répertoire à partir duquel l'application est chargée » vers un répertoire arbitraire spécifié par l'utilisateur.
La version publique de DropSpawn diffère légèrement de la version non publique. La version non publique exploite un générateur de payload propriétaire, rendant l'expérience beaucoup plus fluide pour l'opérateur. La version publique a été légèrement modifiée pour tenir compte du fait que les utilisateurs disposeront de leurs propres méthodes pour générer des payloads compatibles avec le détournement de DLL. Un script Python3 ainsi que le code source d'une DLL de démonstration ont été inclus pour aider les utilisateurs à intégrer et à armer dropspawn.
Identifiez certains exécutables cibles qui tentent de charger des DLL sans spécifier leurs chemins absolus. Vous pouvez le faire en copiant l'exe dans un répertoire accessible en écriture par l'utilisateur et en l'exécutant tout en le surveillant avec Procmon. Dans cet exemple, nous utiliserons WerFault.exe qui réside normalement dans C:\Windows\System32\WerFault.exe

Dans l'exemple ci-dessus, cryptsp.dll, wer.dll, dbghelp.dll et bcrypt.dll sont tous des candidats viables car leurs chemins absolus n'ont pas été spécifiés dans WerFault ; par conséquent, WerFault tentera de les charger depuis son répertoire d'application en premier avant de recourir au reste de l'ordre de recherche des DLL. Notez que cela ne pose généralement pas de problème car le répertoire d'application de WerFault EST System32.
Téléchargez l'une des DLL détournables depuis le système cible.
Ceci est nécessaire afin que nous puissions extraire ses exports et les inclure dans notre DLL de payload. Il est important de récupérer la DLL détournable depuis la même machine sur laquelle vous souhaitez utiliser DropSpawn, car les DLL changent entre les versions de Windows. De plus, si vous exécutez un beacon x86 et souhaitez lancer un beacon x64 à l'aide de DropSpawn, assurez-vous de télécharger la version x64 de la véritable DLL en spécifiant 'C:\windows\sysnative...' au lieu de 'C:\windows\system32...'.
Exécutez generate_dll.py, en passant la DLL téléchargée et l'architecture de payload souhaitée. Generate_dll.py est une version modifiée de ce script. Il analysera la DLL fournie, créera un fichier .def contenant les exports de la DLL, et appellera MingW pour compiler notre DLL de payload de démonstration. Lorsque le processus lancé tente d'appeler une fonction réelle dans la DLL usurpée, notre DLL de payload transmettra l'appel à la véritable DLL située dans System32 afin que le processus hôte ne plante pas.

Appelez dropspawn en utilisant la DLL de payload générée.
dropspawn <payload DLL> <x86|x64> <programme à lancer> [dossier cible accessible en écriture] [parent]
payload DLL - le chemin complet vers la DLL de payload générée.
architecture - l'architecture du processus que vous souhaitez lancer
programme à lancer - le nom/chemin du processus que vous souhaitez lancer. Si ce processus réside dans System32 (ou syswow64), vous pouvez simplement spécifier le nom. Sinon, spécifiez le chemin complet. Vous pouvez également fournir des arguments de ligne de commande au processus. S'il y a des espaces dans le chemin/si vous utilisez des arguments, mettez le tout entre guillemets.
dossier cible accessible en écriture - Optionnel. Si laissé vide, dropspawn tentera d'utiliser le répertoire courant du Beacon. Utilisez des guillemets s'il y a des espaces dans le chemin.
parent - Optionnel. Le nom du processus à utiliser pour l'usurpation de PPID avec le processus nouvellement lancé. Si un processus est spécifié avec plusieurs instances en cours d'exécution à différents niveaux de privilèges (c'est-à-dire svchost.exe), dropspawn tentera d'en identifier une qui peut être utilisée pour l'usurpation de PPID.
Exemple : dropspawn /root/dbgcore.dll x64 "WerFault.exe -u -p 4352 -s 160" C:\users\user\appdata\local\temp explorer.exe
Cela déposera la DLL de payload 'dbgcore.dll' sur le disque à 'c:\users\user\appdata\local\temp\dbgcore.dll' et lancera un processus WerFault.exe x64 avec les arguments de ligne de commande '-u -p 4352 -s 160' et explorer.exe comme processus parent.

