
Injecter des assemblies .NET dans un processus existant
Cet outil est une alternative à l'exécution traditionnelle fork and run pour Cobalt Strike. Le chargeur peut être injecté dans n'importe quel processus, y compris le Beacon actuel. Les assemblys de longue durée continueront à s'exécuter et à renvoyer la sortie au Beacon, similaire au comportement de execute-assembly.
Il y a deux composants de inject-assembly :
Initialiseur BOF : Un petit programme responsable de l'injection du chargeur d'assembly dans un processus distant avec les arguments passés. Il utilise BeaconInjectProcess pour effectuer l'injection, ce qui signifie que ce comportement peut être personnalisé dans un profil Malleable C2 ou avec des BOF d'injection de processus (à partir de la version 4.5).
Chargeur d'assembly PIC : La majeure partie du projet. Le chargeur initialisera le runtime .NET, chargera l'assembly fourni, et exécutera l'assembly. Le chargeur créera un nouvel AppDomain dans le processus cible afin que l'assembly chargé puisse être totalement déchargé une fois l'exécution terminée.
La communication entre le processus distant et Beacon se fait via un tube nommé (named pipe). Le script Aggressor génère un nom de tube et le passe à l'initialiseur BOF.
Télécharger et charger le script Aggressor inject-assembly.cna dans Cobalt Strike. Vous pouvez ensuite exécuter des assemblys en utilisant la commande suivante :
inject-assembly pid assembly [args...]
Spécifiez 0 comme PID pour exécuter dans le processus Beacon actuel.
Il est recommandé d'utiliser un autre outil, comme FindObjects-BOF, pour localiser un processus qui charge déjà le runtime .NET, mais ce n'est pas une exigence pour le fonctionnement de inject-assembly.
jobkill.Ce projet n'aurait pas été possible sans les projets suivants :
D'autres fonctionnalités et inspirations ont été tirées des ressources suivantes :