
BOF Cobalt Strike pour l'exécution d'assembly .NET in-process avec contournement AMSI/ETW, AppDomain personnalisé, et redirection de sortie via pipe nommé/mailslot.
InlineExecute-Assembly est une preuve de concept de Beacon Object File (BOF) permettant aux professionnels de la sécurité d'effectuer une exécution d'assembly .NET en processus, en alternative au module traditionnel fork-and-run execute-assembly de Cobalt Strike. InlineExecute-Assembly exécute tout assembly dont le point d'entrée est Main(string[] args) ou Main(). Cela devrait vous permettre d'exécuter la plupart des outils publiés sans aucune modification préalable.
Le BOF détermine automatiquement quel Common Language Runtime (CLR) doit être chargé dans le processus pour votre assembly (v2.0.50727 ou v4.0.30319) avant l'exécution et, dans la plupart des cas, se termine proprement en cas de problème. Le BOF prend également en charge plusieurs indicateurs qui permettent à l'opérateur de dicter certains comportements avant l'exécution .NET, notamment : désactiver AMSI via du patching mémoire, désactiver et restaurer ETW via du patching mémoire, personnaliser le nom du domaine d'application CLR à créer, choisir de créer et diriger la sortie console de votre assembly vers un named pipe ou un mailslot, et permettre à l'opérateur de passer du point d'entrée par défaut Main(string[] args) à Main(). Plus de détails sur l'utilisation, les cas d'usage et les détections possibles se trouvent ci-dessous et sur https://securityintelligence.com/posts/net-execution-inlineexecute-assembly/.
Enfin, l'avantage d'exécuter nos assemblies .NET dans le même processus que notre beacon est d'éviter le comportement par défaut du module execute-assembly de Cobalt Strike, qui crée un nouveau processus pour charger/injecter le CLR/l'assembly .NET. Cependant, d'autres considérations OPSEC subsistent, par exemple : le processus dans lequel nous exécutons charge-t-il normalement le CLR ? L'assembly .NET que nous exécutons a-t-il des signatures connues ? Par conséquent, l'inconvénient est que si quelque chose est détecté et tué, par exemple par AMSI, votre beacon est également tué.
Cet outil n'existerait pas sans pouvoir s'appuyer sur des recherches, des outils et du code déjà publiés par des membres de la communauté de sécurité. Merci donc. Enfin, si vous pensez que quelqu'un a été oublié ci-dessous, n'hésitez pas à me le faire savoir et je veillerai à l'ajouter.
inlineExecute-Assembly --dotnetassembly /chemin/vers/assembly.exe pour une exécution basique (voir les cas d'usage ci-dessous pour des exemples d'indicateurs spécifiques)Exécutez la commande ci-dessous dans le répertoire src via l'invite de commande x64 Native Tools pour VS 2019
cl.exe /c inlineExecute-Assembly.c /GS- /FoinlineExecute-Assemblyx64.o
Exécutez la commande ci-dessous dans le répertoire src via l'invite de commande x86 Native Tools pour VS 2019
cl.exe /c inlineExecute-Assembly.c /GS- /FoinlineExecute-Assemblyx86.o
--dotnetassembly Chemin d'accès vers votre assembly **obligatoire**
--assemblyargs Arguments de l'assembly à passer
--appdomain Modifier le nom par défaut du AppDomain envoyé (la valeur par défaut est totesLegit et est définie via le script aggressor inclus) *Le domaine est toujours déchargé*
--amsi Tente de désactiver AMSI via du patching mémoire (si réussi, AMSI sera désactivé pour toute la durée de vie du processus)
--etw Tente de désactiver ETW via du patching mémoire (si réussi, ETW sera désactivé pour toute la durée de vie du processus sauf revert)
--revertetw Tente de désactiver ETW via du patching mémoire puis le repatch à l'état d'origine
--pipe Modifier le nom par défaut du named pipe (la valeur par défaut est totesLegit et est définie via le script aggressor inclus)
--mailslot Utilise les mailslots pour rediriger la sortie console. Modifie le nom par défaut du mailslot (si laissé vide, la valeur par défaut est totesLegit et est définie via le script aggressor inclus)
--main Change le point d'entrée vers Main() (la valeur par défaut est Main(string[] args))
Exécuter un assembly .NET
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe
Exécuter un assembly .NET avec des arguments
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe --assemblyargs AntiVirus AppLocker
Exécuter un assembly .NET avec des arguments et désactiver AMSI
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe --assemblyargs AntiVirus AppLocker --amsi
Exécuter un assembly .NET avec des arguments et désactiver ETW
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe --assemblyargs AntiVirus AppLocker --etw
Exécuter un assembly .NET avec des arguments et rediriger la sortie via des mailslots au lieu du named pipe par défaut
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe --mailslot
Exécuter un assembly .NET avec des arguments et changer le nom du named pipe par défaut défini dans le script aggressor
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe --pipe forRealLegit
Exécuter un assembly .NET et changer le nom du domaine d'application par défaut défini dans le script aggressor
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe --appdomain forRealLegit
Exécuter un assembly .NET avec le point d'entrée Main() au lieu du Main(string[] args) par défaut
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/simpleMain.exe --main
Faire le grand jeu
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe --assemblyargs AntiVirus AppLocker --amsi --etw --appdomain forRealLegit --mailslot forRealLegit
Environment.Exit, cela doit être supprimé car cela tuera le processus et le beacon.Quelques stratégies de détection et d'atténuation pourraient être utilisées :
PAGE_EXECUTE_READWRITE lors du patching mémoire AMSI et ETW. Cela a été fait intentionnellement et devrait être un signal d'alarme, car très peu de programmes ont des plages mémoire avec la protection PAGE_EXECUTE_READWRITE.totesLegit. Cela a été fait intentionnellement et des détections par signature pourraient être utilisées pour le signaler.totesLegit. Cela a été fait intentionnellement et des détections par signature pourraient être utilisées pour le signaler.totesLegit. Cela a été fait intentionnellement et des détections par signature pourraient être utilisées pour le signaler.