본문으로 건너뛰기

© 2026 Molayo

HN요약2026. 05. 25. 20:27

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로서 tmuxvim을 사용하여 Rust로 작성된 터미널 기반 인터셉팅 프록시 (intercepting proxy)입니다.

목차 (Table of Contents)

이 도구는 vim이 사용자 인터페이스 (user interface)로 작동할 수 있게 해주는 vim 플러그인을 필요로 합니다. 각 창 (window)과 파일 타입 (filetype)은 고유한 키 바인딩 (keybindings)과 명령어를 가집니다.

자xc에는 다음과 같은 창들이 존재합니다:

zxc가 호출되면, 특정 창 이름을 가진 vim을 실행하기 위해 bash 리스트가 사용되며, 이는 해당 vim 설정을 로드합니다. 모든 창은 unixsocket 채널을 통해 zxc 바이너리와 통신하는 vim 인스턴스입니다.

별칭 (Alias)창 (Window)
interceptorInterceptor
...
창들은 (기록을 중단하는 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).reqscratch.wreq
WsEstablishWebSocket 연결 설정 (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)가 포함된 터미널이 표시됩니다. 현재 ffufsqlmap을 사용할 수 있습니다.

애드온 통합 예시는 다음을 참조하세요.

$HOME/.config/zxc/config.toml 파일에 새로운 테이블을 정의하세요.

다음 값(문자열)이 필요합니다:

KeyDescription
name호출될 바이너리 (binary)의 이름
...
만약 바이너리가 기본적으로 HTTPS를 사용한다면 http_flag를 건너뛰고, 그 반대의 경우도 마찬가지입니다.

애드온은 요청 .req 파일에서 RequestToAddon 함수를 호출하여 실행할 수 있습니다.

call RequestToAddon("addon_name")

히스토리 .his 파일에서 HistoryToAddon 함수를 호출하여 실행할 수 있습니다.

call HistoryToAddon("addon_name")

reqhis를 위한 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에서는 다음 파일 형식을 사용할 수 있습니다.

CommandDescription
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)
EditBufVarinterceptorrepeater 창에서만 사용 가능한 팝업을 통해 버퍼 변수 (buffer variables) 편집
...req 파일 유형 (filetype)은 요청 처리 (request handling)를 커스텀하기 위해 수정할 수 있는 특정 변수 세트를 가지고 있습니다. EditBufVar 명령을 사용하여 팝업에서 버퍼 변수를 편집할 수 있습니다. 변경 사항을 반영하려면 팝업을 저장하고 종료하세요. 다음 변수들은 interceptorrepeater 창에서 사용할 수 있습니다.
변수 (Variable)유형 (Type)설명 (Description)
b:hoststring요청을 보낼 호스트 (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)
WsSendToRepeaterws 요청을 Repeater로 전송

팝업 창은 사용자의 zxc.vim 파일에서 Vim의 popup_create 인자 (arguments) 옵션을 사용하여 g:popup_options를 설정함으로써 커스텀할 수 있습니다.

파일 유형 (FileType)설명 (Description)
wreswebsocket 응답 (websocket response)
popup팝업 창 (popup window)

다음 명령들은 각각의 리스트를 검색하고 채웁니다.

Quickfix-listLocation-list검색된 파일 타입 (Filetypes searched)
GreqLGreq.req
...

interceptorrepeater 창의 인코딩(encoding)과 디코딩(decoding)을 위해 VISUAL 모드에서 다음 명령들을 사용할 수 있습니다.

명령 (Command)설명 (Description)
EBase64Base64 인코딩 (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_optionsVim의 popup_create-arguments로 전달되는 옵션들입니다.
g:timeout차단(blocking) 시 zxc로부터 응답을 기다리는 시간입니다. 기본값은 5000 ms입니다.

ftplugin 링크 예시

링크 (Link)용도
zxcinterceptor, repeater, Addons, Encoding, Decoding
...
각 파일 타입(filetype)은 고유한 하이라이트 그룹(highlight groups) 세트를 가집니다. 사용 가능한 하이라이트 그룹 목록을 확인하려면 :h zxc-highlight-groups를 사용하십시오. 사용 가능한 하이라이트 그룹의 요약본은 여기에서 확인할 수 있습니다.
파일 타입 (FileType)하이라이트 그룹 도움말 (Highlight Group Help)
historyzxc-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가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0