Show HN: Zxc - 基于 Rust 的 TLS 代理,使用 tmux 和 Vim 作为 UI,BurpSuite 的替代方案
Terminal based intercepting proxy written in rust with tmux
and vim
as user interface.
License
hail-hydrant/zxc
Terminal based intercepting proxy written in rust with tmux
and vim
as user interface.
Table of Contents
- About The Project
- Features
- Prerequisites
- Installation
- Usage
- Windows
- Filetypes
- Search
- Encoding and Decoding
- Configuration * Tmux Config * Zxc Config
- Highlight Groups
- Logging
- Debugging
- Roadmap
- Contributing
- Social
Screenshots
Interceptor
Interceptor Showq
History with 100k+ entries
History edit host scope
History edit status code scope
History edit uri scope
History show host scope
History show status code scope
History show uri scope
History show filters
History apply filters
Repeater
Repeater websocket
Addons - ffuf
Addons - sqlmap
Edit buffer variables
Edit Local Config in popup
Log
About The Project
该工具需要
vim
插件,它使 vim
能够作为用户界面。每个窗口和文件类型都有自己的一组键盘绑定和命令。
以下窗口存在于 zxc
中:
当 zxc 被调用时,bash 列表用于生成具有特定窗口名称的
vim
,该窗口名称加载相应的 vim
配置。所有窗口都是 vim
实例,它们通过 unixsocket
通道与 zxc 二进制文件通信。
Alias | Window ---|--- interceptor | Interceptor vhistory | History repeater | Repeater addons | Addons
这些窗口(除了暂停记录的历史记录)可以使用它们各自的别名关闭和重新打开。
┌─────────────┐
┌───────────────►│ zxc binary │◄────┬───────────────┐
│ └┬────────────┘ │ │
│ │ │ │
│ │ unix socket │ │
│ │ │ │
┌──────▼──────┐ ┌──────▼──────┐ ┌───────▼─────┐ ┌─────▼──────┐
│ Interceptor │ │ History │ │ Repeater │ │ Addons │
└─────────────┘ └─────────────┘ └─────────────┘ └────────────┘
Features
- 使用
tmux
和vim
作为用户界面。 - 基于磁盘的存储。
- 自定义
http/1.1
解析器以发送格式错误的请求。 http/1.1
和websocket
支持。
Prerequisites
- getfattr
- tmux
- vim (> 8.2.4684) with the following features
- channel
- terminal
- timers
- ffuf
- sqlmap
- column (optional for indenting history files)
Packages
attr tmux vim ffuf sqlmap bsdmainutils
Installation
Requirements
- cargo msrv 1.86.0
- make
- openssl
Packages
make openssl
Make
make
将 ./target/release
中的 zxc
二进制文件复制到 $PATH
。安装 vim plugin。
Manual Installation
- 复制配置文件
mkdir $HOME/.config/zxc
cp ./config/{alias,config.toml,tmux.conf} $HOME/.config/zxc
- 生成私钥
openssl genrsa -out $HOME/.config/zxc/private.key 2048
- 使用
./mkscripts/CA.cnf
作为 CA 配置生成 CA 证书。
openssl req -x509 -new -nodes -key $HOME/.config/zxc/private.key -sha256 -days 1024 -out $HOME/.config/zxc/zxca.crt -extensions v3_req -config ./mkscripts/CA.cnf
- 复制
vim
配置
mkdir -p $HOME/.vim/plugin
cp ./config/example/zxc.vim $HOME/.vim/plugin
- 复制文件类型插件(可选)
cp -r ./config/example/ftplugin $HOME/.vim
- 构建 zxc 或从发布版本下载。
cargo b --release
vim plugin
安装 zxc.vim 插件。
mkdir -p $HOME/.vim/pack/git-plugins/start/
git clone --depth 1 https://github.com/hail-hydrant/zxc.vim $HOME/.vim/pack/git-plugins/start/zxc.vim
Add CA
将 CA 证书从 $HOME/.config/zxc/zxca.crt
添加到您信任的 CA 或浏览器。
Usage
zxc
Options
-n, --new-name <NEW_NAME> Session name to create
-a, --attach <ATTACH_NAME> Attach to existing session
-p, --port <PORT> Proxy port to use [default: 8080]
-i, --include <INCLUDED_DOMAINS> List of domains to proxy
-e, --exclude <EXCLUDED_DOMAINS> List of domains to relay
--no-ws Relay ws connections
-d, --debug Debug mode
-h, --help Print help
-i
和 -e
是互斥的。 这些值应该采用 domain:port
格式。
例如,要拦截除 https://example.com 之外的所有域,
zxc -e example.com:443
这些标志还支持通配符。 例如,要拦截 http://*.example.com 的所有子域
zxc -i *.example.com:80
这些域可以是逗号分隔的值列表。
zxc -i example.com:80,example.com:443
Windows
Interceptor
显示拦截的请求和响应。 每个请求或响应都作为缓冲区添加。
Command | Description ---|--- InterToggle | 切换拦截 InterForward | 转发当前请求/响应 InterForwardAll | 转发队列中的所有请求和响应 InterForwardWithRes | 转发请求 + 拦截响应 Showq | 显示具有各自方案和主机的拦截队列 DropMsg | 删除当前请求/响应
History
显示以下历史记录文件:
执行历史记录。 关闭它会停止录制。 如果意外关闭窗口,请调用 vhistory
重新打开它以恢复录制。 如果存在没有历史记录窗口的 zxc,则会创建一个状态文件 .history.state
,以便下次 zxc 附加到此会话时恢复日志记录。
Note
窗口不可修改且只读。
Repeater
Repeater 窗口用于重复请求。 原始请求被复制到特定历史记录文件夹中名为 r-$id
(用于 http) 和 r-ws-$id
(用于 websocket) 的文件夹。
Command | Description | Availability
---|---|---
RepeaterSend | 发送请求 | .req
and scratch.wreq
WsEstablish | 建立 Websocket 连接 | ws
中 req
repeater
要重复一个 websocket 请求,
- 在一个 websocket 请求 (
wreq
) 文件中,调用WsSendToRepeater
。 - 在 repeater 窗口中,对应于 websocket 握手的 http 请求显示在左上方。
- 在 request(
req
) 窗口中调用WsEstablish
以建立 websocket 连接。 - 将数据写入左下角的
scratch.wreq
并调用RepeaterSend
以发送。
Addons
Addons 窗口用于运行其他工具。 原始请求被复制到特定历史记录文件夹中名为 addons/$addon_prefix-$id.req
的文件夹,前缀特定于被调用的插件。 该请求显示在顶层窗口中,而包含插件命令和参数的终端显示在底部拆分窗口中。 当前,ffuf
和 sqlmap
可用。
Add New Addons
1. 定义 addon
在 $HOME/.config/zxc/config.toml
文件中定义一个新表。 以下值(字符串)是必需的:
Key | Description
---|---
name | 要调用的二进制文件的名称
prefix | 插件使用的结果文件的前缀
request_flag | 插件用于标识请求文件的标志例如,sqlmap 的 -r
和 ffuf 的 -request
http_flag | 插件用于标识 http 方案的标志例如,ffuf 的 -request-proto http
https_flag | 插件用于标识 https 方案的标志例如,sqlmap 的 --force-tls
add_flag | 将添加到命令末尾的其他标志
2. 调用 Addon
可以通过调用 RequestToAddon
函数从请求 .req
文件中调用该插件
call RequestToAddon("addon_name")
通过调用 HistoryToAddon
函数从历史 .his
文件中调用
call HistoryToAddon("addon_name")
3. 定义 Addon Command
通过 ftplugin 为 req
和 his
添加命令或键映射。
.req
的示例命令
command RequestToAddon_Name :call RequestToAddon("addon_name")
对于 .his
command HistoryToAddon_Name :call HistoryToAddon("addon_name")
.req
的示例 Keymap
nnoremap <silent> <Leader>q :call RequestToAddon("addon_name")
对于 .his
nnoremap <silent> <Leader>q :call HistoryToAddon("addon_name")
File Types
以下文件类型在 zxc 中可用。
his [http history]
Command | Description
---|---
HistoryView | 查看突出显示的历史记录默认键绑定是 <CR>
HistoryIndent | 缩进历史记录
HistoryToRepeater | 发送到 Repeater
HistoryToFuzz | 发送到 Ffuf 插件
HistoryToSql | 发送到 Sqlmap 插件
ApplyFilters | 应用过滤器
ShowFilters | 在弹出窗口中显示过滤器使用 q
关闭弹出窗口
ClearFilters | 清除所有过滤器
AddToHostScope | 将当前行中的主机添加到视图范围
ClearHostScope | 清除主机视图范围列表
EditHostScope | 在弹出窗口中编辑主机范围支持 Vim Regex要将匹配添加为正则表达式,添加前缀 /r
ShowHostScope | 在弹出窗口中显示主机范围使用 q
关闭弹出窗口
AddScode | 将命令参数添加到状态代码范围使用 'x' 代替通配符例如,1xx:显示范围 100 - 199 中的状态代码 21x:显示范围 210 - 219 中的状态代码
ClearScode | 清除状态代码范围
EditScode | 在弹出窗口中编辑状态代码范围
ShowScode | 在弹出窗口中显示状态代码范围使用 q
关闭弹出窗口
AddToUriScope | 将当前行中的 uri 添加到视图范围
ClearUriScope | 清除 uri 视图范围列表
EditUriScope | 在弹出窗口中编辑 uri 范围支持 Vim Regex要将匹配添加为正则表达式,添加前缀 /r
ShowUriScope | 在弹出窗口中显示 uri 范围列表
EditConfig | 在弹出窗口中编辑本地配置 如果修改了配置,则会自动重新加载
ReloadConfig | 手动重新加载配置
ConcealUri | 隐藏 URI 列
- Vim fold 用于应用过滤器。 使用
zR
打开所有折叠。 HistoryIndent
命令使用column
shell 命令,并且可能在大型文件上占用大量资源。 请谨慎使用。- HostScope 和 UriScope 支持 vim 正则表达式。 在条目前面添加
/r
以作为正则表达式匹配。 例如,要匹配 google.com 的所有子域,/r .*.google.com
Conceal
对于 his
文件类型,可以隐藏 URI。 在 .his
ftplugin 中将 g:conceal
变量设置为要隐藏的字符数。 在您的 vimrc 中设置 conceallevel
以启用此功能。
req [http request]
Command | Description
---|---
EditBufVar | 在弹出窗口中编辑缓冲区变量仅在 interceptor
和 repeater
窗口中可用
RequestToFuzz | 发送到 Ffuf 插件
RequestToRepeater | 发送到 Repeater
RequestToSql | 发送到 Sqlmap 插件
Variables
req
文件类型具有特定的变量集,可以修改这些变量以自定义请求处理。 EditBufVar
命令可用于在弹出窗口中编辑缓冲区变量。 保存并退出弹出窗口以反映更改。 以下变量在 interceptor
和 repeater
窗口中可用。
Variable | Type | Description ---|---|--- b:host | string | 要向其发送请求的主机(忽略方案特定默认值的端口) b:scheme | string | http/https b:sni | string | TLS 握手中使用的 SNI(仅当 b:scheme 为 https 时) b:update | bool | 是否应根据 RFC 更新请求。
Extended Attributes
以下扩展属性设置为 .req
文件类型,供用户在 zxc 之外识别请求的目标。
Value | Description ---|--- user.host | 请求发送到的主机(忽略方案特定默认值的端口) user.http | 当方案为 http 时设置为 "1"。对于 https,忽略。 user.sni | 当方案为 https 且 host != sni 时设置
res [http response]
仅变量 b:update
可用。
whis [All websocket history]
Command | Description
---|---
ViewWsHistory | 查看突出显示的 ws 流。默认绑定是 <CR>
。
wsess [Single websocket session history]
Command | Description
---|---
ViewWsSessionHistory | 在拆分中查看突出显示的 ws req/res。默认绑定是 <CR>
。
wreq [websocket request]
二进制帧由状态行右角的“b”指示。
Command | Description ---|--- WsSendToRepeater | 将 ws 请求发送到 Repeater
popup [popup window]
可以通过使用 vim 的 popup_create-arguments
选项在用户的 zxc.vim
文件中设置 g:popup_options
来自定义弹出窗口。
Additional Filetypes
FileType | Description ---|--- wres | websocket response popup | popup window
Search
以下命令搜索并填充它们各自的列表。
Quickfix-list | Location-list | Filetypes searched
---|---|---
Greq | LGreq | .req
Gres | LGres | .res
Greb | LGreb | both .req
and .res
Encoding and Decoding
以下命令在 VISUAL
模式下可用于在 interceptor
和 repeater
窗口中进行编码和解码。
Command | Description ---|--- EBase64 | Base64 编码 DBase64 | Base64 解码 EUrl | URL 编码 DUrl | URL 解码 EUrlAll | URL 编码所有字符 DUrlAll | URL 解码所有字符
register x 用于存储所选文本。
Configuration
tmux config
用于设置会话别名。 此外,它还从以下位置获取用户的 tmux.conf 文件:
- $HOME/.tmux.conf
- $HOME/.config/tmux/tmux.conf
- $XDG_CONFIG_HOME/tmux/tmux.conf
如果 tmux.conf 位于自定义位置,请将该位置添加到 $HOME/.config/zxc/tmux.conf
中的 zxc 的 tmux.conf 文件中
source-file /path/to/tmux.conf
zxc config
有两种类型的配置文件:全局配置文件和每个会话的本地配置文件。 本地配置优先于全局配置。
Global
全局配置文件位于 $HOME/.config/zxc/config.toml
中。 默认
Keys | Description | Possible Values ---|---|--- excluded_domains | 要中继的域列表 | 字符串列表 excluded_content_types | 要中继的内容类型列表 | app、audio、font、img、msg、model、multipart、txt、video 列表 excluded_extensions | 要中继的扩展名列表 | 字符串列表 with_ws | 是否代理 websocket 请求 | bool(默认为 true)
Local
每个会话配置都是根据用户标志在 $session/config.toml
中创建的。 仅当使用任何标志时,才会创建本地配置。 示例 。
Keys | Description | Possible Values ---|---|--- included_domains | 要代理的域列表 | 字符串列表 excluded_domains | 要中继的域列表 | 字符串列表 no_ws | 是否中继 websocket 请求 | bool(默认为 false)
Include 和 exclude 列表是互斥的。 如果同时存在这两个列表,则优先使用 Include 列表。 支持通配符。
Edit Local Config
历史记录窗口中的 EditConfig
命令将在弹出窗口中打开本地配置文件。 退出窗口时,如果修改了文件,则会自动重新加载配置。 如果在历史记录窗口外部编辑了文件,请在历史记录窗口中调用 ReloadConfig
。
Vim Config
每个窗口和文件类型都有自己的一组命令。 可以在它们各自的 ftplugin 中配置文件类型。 这些命令在 :h zxc.txt
中有进一步的说明。
以下全局变量可用
Variables | Description
---|---
g:popup_options | 传递给 vim 的 popup_create-arguments
的选项。
g:timeout | 等待 zxc 在阻塞时响应的时间。默认 5000 毫秒
示例 ftplugin 链接
Link | For
---|---
zxc | interceptor, repeater, Addons, Encoding, Decoding
his | his
文件类型。
req | req
文件类型。
Highlight Groups
每个文件类型都有自己的一组突出显示组。 使用 :h zxc-highlight-groups
列出可用的突出显示组。 可用突出显示组的要点可以在 here 中找到。
FileType | Highlight Group Help ---|--- history | zxc-hl-his req | zxc-hl-req res | zxc-hl-res
Logging
日志被写入 $session/log.txt
。 可以使用 tmux 命令 zxcl
或 bind-key e
快捷方式在 tmux 弹出窗口中查看日志。
默认情况下,索引 1000 的 tmux 命令别名用于存储该命令。 如果发生冲突,请将 $HOME/.config/zxc/tmux.conf
中的索引更改为某个未分配的值。
Debugging
使用 -d
标志运行 zxc 以启用调试。 来自二进制文件的代理调试信息被写入 $session/log/proxy.log
。 每个窗口的通道日志都被写入 $session/log/$window_chan.log
。 这些窗口具有以下调试命令。
Command | Description ---|--- PrintDebug | 打印调试信息 WriteDebug | 将调试信息写入 $session/log 目录中名为 $window_debug.log 的文件
Roadmap
- 基于配置的主机重定向。
- 在 repeater 中跟随重定向。
- Nvim 支持。
- Socks 支持。
- http/2 和 http/3 支持。
Contributing
欢迎报告问题和 PR。 非常欢迎功能请求。
Social
[![X](https://camo.githubusercontent.com/8c709aaebc7feee6050eba44984b294d9da3ace3353bd5eed8b499dd04af3c06/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f582d3030303030303f7374796