Skip to content

Terminal based intercepting proxy written in rust with tmux and vim as user interface.

License

MIT license 102 stars 2 forks

hail-hydrant/zxc

Terminal based intercepting proxy written in rust with tmux and vim as user interface.

Table of Contents

  1. About The Project
  2. Features
  3. Prerequisites
  4. Installation
  5. Usage
  6. Windows
  7. Filetypes
  8. Search
  9. Encoding and Decoding
  10. Configuration * Tmux Config * Zxc Config
  11. Highlight Groups
  12. Logging
  13. Debugging
  14. Roadmap
  15. Contributing
  16. 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

该工具需要 zxc.vim vim 插件,它使 vim 能够作为用户界面。每个窗口和文件类型都有自己的一组键盘绑定和命令。

以下窗口存在于 zxc 中:

zxc 被调用时,bash alias 列表用于生成具有特定窗口名称的 vim,该窗口名称加载相应的 vim 配置。所有窗口都是 vim 实例,它们通过 unixsocket 通道与 zxc 二进制文件通信。

Alias | Window ---|--- interceptor | Interceptor vhistory | History repeater | Repeater addons | Addons

这些窗口(除了暂停记录的历史记录)可以使用它们各自的别名关闭和重新打开。

            ┌─────────────┐
    ┌───────────────►│ zxc binary │◄────┬───────────────┐
    │        └┬────────────┘   │        │
    │         │         │        │
    │         │  unix socket  │        │
    │         │         │        │
┌──────▼──────┐  ┌──────▼──────┐  ┌───────▼─────┐  ┌─────▼──────┐
│ Interceptor │  │  History  │  │  Repeater │  │ Addons  │
└─────────────┘  └─────────────┘  └─────────────┘  └────────────┘

Features

Prerequisites

Packages

attr tmux vim ffuf sqlmap bsdmainutils

Installation

Requirements

Packages

make openssl

Make

make

./target/release 中的 zxc 二进制文件复制到 $PATH。安装 vim plugin

Manual Installation

  1. 复制配置文件
mkdir $HOME/.config/zxc
cp ./config/{alias,config.toml,tmux.conf} $HOME/.config/zxc
  1. 生成私钥
openssl genrsa -out $HOME/.config/zxc/private.key 2048
  1. 使用 ./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
  1. 复制 vim 配置
mkdir -p $HOME/.vim/plugin
cp ./config/example/zxc.vim $HOME/.vim/plugin
  1. 复制文件类型插件(可选)
cp -r ./config/example/ftplugin $HOME/.vim
  1. 构建 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 连接 | wsreq repeater

要重复一个 websocket 请求,

  1. 在一个 websocket 请求 (wreq) 文件中,调用 WsSendToRepeater
  2. 在 repeater 窗口中,对应于 websocket 握手的 http 请求显示在左上方。
  3. 在 request(req) 窗口中调用 WsEstablish 以建立 websocket 连接。
  4. 将数据写入左下角的 scratch.wreq 并调用 RepeaterSend 以发送。

Addons

Addons 窗口用于运行其他工具。 原始请求被复制到特定历史记录文件夹中名为 addons/$addon_prefix-$id.req 的文件夹,前缀特定于被调用的插件。 该请求显示在顶层窗口中,而包含插件命令和参数的终端显示在底部拆分窗口中。 当前,ffufsqlmap 可用。

Add New Addons

请参阅 global config 获取示例插件集成。

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 为 reqhis 添加命令或键映射。

.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 列

Conceal

对于 his 文件类型,可以隐藏 URI。 在 .his ftplugin 中将 g:conceal 变量设置为要隐藏的字符数。 在您的 vimrc 中设置 conceallevel 以启用此功能。

req [http request]

Command | Description ---|--- EditBufVar | 在弹出窗口中编辑缓冲区变量仅在 interceptorrepeater 窗口中可用 RequestToFuzz | 发送到 Ffuf 插件 RequestToRepeater | 发送到 Repeater RequestToSql | 发送到 Sqlmap 插件

Variables

req 文件类型具有特定的变量集,可以修改这些变量以自定义请求处理。 EditBufVar 命令可用于在弹出窗口中编辑缓冲区变量。 保存并退出弹出窗口以反映更改。 以下变量在 interceptorrepeater 窗口中可用。

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 模式下可用于在 interceptorrepeater 窗口中进行编码和解码。

Command | Description ---|--- EBase64 | Base64 编码 DBase64 | Base64 解码 EUrl | URL 编码 DUrl | URL 解码 EUrlAll | URL 编码所有字符 DUrlAll | URL 解码所有字符

register x 用于存储所选文本。

Configuration

tmux config

tmux.conf 用于设置会话别名。 此外,它还从以下位置获取用户的 tmux.conf 文件:

  1. $HOME/.tmux.conf
  2. $HOME/.config/tmux/tmux.conf
  3. $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 中。 默认 global config

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 中创建的。 仅当使用任何标志时,才会创建本地配置。 示例 local config

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 命令 zxclbind-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

Contributing

欢迎报告问题和 PR。 非常欢迎功能请求。

Social

Bluesky Reddit [![X](https://camo.githubusercontent.com/8c709aaebc7feee6050eba44984b294d9da3ace3353bd5eed8b499dd04af3c06/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f582d3030303030303f7374796