Как написать троян на Python

Как написать троян на Python

В этой статье я рас­ска­жу, как написать простой троян на Python с уда­лен­ным дос­тупом, а для боль­шей скрыт­ности мы встро­им его в игру. Даже если вы не зна­ете Python, то смо­жете луч­ше понять, как устро­ены такие вре­доно­сы, и поуп­ражнять­ся в прог­рамми­рова­нии.

Еще по теме: Как написать вирус на Python

Ко­неч­но, при­веден­ные в статье скрип­ты совсем не годят­ся для исполь­зования в боевых усло­виях: обфуска­ции в них нет, прин­ципы работы прос­ты как пал­ка, а вре­донос­ные фун­кции отсутс­тву­ют вовсе. Тем не менее при желании их воз­можно исполь­зовать для нес­ложных пакос­тей или приколов.

Как написать троян на Python

Итак, что есть тро­ян? Вирус — это прог­рамма, глав­ная задача которой — самоко­пиро­вание. Червь активно рас­простра­няет­ся по сети (типич­ный при­мер — «Петя» и WannaCry), а тро­ян — скры­тая вре­донос­ная прог­рамма, которая мас­киру­ется под «хороший» софт и шпионить за пользователем. Подробнее о троянах в статье «Что такое RAT».

Ло­гика подоб­ного зараже­ния в том, что поль­зователь сам ска­чает себе вре­донос на компь­ютер (нап­ример, под видом кряк­нутой прог­раммы), сам отклю­чит защит­ные механиз­мы (ведь прог­рамма выг­лядит хорошей) и захочет оста­вить надол­го.

Хакеры и тут не дрем­лют, так что в новос­тях то и дело мель­кают сооб­щения о новых жер­твах пират­ско­го ПО и о шиф­роваль­щиках, поража­ющих любите­лей халявы. Но мы‑то зна­ем, что бес­плат­ный сыр быва­ет толь­ко в мусор­ке, и сегод­ня научим­ся очень прос­то начинять тот самый сыр чем‑то не впол­не ожи­даемым.

Вся информа­ция пре­дос­тавле­на исклю­читель­но в озна­коми­тель­ных целях. Ни автор статьи, ни редак­ция сайта spy-soft.net не несут ответс­твен­ности за любой воз­можный вред, при­чинен­ный данным матери­ало­м. Несан­кци­они­рован­ный дос­туп к информа­ции и наруше­ние работы сис­тем могут прес­ледовать­ся по закону. Не забывайте об этом!

Определение IP-адреса

Для начала нам (то есть нашему тро­яну) нуж­но понять, где он ока­зал­ся. Важ­ная часть вашей информа­ции — IP-адрес, по которо­му с заражен­ной машиной мож­но будет соеди­нить­ся в даль­нейшем.

Нач­нем писать код. Сра­зу импорти­руем биб­лиоте­ки:

Обе биб­лиоте­ки не пос­тавля­ются с Python, поэто­му, если они у вас отсутс­тву­ют, их нуж­но уста­новить коман­дой pip.

Ес­ли вы видите ошиб­ку, что у вас отсутс­тву­ет pip, сна­чала нуж­но уста­новить его с сай­та pypi.org. Любопыт­но, что рекомен­дуемый спо­соб уста­нов­ки pip — через pip, что, конеч­но, очень полез­но, ког­да его нет.

Код получе­ния внеш­него и внут­ренне­го адре­сов будет таким. Обра­тите вни­мание, что, если у жер­твы нес­коль­ко сетевых интерфей­сов (нап­ример, WiFi и Ethernet одновре­мен­но), этот код может вес­ти себя неп­равиль­но.

Ес­ли с локаль­ным адре­сом все более‑менее прос­то — находим имя устрой­ства в сети и смот­рим IP по име­ни устрой­ства, — то вот с пуб­личным IP все несколько слож­нее.

Я выб­рал сайт api.<wbr />ipify.<wbr />org, так как на выходе нам выда­ется толь­ко одна стро­ка — наш внеш­ний IP. Из связ­ки пуб­личный + локаль­ный IP мы получим поч­ти точ­ный адрес устрой­ства.

Вы­вес­ти информа­цию еще про­ще:

Ни­ког­да не встре­чал конс­трук­ции типа print(<wbr />f'{}<wbr />')? Бук­ва f озна­чает фор­матиро­ван­ные стро­ковые литера­лы. А по простому — прог­рам­мные встав­ки пря­мо в стро­ку.

Стро­ковые литера­лы не толь­ко хорошо смот­рятся в коде, но и помога­ют избе­гать оши­бок типа сло­жения строк и чисел (Python — это вам на JavaScript!).

Фи­наль­ный код:

За­пус­тив этот скрипт, мы смо­жем опре­делить IP-адрес нашего (или чужого) компь­юте­ра.

Бэкконнект по почте

Те­перь напишем скрипт, который будет при­сылать нам пись­мо.

Им­порт новых биб­лиотек (обе нуж­но пред­варитель­но пос­тавить через pip <wbr />install):

Пи­шем базовую информа­цию о себе:

Даль­ше сфор­миру­ем пись­мо:

Пос­ледний штрих — нас­тро­ить под­клю­чение к поч­товому сер­вису. Я поль­зуюсь Яндекс.Поч­той, поэто­му нас­трой­ки выс­тавлял для нее.

В стро­ке server.<wbr />ehlo(<wbr />email) мы исполь­зуем коман­ду EHLO. Боль­шинс­тво сер­веров SMTP под­держи­вают ESMTP и  EHLO. Если сер­вер, к которо­му вы пыта­етесь под­клю­чить­ся, не под­держи­вает EHLO, мож­но исполь­зовать HELO.

Пол­ный код этой час­ти тро­яна:

После запуска скрипта, получа­ем пись­мо.

Пись­мо с IP жертвы
Пись­мо с IP

Этот скрипт я про­верил на VirusTotal. Резуль­тат на скри­не.

Написание трояна на Python

Создание трояна на Python

По задум­ке, тро­ян пред­став­ляет собой кли­ент‑сер­верное при­ложе­ние с кли­ентом на машине ата­куемо­го и сер­вером на запус­кающей машине. Дол­жен быть реали­зован мак­сималь­ный уда­лен­ный дос­туп к сис­теме.

Как обыч­но, нач­нем с биб­лиотек:

Для начала напишем игру «Уга­дай чис­ло». Тут все край­не прос­то, поэто­му задер­живать­ся дол­го не буду.

За­чем столь­ко слож­ностей с про­вер­кой на чис­ло? Мож­но было прос­то написать:

Если бы мы написа­ли так, то при вво­де чего угод­но, кро­ме чис­ла, выпада­ла бы ошиб­ка, а это­го допус­тить нель­зя, так как ошиб­ка зас­тавит прог­рамму оста­новить­ся и обру­бит соеди­нение.

Вот код нашего тро­яна. Ниже мы будем раз­бирать­ся, как он работа­ет, что­бы не про­гова­ривать заново базовые вещи.

Сна­чала нуж­но разоб­рать­ся, что такое сокет и с чем его едят. Сокет прос­тым язы­ком — это условная вил­ка или розет­ка для прог­рамм. Сущес­тву­ют кли­ент­ские и сер­верные сокеты: сер­верный прос­лушива­ет опре­делен­ный порт (розет­ка), а кли­ент­ский под­клю­чает­ся к сер­веру (вил­ка). Пос­ле того как уста­нов­лено соеди­нение, начина­ется обмен дан­ными.

Следующая стро­ка:

соз­дает эхо‑сер­вер (отпра­вили зап­рос — получи­ли ответ). AF_INET озна­чает работу с IPv4-адре­саци­ей, а  SOCK_STREAM ука­зыва­ет на то, что мы исполь­зуем TCP-под­клю­чение вмес­то UDP, где пакет посыла­ется в сеть и далее не отсле­жива­ется.

Стро­ка:

ука­зыва­ет IP-адрес хос­та и порт, по которым будет про­изво­дить­ся под­клю­чение, и сра­зу под­клю­чает­ся.

Фун­кция client.<wbr />recv(<wbr />1024) при­нима­ет дан­ные из сокета и явля­ется так называ­емым «бло­киру­ющим вызовом». Смысл такого вызова в том, что, пока коман­да не передас­тся или не будет отвер­гну­та дру­гой сто­роной, вызов будет про­дол­жать выпол­нять­ся. 1024 — это количес­тво задей­ство­ван­ных бай­тов под буфер при­ема.

Нель­зя будет при­нять боль­ше 1024 байт (1 Кбайт) за один раз, но нам это и не нуж­но: час­то вы руками вво­дите в кон­соль боль­ше 1000 сим­волов? Пытать­ся мно­гок­ратно уве­личить раз­мер буфера не нуж­но — это зат­ратно и бес­полез­но, так как нужен боль­шой буфер при­мер­но раз в никог­да.

Ко­ман­да decode(<wbr />'cp866') декоди­рует получен­ный бай­товый буфер в тек­сто­вую стро­ку сог­ласно задан­ной кодиров­ке (у нас 866). Но почему имен­но cp866? Зай­дем в коман­дную стро­ку и вве­дем коман­ду chcp.

Те­кущая кодовая стра­ница
Те­кущая кодовая стра­ница

Ко­диров­ка по умол­чанию для рус­ско­гово­рящих устрой­ств — 866, где кирил­лица добав­лена в латини­цу. В англо­языч­ных вер­сиях сис­темы исполь­зует­ся обыч­ный Unicode, то есть utf-8 в Python. Мы же говорим на рус­ском язы­ке, так что под­держи­вать его нам прос­то необ­ходимо.

При желании кодиров­ку мож­но поменять в коман­дной стро­ке, наб­рав пос­ле chcp ее номер. Юни­код име­ет номер 65001.

При при­еме коман­ды нуж­но опре­делить, не слу­жеб­ная ли она. Если так, выпол­няем опре­делен­ные дей­ствия, ина­че, если вклю­чен тер­минал, перенап­равля­ем коман­ду туда. Недос­таток — резуль­тат выпол­нения так и оста­ется необ­работан­ным, а его хорошо бы отправ­лять нам. Это будет вам домаш­ним задани­ем: реали­зовать эту фун­кцию мож­но от силы минут за пят­надцать, даже если гуг­лить каж­дый шаг.

Ре­зуль­тат про­вер­ки кли­ента на VirusTotal порадо­вал.

Создание трояна на Питон

Ба­зовый тро­ян написан, и сей­час мож­но сде­лать очень мно­гое на машине ата­куемо­го, ведь у нас дос­туп к коман­дной стро­ке. Но почему бы нам не рас­ширить набор фун­кций? Давайте еще пароли от WiFi!

Создание WiFi-стилера на Python

За­дача — соз­дать скрипт, который из коман­дной стро­ки узна­ет все пароли от дос­тупных сетей Wi-Fi.

Прис­тупа­ем. Импорт биб­лиотек:

Мо­дуль subprocess нужен для соз­дания новых про­цес­сов и соеди­нения с потока­ми стан­дар­тно­го вво­да‑вывода, а еще для получе­ния кодов воз­вра­та от этих про­цес­сов.

Итак, скрипт для извле­чения паролей WiFi:

Вве­дя коман­ду в коман­дной стро­ке:

Mы получим сле­дующее.

netsh wlan show profiles
netsh wlan show profiles

Ес­ли рас­парсить вывод выше и под­ста­вить имя сети в коман­ду:

Резуль­тат будет как на кар­тинке. Его мож­но разоб­рать и вытащить пароль от сети.

netsh wlan show profile ASUS key=clear
netsh wlan show profile ASUS key=clear
RAT Python. Результат VirusTotal
Результат VirusTotal

Ос­талась одна проб­лема: наша изна­чаль­ная задум­ка была заб­рать пароли себе, а не показы­вать их поль­зовате­лю. Испра­вим же это.

До­пишем еще один вари­ант коман­ды в скрипт, где обра­баты­ваем наши коман­ды из сети.

Этот скрипт прост как два руб­ля и ожи­дает уви­деть рус­ско­языч­ную сис­тему. На дру­гих язы­ках это не сра­бота­ет, но испра­вить поведе­ние скрип­та мож­но прос­тым выбором раз­делите­ля из сло­варя, где ключ — обна­ружен­ный на компь­юте­ре язык, а зна­чение — тре­буемая фра­за на нуж­ном язы­ке.

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

Троян на Python отработал
Троян на Python отработал

Доработки

Ко­неч­но, тут мож­но дорабо­тать при­мер­но все — от защиты канала переда­чи до защиты самого кода нашего вре­доно­са. Методы свя­зи с управля­ющи­ми сер­верами зло­умыш­ленни­ка тоже обыч­но исполь­зуют­ся дру­гие, а работа вре­доно­са не зависит от язы­ка опе­раци­онной сис­темы.

И конеч­но, сам троян очень желатель­но упа­ковать с помощью PyInstaller, что­бы не тянуть с собой на машину жер­твы питон и все зависи­мос­ти. Игра, которая тре­бует для работы уста­новить модуль для работы с поч­той, — что может боль­ше вну­шать доверие?

Заключение

Се­год­няшний тро­ян нас­толь­ко прост, что его никак нель­зя наз­вать боевым. Тем не менее он полезен для изу­чения основ язы­ка Python и понима­ния алго­рит­мов работы более слож­ных вре­донос­ных прог­рамм. Мы наде­емся, что вы ува­жаете закон, а получен­ные зна­ния о тро­янах вам никог­да не понадо­бят­ся.

В качес­тве домаш­него задания рекомен­дую поп­робовать реали­зовать двус­торон­ний тер­минал и шиф­рование дан­ных хотя бы с помощью XOR. Такой тро­ян уже будет куда инте­рес­нее, но, безус­ловно, исполь­зовать его in the wild мы не при­зыва­ем. Будьте акку­ратны и не делайте глупостей!

Еще по теме: Как создать троян для Android

ВКонтакте
OK
Telegram
WhatsApp
Viber

10 комментариев

  1. карим

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

  2. SUBY

    Оно отправилось тому кому ты написал (там написано эмейл в коде и если ты код не изменял то отправилось туда).
    Если всё так то поздравляю ты всрал акаунты

  3. фвфв

    Мне)))

  4. Али

    у меня выходят ошибка server_command is not defined помогите пожалуйста !!!!

  5. Дудя

    Хотелось бы поговорить с автором. Получится такому

  6. Лайлек

    Уважаемые люди если вы: не разбирайтесь в программирование не знаете базовые знание о информационных безопасности и не знаете как работает сеть и интернет пожалуйста не тестируйте эти вещи на чужих компах и своих основных ОС.

  7. какой-то левый чел

    можно на виртуальной машине сделать ничего не будет вашей ОС, я так проверил работает

  8. Алексей

    Сырое объяснение. Автор сделал, но до конца не довел как сделать, чтобы это заработало. В итоге бесполезная статья.

  9. РОБАСОВ

    Успокойтесь. Если код взят из туториала и не изменен, то дание никуда не пойдут

  10. durango

    а вот хотел спросить на какой платформе это пишется, мол в kali linux, pycharm или где то еще? просто не могу найти название самих библиотек для скачивания, потому что с похожим названием много а здесь написано сразу import и только определенную часть a не install с названием самой библиотеки. помогите пожалуйста

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *