Show HN: Zxc – tmux와 Vim을 UI로 사용하는 Rust 기반 TLS 프록시, BurpSuite 대안
요약
Zxc는 tmux와 Vim을 사용자 인터페이스로 활용하는 Rust 기반의 터미널 인터셉팅 프록시입니다. BurpSuite의 대안으로 설계되었으며, HTTP/1.1 및 WebSocket을 지원하고 디스크 기반 저장 방식을 사용합니다.
핵심 포인트
- tmux와 Vim을 UI로 사용하는 독특한 터미널 기반 인터페이스
- Rust 언어로 작성되어 높은 성능과 안정성 제공
- 커스텀 HTTP/1.1 파서를 통한 잘못된 요청 테스트 지원
- HTTP/1.1 및 WebSocket 프로토콜 지원
user interface로서 tmux와 vim을 사용하여 Rust로 작성된 터미널 기반 인터셉팅 프록시 (intercepting proxy)입니다.
목차 (Table of Contents)
이 도구는 vim이 사용자 인터페이스 (user interface)로 작동할 수 있게 해주는 vim 플러그인을 필요로 합니다. 각 창 (window)과 파일 타입 (filetype)은 고유한 키 바인딩 (keybindings)과 명령어를 가집니다.
자xc에는 다음과 같은 창들이 존재합니다:
zxc가 호출되면, 특정 창 이름을 가진 vim을 실행하기 위해 bash 리스트가 사용되며, 이는 해당 vim 설정을 로드합니다. 모든 창은 unixsocket 채널을 통해 zxc 바이너리와 통신하는 vim 인스턴스입니다.
| 별칭 (Alias) | 창 (Window) |
|---|---|
| interceptor | Interceptor |
| ... | |
| 창들은 (기록을 중단하는 history를 제외하고) 각각의 별칭을 사용하여 닫거나 다시 열 수 있습니다. |
┌─────────────┐
┌───────────────►│ zxc binary │◄────┬───────────────┐
│ └┬────────────┘ │ │
...
-
tmux와 vim을 사용자 인터페이스 (user interface)로 사용.
-
디스크 기반 저장 (Disk based storage).
-
잘못된 요청 (malformed requests)을 보내기 위한 커스텀 http/1.1 파서 (parser).
-
http/1.1 및 websocket 지원.
-
getfattr
-
tmux
-
다음 기능들을 포함한 vim (> 8.2.4684)
- channel
- terminal
- timers
-
ffuf
-
sqlmap
-
column (history 파일을 들여쓰기하기 위한 선택 사항)
attr tmux vim ffuf sqlmap bsdmainutils
- cargo msrv 1.91.1
- make
- openssl
make openssl
make
./target/release에서 zxc 바이너리를 $PATH로 복사하세요. vim 플러그인을 설치하세요.
- 설정 파일 복사
mkdir $HOME/.config/zxc
cp ./config/{alias,config.toml,tmux.conf} $HOME/.config/zxc
- 개인 키 (private key) 생성
openssl genrsa -out $HOME/.config/zxc/private.key 2048
- ./mkscripts/CA.cnf를 CA 설정으로 사용하여 CA 인증서 (CA certificate) 생성.
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
- 파일 타입 플러그인 (filetype plugins) 복사 (선택 사항)
cp -r ./config/example/ftplugin $HOME/.vim
- zxc를 빌드하거나 release에서 다운로드하세요.
cargo b --release
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
$HOME/.config/zxc/zxca.crt에 있는 CA 인증서(CA certificate)를
신뢰할 수 있는 CA 또는
브라우저에 추가하세요.
zxc
-n, --new-name <NEW_NAME> 생성할 세션 이름
-a, --attach <ATTACH_NAME> 기존 세션에 연결
-p, --port <PORT> 사용할 프록시 포트 [기본값: 8080]
...
-i와 -e는
상호 배타적 (mutually exclusive)입니다. 값은
domain:port
형식이어야 합니다.
예를 들어, https://를 제외한 모든 도메인을 가로채려면 (intercept):
zxc -e example.com:443
플래그(flags)는 와일드카드(wildcard)도 지원합니다. 예를 들어, http://*.example.com의 모든 서브 도메인을 가로채려면:
zxc -i *.example.com:80
도메인은 쉼표로 구분된 값의 목록으로 지정할 수 있습니다.
zxc -i example.com:80,example.com:443
가로챈 요청(requests)과 응답(responses)을 표시합니다. 각 요청 또는 응답은 버퍼(buffer)로 추가됩니다.
| 명령 (Command) | 설명 (Description) |
|---|---|
| InterToggle | 가로채기(Interception) 토글 |
| ... |
다음 히스토리(history) 파일들을 표시합니다.
히스토리 기록을 수행합니다. 창을 닫으면 기록이 중단됩니다. 실수로 창을 닫은 경우 vhistory를 호출하여
기록을 재개하세요. 히스토리 창 없이 zxc가 실행된 경우, 다음에 zxc가 이 세션에 연결될 때
로그 기록을 재개할 수 있도록 상태 파일인 .history.state가 생성됩니다.
창은 수정할 수 없는 읽기 전용(read only)입니다.
리피터(Repeater) 창은 요청을 반복(repeat)하는 데 사용됩니다. 원본 요청은 특정 히스토리 폴더 내의
HTTP의 경우 r-$id, WebSocket의 경우 r-ws-$id라는 이름의 폴더로 복사됩니다.
| 명령 (Command) | 설명 (Description) | 사용 가능 여부 (Availability) |
|---|---|---|
| RepeaterSend | 요청 전송 (Send Request) | .req 및 scratch.wreq |
| WsEstablish | WebSocket 연결 설정 (Establish Websocket Connection) | ws 리피터 내의 .req |
WebSocket 요청을 반복하려면,
-
WebSocket 요청 (
wreq) 파일에서WsSendToRepeater를 호출하세요. -
Repeater (반복자) 창의 왼쪽 상단에는 WebSocket 핸드셰이크 (handshake)에 해당하는 HTTP 요청이 표시됩니다.
-
요청 (
req) 창에서WsEstablish를 호출하여 WebSocket 연결을 설정하세요. - 왼쪽 하단의scratch.wreq에 데이터를 작성하고RepeaterSend를 호출하여 전송하세요.
Addons (애드온) 창은 추가 도구를 실행하는 데 사용됩니다. 원본 요청은 호출되는 애드온의 특정 접두사가 붙은 히스토리 (history) 폴더 내의 addons/$addon_prefix-$id.req라는 이름의 폴더로 복사됩니다. 요청은 상단 창에 표시되며, 하단 분할 창에는 애드온 명령 (cmd) 및 인자 (arguments)가 포함된 터미널이 표시됩니다. 현재 ffuf 및 sqlmap을 사용할 수 있습니다.
애드온 통합 예시는 다음을 참조하세요.
$HOME/.config/zxc/config.toml 파일에 새로운 테이블을 정의하세요.
다음 값(문자열)이 필요합니다:
| Key | Description |
|---|---|
| name | 호출될 바이너리 (binary)의 이름 |
| ... | |
만약 바이너리가 기본적으로 HTTPS를 사용한다면 http_flag를 건너뛰고, 그 반대의 경우도 마찬가지입니다. |
애드온은 요청 .req 파일에서 RequestToAddon 함수를 호출하여 실행할 수 있습니다.
call RequestToAddon("addon_name")
히스토리 .his 파일에서 HistoryToAddon 함수를 호출하여 실행할 수 있습니다.
call HistoryToAddon("addon_name")
req 및 his를 위한 ftplugin을 통해 명령 (command) 또는 키맵 (keymap)을 추가하세요.
.req를 위한 명령 예시:
command RequestToAddon_Name :call RequestToAddon("addon_name")
.his를 위한 명령 예시:
command HistoryToAddon_Name :call HistoryToAddon("addon_name")
.req를 위한 키맵 예시:
nnoremap <silent> <Leader>q :call RequestToAddon("addon_name")
.his를 위한 키맵 예시:
noremap <silent> <Leader>q :call HistoryToAddon("addon_name")
zxc에서는 다음 파일 형식을 사용할 수 있습니다.
| Command | Description |
|---|---|
| HistoryView | 강조된 히스토리 보기. 기본 키 바인딩은 <CR>입니다 |
| ... |
Vim 폴드 (fold)는 필터를 적용하는 데 사용됩니다. 모든 폴드를 열려면 zR을 사용하세요. -
HistoryIndent 명령은 column을 사용합니다
shell command이며 대용량 파일에서는 리소스를 많이 소모할 수 있습니다. 주의해서 사용하세요. -
HostScope 및 UriScope는 Vim 정규표현식 (regex)을 지원합니다. 항목 앞에
/r
을 붙이면 정규표현식으로 매칭합니다. 예를 들어 google.com의 모든 서브도메인을 매칭하려면 /r .*.google.com을 사용합니다.
his 파일 유형 (filetype)의 경우, URI를 숨길 수 있습니다. .his ftplugin에서 g:conceal 변수를 숨길 문자의 수로 설정하세요. 이 기능을 활성화하려면 vimrc에서 conceallevel을 설정해야 합니다.
| 명령 (Command) | 설명 (Description) |
|---|---|
| EditBufVar | interceptor 및 repeater 창에서만 사용 가능한 팝업을 통해 버퍼 변수 (buffer variables) 편집 |
| ... | req 파일 유형 (filetype)은 요청 처리 (request handling)를 커스텀하기 위해 수정할 수 있는 특정 변수 세트를 가지고 있습니다. EditBufVar 명령을 사용하여 팝업에서 버퍼 변수를 편집할 수 있습니다. 변경 사항을 반영하려면 팝업을 저장하고 종료하세요. 다음 변수들은 interceptor 및 repeater 창에서 사용할 수 있습니다. |
| 변수 (Variable) | 유형 (Type) | 설명 (Description) |
|---|---|---|
| b:host | string | 요청을 보낼 호스트 (scheme별 기본값에 대해 포트는 무시) |
| ... | 다음 확장 속성 (extended attributes)들은 사용자가 zxc 외부에서 요청의 목적지를 식기할 수 있도록 .req 파일 유형 (filetype)에 설정됩니다. |
| 값 (Value) | 설명 (Description) |
|---|---|
| user.host | 요청이 전송된 호스트 (scheme별 기본값에 대해 포트는 무시) |
| ... | 오직 b:update 변수만 사용 가능합니다. |
| 명령 (Command) | 설명 (Description) |
|---|---|
| ViewWsHistory | 강조된 ws 흐름 (ws flow) 보기. 기본 바인딩은 <CR> 입니다. |
| 명령 (Command) | 설명 (Description) |
|---|---|
| ViewWsSessionHistory | 강조된 ws 요청/응답 (req/res)을 분할 창에서 보기. 기본 바인딩은 <CR> 입니다. |
이진 프레임 (Binary Frames)은 상태 표시줄 (status line) 오른쪽 구석에 'b'로 표시됩니다.
| 명령 (Command) | 설명 (Description) |
|---|---|
| WsSendToRepeater | ws 요청을 Repeater로 전송 |
팝업 창은 사용자의 zxc.vim 파일에서 Vim의 popup_create 인자 (arguments) 옵션을 사용하여 g:popup_options를 설정함으로써 커스텀할 수 있습니다.
| 파일 유형 (FileType) | 설명 (Description) |
|---|---|
| wres | websocket 응답 (websocket response) |
| popup | 팝업 창 (popup window) |
다음 명령들은 각각의 리스트를 검색하고 채웁니다.
| Quickfix-list | Location-list | 검색된 파일 타입 (Filetypes searched) |
|---|---|---|
| Greq | LGreq | .req |
| ... |
interceptor 및 repeater 창의 인코딩(encoding)과 디코딩(decoding)을 위해 VISUAL 모드에서 다음 명령들을 사용할 수 있습니다.
| 명령 (Command) | 설명 (Description) |
|---|---|
| EBase64 | Base64 인코딩 (Base64 encode) |
| ... |
레지스터 x는 선택된 텍스트를 저장하는 데 사용됩니다.
세션 별칭(session aliases)을 설정하는 데 사용됩니다. 또한 사용자의 tmux.conf 파일을 다음 경로에서 불러옵니다(source).
- $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
설정 파일에는 전역(Global) 설정과 세션별 로컬(per session local) 설정 두 가지 유형이 있습니다. 로컬 설정은 전역 설정보다 우선순위를 가집니다.
전역 설정(Global Config) 파일은 $HOME/.config/zxc/config.toml에 위치합니다.
. 기본값 (Default)
| 키 (Keys) | 설명 (Description) | 가능한 값 (Possible Values) |
|---|---|---|
| excluded_domains | 릴레이될 도메인 목록 (List of domains to be relayed) | 문자열 리스트 (string list) |
| ... |
세션별 설정(Per session config)은 사용자 플래그(flags)를 기반으로 $session/config.toml에 생성됩니다.
플래그가 사용된 경우에만 로컬 설정이 생성됩니다. 예시.
| 키 (Keys) | 설명 (Description) | 가능한 값 (Possible Values) |
|---|---|---|
| included_domains | 프록시할 도메인 목록 (List of domains to proxy) | 문자열 리스트 (string list) |
| ... |
포함(Include) 리스트와 제외(exclude) 리스트는 상호 배타적입니다. 두 리스트가 모두 존재하는 경우 포함 리스트가 우선권을 가집니다. 와일드카드(wildcard)를 지원합니다.
히스토리 창(history window)의 EditConfig 명령은 팝업 창(popup window)에서 로컬 설정 파일을 엽니다. 창을 종료할 때 파일이 수정되어 있다면 설정이 자동으로 다시 로드(reloaded)됩니다. 히스토리 창 외부에서 파일을 편집한 경우에는 히스토리 창에서 ReloadConfig를 호출하십시오.
각 창과 파일 타입(filetype)은 고유한 명령 세트를 가집니다. 파일 타입은 각각의 ftplugin에서 설정할 수 있습니다. 명령에 대한 자세한 설명은 :h zxc.txt를 참조하십시오.
다음 전역 변수(global variables)를 사용할 수 있습니다.
| 변수 (Variables) | 설명 |
|---|---|
| g:popup_options | Vim의 popup_create-arguments로 전달되는 옵션들입니다. |
| g:timeout | 차단(blocking) 시 zxc로부터 응답을 기다리는 시간입니다. 기본값은 5000 ms입니다. |
ftplugin 링크 예시
| 링크 (Link) | 용도 |
|---|---|
| zxc | interceptor, repeater, Addons, Encoding, Decoding |
| ... | |
각 파일 타입(filetype)은 고유한 하이라이트 그룹(highlight groups) 세트를 가집니다. 사용 가능한 하이라이트 그룹 목록을 확인하려면 :h zxc-highlight-groups를 사용하십시오. 사용 가능한 하이라이트 그룹의 요약본은 여기에서 확인할 수 있습니다. |
| 파일 타입 (FileType) | 하이라이트 그룹 도움말 (Highlight Group Help) |
|---|---|
| history | zxc-hl-his |
| ... | |
로그는 $session/log.txt에 기록됩니다. 로그는 tmux 명령인 zxcl을 사용하거나 bind-key e 단축키를 사용하여 tmux 팝업(popup)에서 볼 수 있습니다. |
기본적으로 명령을 저장하기 위해 인덱스 1000의 tmux 명령 별칭(command-alias)이 사용됩니다. 충돌이 발생하는 경우 $HOME/.config/zxc/tmux.conf에서 인덱스를 할당되지 않은 다른 값으로 변경하십시오.
디버깅을 활성화하려면 -d 플래그와 함께 zxc를 실행하십시오. 바이너리로부터의 프록시 디버그 정보는 $session/log/proxy.log에 기록됩니다. 각 윈도우(window)의 채널 로그는 $session/log/$window_chan.log에 기록됩니다. 윈도우에는 다음과 같은 디버그 명령이 있습니다.
| 명령 (Command) | 설명 |
|---|---|
| PrintDebug | 디버그 정보를 출력합니다. |
| WriteDebug | 디버그 정보를 $session/log 디렉토리 내의 $window_debug.log라는 이름의 파일에 기록합니다. |
- 설정 기반 호스트 리다이렉션 (host redirection).
- 리피터(repeater)에서의 리다이렉트(redirects) 추적.
- Nvim 지원.
- Socks 지원.
- http/2 및 http/3 지원.
이슈(issues) 및 PR(Pull Requests)을 자유롭게 보고해 주세요. 기능 요청(Feature requests)은 언제나 환영합니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 HN Code Generation의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기