
RedPeanut est un petit RAT développé en .Net Core 2 et son agent en .Net 3.5 / 4.0.
__________________________________________________________________________
ooooooo________________oo_ooooooo___________________________________oo____
oo____oo___ooooo___oooooo_oo____oo__ooooo___ooooo__oo_ooo__oo____o__oo____
oo____oo__oo____o_oo___oo_oo____oo_oo____o_oo___oo_ooo___o_oo____o_oooo___
ooooooo___ooooooo_oo___oo_oooooo___ooooooo_oo___oo_oo____o_oo____o__oo____
oo____oo__oo______oo___oo_oo_______oo______oo___oo_oo____o_ooo___o__oo__o_
oo_____oo__ooooo___oooooo_oo________ooooo___oooo_o_oo____o_oo_ooo____ooo__
__________________________________________________________________________
________________________________________________RedPeanut_v0.3.0___@b4rtik
__________________________________________________________________________
Actuellement en cours de test.
Problèmes connus des modules :
process -> spawnasagent
process -> spawnasshellcode
RedPeanut est un petit RAT développé en .Net Core 2 et son agent en .Net 3.5 / 4.0. L'exécution du code de RedPeanut est basée sur du shellcode généré avec DonutCS. C'est donc un hybride, bien que développé en .Net, il ne repose pas uniquement sur Assembly.Load. Cela augmente la surface de détection, mais nous permet de pratiquer et d'expérimenter diverses techniques d'évasion liées à l'environnement dotnet, à la gestion des processus et à l'injection. Ce comportement peut être modifié à l'exécution avec les commandes « managed » et « unmanaged ». Si vous êtes intéressé par un framework C2 .Net cohérent et pouvant être utilisé lors d'un engagement, je suggère Covenant.
RedPeanut est équipé avec :
L'agent RedPeanut peut être compilé en .Net 3.5 et 4.0 et dispose de capacités de pivot via NamedPipe. Lorsqu'il est exécuté en mode non managé, l'agent effectue ses propres tâches critiques dans un processus séparé pour éviter qu'une réponse AV, une détection ou une erreur lors de l'exécution ne vous fasse perdre la totalité de l'agent.
Le flux d'exécution est le suivant :
L'agent ne supporte actuellement que le canal https.
Le protocole de checkin de l'agent est très simple :
Alternativement, la fonctionnalité de canal couvert (covered channel) peut être activée (pour l'instant, c'est juste une preuve de concept). L'idée est d'imiter le trafic Web effectué par un utilisateur réel. Généralement, une page Web est composée de la page html et de tous les objets nécessaires à son affichage comme les css, images, etc. Lors de la demande d'une nouvelle tâche, la réponse du serveur ne sera pas directement la tâche chiffrée mais une page html à partir de laquelle extraire le lien vers l'image qui contiendra intégrée la tâche chiffrée. La requête http pour l'image contiendra l'en-tête Referer.
La distribution de contenu est organisée en 4 canaux :
RedPeanut permet de personnaliser l'empreinte réseau, côté serveur comme côté client. Les propriétés qui peuvent être configurées sont :
Domain Fronting
Pour activer le support du domain fronting, il est nécessaire de valoriser l'en-tête « Host » dans la section client, à la fois pour post et get (exemplifié dans le profil par défaut 2)
Le module PowerShellExecuter permet d'exécuter des commandes oneliner ou des fichiers dans un runspace avec un contournement AMSI (AMSI bypass), un contournement de journalisation (Logging bypass) et PowerView déjà chargé.
À partir de la version 0.3.0, RedPeanutAgent prend en charge la commande blockdlls. Avec cette option activée, les processus enfants créés pour effectuer des tâches en mode non managé sont créés avec l'attribut PROCESS_CREATION_MITIGATION_POLICY_BLOCK_NON_MICROSOFT_BINARIES_ALWAYS_ON. Cet attribut empêche le processus de charger des dll qui ne sont pas signées par Microsoft, ce qui pourrait protéger nos tâches des techniques de hooking AV et EDR.
RedPeanutAgent utilise le chargement dynamique de DLL pour éviter l'utilisation d'importations de DLL suspectes. Les crédits pour le chargement dynamique de DLL vont à @TheRealWover, @cobbr_io et @FuzzySec pour leur travail dans SharpSploit.
Certains fournisseurs d'AV et d'EDR utilisent une technique de hooking pour suivre les activités. Pour éviter d'utiliser des appels système hookés, RedPeanutAgent utilise des appels système directs, en injectant automatiquement le code nécessaire. Les crédits pour les appels système directs vont à @Cneelis
Pour exécuter RedPeanut, vous devez avoir dotnet installé. Pour installer dotnet sur Kali :
wget -qO- https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.asc.gpg
mv microsoft.asc.gpg /etc/apt/trusted.gpg.d/
wget -q https://packages.microsoft.com/config/debian/9/prod.list
mv prod.list /etc/apt/sources.list.d/microsoft-prod.list
chown root:root /etc/apt/trusted.gpg.d/microsoft.asc.gpg
chown root:root /etc/apt/sources.list.d/microsoft-prod.list
apt-get install apt-transport-https
apt-get update
apt-get install dotnet-sdk-2.1
git clone --recursive https://github.com/b4rtik/RedPeanut.git
Pour la fonctionnalité de canal couvert, il est nécessaire d'installer la bibliothèque libgdiplus, donc :
Pour les utilisateurs Linux :
apt-get install -y libgdiplus
Pour OSx
brew install mono-libgdiplus
Génération de la clé de signature d'assembly
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community>sn.exe -k 4096 key.snk
Puis copiez key.snk dans Workspace/KeyFile
root@kali:~# cd RedPanut
root@kali:~/RedPeanut# dotnet run
Using launch settings from /root/Projects/RedPeanut/Properties/launchSettings.json...
Enter password to encrypt serverkey:
__________________________________________________________________________
ooooooo________________oo_ooooooo___________________________________oo____
oo____oo___ooooo___oooooo_oo____oo__ooooo___ooooo__oo_ooo__oo____o__oo____
oo____oo__oo____o_oo___oo_oo____oo_oo____o_oo___oo_ooo___o_oo____o_oooo___
ooooooo___ooooooo_oo___oo_oooooo___ooooooo_oo___oo_oo____o_oo____o__oo____
oo____oo__oo______oo___oo_oo_______oo______oo___oo_oo____o_ooo___o__oo__o_
oo_____oo__ooooo___oooooo_oo________ooooo___oooo_o_oo____o_oo_ooo____ooo__
__________________________________________________________________________
________________________________________________RedPeanut_v0.3.0___@b4rtik
__________________________________________________________________________
[*] No profile available, creating new one...
[RP] >
DonutCS est un outil de génération de shellcode qui crée des charges utiles shellcode indépendantes de la position à partir d'assemblies .NET. Ce shellcode peut être utilisé pour injecter l'assembly dans des processus Windows arbitraires. Étant donné un assembly .NET, des paramètres et un point d'entrée (comme Program.Main), il produit un shellcode indépendant de la position qui le charge depuis la mémoire. L'assembly .NET peut être soit stagé depuis une URL, soit sans stage en étant intégré directement dans le shellcode.
La technique de persistance CLR a été présentée pour la première fois dans cet article par @Am0nsec. La technique consiste à réaliser le hooking du gestionnaire de domaine d'application (application domain manager). Comme décrit dans l'article, l'assembly pour effectuer le hooking est nécessaire et disponible dans le GAC. Un assembly destiné à être utilisé depuis le GAC doit être strong-named et donc signé avec une clé. Le module de persistance CLR nécessite une clé pour pouvoir signer les assemblies, qui peut être générée avec l'outil sn.exe comme suit :
**********************************************************************
** Visual Studio 2017 Developer Command Prompt v15.9.3
** Copyright (c) 2017 Microsoft Corporation
**********************************************************************
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community>sn.exe -k 4096 key.snk
Copiez le fichier key.snk dans le dossier Workspace/KeyFile. Ce fichier sera utilisé pour signer l'assembly pour la persistance.
Certains des outils bien connus présents dans RedPeanut, comme les outils GhostPack, sont enveloppés dans leur intégralité et exécutés côté client. Pour mettre à jour les outils, par exemple SeatBelt, sans mettre à jour l'intégralité du dépôt, il est nécessaire de : Cloner le dépôt Seatbelt, renommer la méthode « Main » en « Execute », insérer le modificateur public et recompiler en dll. La dll doit être compressée et encodée en Base64 en utilisant le script ps de RastaMouse Get-CompressedShellcode.ps1