
프로토콜 통신 리버스 엔지니어링을 위한 HTTP 프록시 분석
Go로 작성된 경량 HTTP/HTTPS 인터셉팅 프록시 및 트래픽 분석 도구로, 캡처된 트래픽을 실시간으로 검사, 필터링, 색상 표시, 주석 처리할 수 있는 웹 기반 UI를 제공합니다.


HTTP Breakout Proxy는 HTTP 및 HTTPS MITM 프록시이자 실시간 시각화 도구로 동작합니다.
두 소프트웨어 구성 요소 간의 요청과 응답을 캡처하여 개발자가 다음을 수행할 수 있게 해줍니다:
이 프록시는 모든 최신 웹 브라우저에서 접근 가능한 완전한 기능의 UI를 내장하여, 외부 도구 없이 즉각적인 실시간 분석이 가능합니다.
captures.json(또는 지정된 파일)에 저장됩니다.status:4 status:5 → HTTP 오류 강조url:/api/ → API 요청 강조/\.css$/ → URL에 대한 정규식 매칭method:GET, status:404, header:Content-Type=application/json)/login/)curl 명령어(터미널용 형식)python requests 코드 스니펫(깔끔한 JSON 표현)httpbreakout -l 127.0.0.1:8080
git clone https://github.com/jbsouthe/http-breakout-proxy.git
cd http-breakout-proxy
go build -o http-breakout-proxy
이렇게 하면 컴파일된 프록시와 내장 UI 에셋이 포함된 단일 실행 파일이 생성됩니다.
# 기본값으로 실행 (프록시 + UI)
./http-breakout-proxy
기본적으로 바이너리는 프록시용으로 127.0.0.1:8080에 바인딩됩니다(선택적으로 UI도 — CLI 플래그 참조). 브라우저에서 UI를 열어 캡처를 검사합니다.
# 프록시를 통해 HTTPS 요청 전송 (프록시는 127.0.0.1:8080에서 수신)
curl -x http://127.0.0.1:8080 https://example.com
캡처된 트래픽이 웹 UI에 표시됩니다.
사용 가능한 플래그와 사용법 설명을 보려면
./http-breakout-proxy -h를 사용하세요.
UI는 조사 워크플로우에 최적화되어 있습니다.
METHOD URL [STATUS]이지만 사용자 지정 이름을 지정할 수 있습니다.curl로 복사, Python requests로 복사, 응답 본문 다운로드, 이름 바꾸기, 삭제.method:, status:, host:, url:, body:, req.body:, resp.body:, header:, req.header:, resp.header:./pattern/flags (예: /bearer\\s+\\S+/i).header:name=value, 여기서 name 또는 value는 정규식일 수 있습니다.예시:
method:POST status:2 host:api.example.com/token\\s*[:=]\\s*\\S+/ireq.header:authorization=/bearer/ibody:/\\"success\\"\\s*:\\s*true/i중간자(MITM) 모드가 활성화되면:
-ca(기본값 ./ca)에 저장합니다.ca.pem 또는 유사한 파일)를 요청을 보내는 클라이언트(또는 시스템)의 신뢰 저장소에 추가해야 합니다. 많은 플랫폼에서 관리자 권한이 필요합니다.보안 참고: 제어된 환경에서만 CA를 설치하세요. 관련 없는 민감한 트래픽을 읽는 시스템에서는 이 CA를 신뢰하지 마세요.
영속성이 활성화된 경우(-f 또는 설정된 경로를 통해):
captures.json).캡처된 항목은 JSON으로 직렬화되며 다음 필드를 포함합니다(전체 목록 아님):
id — 고유 시퀀스 식별자time — 타임스탬프(ISO 8601)method, urlrequest_headers, response_headersrequest_body, response_body — 필요한 경우 -max-body로 잘림response_status, duration_msname — 선택적 사용자 레이블notes, deleted — SSE 이벤트 및 UI 상태를 위한 제어 메타데이터curl 명령을 생성합니다(홉바이홉 헤더 제외).url, headers, 선택적 data가 포함된 작은 requests 스니펫을 생성합니다.Content-Type에서 확장자를 유추합니다.설계 고려 사항:
Host, Content-Length, Connection)는 생성된 재생 명령에서 제외됩니다.GET /api/captures — 캡처 목록(JSON 배열).DELETE /api/captures — 모든 캡처 지우기.GET /api/captures/{id} — 단일 캡처 검색.DELETE /api/captures/{id} — 특정 캡처 삭제.PATCH /api/captures/{id} — 캡처 메타데이터 업데이트; 본문 예: { "name": "My label" }.GET /api/pause — { "paused": true|false } 반환.POST /api/pause — 일시 중지 상태 설정; 본문 예: { "paused": true }.GET /events — 실시간 캡처 알림 및 제어 이벤트용 SSE(Server-Sent Events) 스트림.//go:embed ui/*와 fs.Sub를 사용하여 정적 파일을 제공합니다. 이렇게 하면 단일 배포 가능 아티팩트가 생성됩니다.Content-Encoding을 확인하고 표시 전에 gzip 및 deflate 본문의 압축 해제를 시도합니다. 원본 바이트는 프록시 투명성을 위해 유지됩니다.io.LimitReader를 사용하여 읽혀 잘림을 감지하고 메모리 사용을 보호합니다.권장 배포 모델:
CGO_ENABLED=0, -trimpath, -ldflags "-s -w")..tar.gz, Windows용 .zip) README.md와 LICENSE를 포함합니다.goreleaser를 사용하여 크로스 플랫폼 빌드 및 릴리스 아티팩트를 자동화합니다.빌드 명령 예시:
# Linux x86_64
GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -trimpath -ldflags "-s -w" -o dist/http-breakout-proxy-linux-amd64 .
# macOS (arm64)
GOOS=darwin GOARCH=arm64 CGO_ENABLED=0 go build -trimpath -ldflags "-s -w" -o dist/http-breakout-proxy-darwin-arm64 .
[Unit]
Description=HTTP Breakout Proxy
After=network.target
[Service]
ExecStart=/opt/http-breakout-proxy/http-breakout-proxy -l 0.0.0.0:8080
Restart=on-failure
User=proxy
Group=proxy
[Install]
WantedBy=multi-user.target
~/Library/LaunchAgents에 plist를 생성하고 launchctl로 로드합니다.
캡처된 본문이 이진 깨진 텍스트로 표시됨
본문이 압축되어 있습니다(예: gzip). 자동 압축 해제가 포함된 빌드를 실행 중인지 확인하세요. UI는 가능한 경우 압축 해제된 JSON/텍스트를 표시합니다.
HTTPS 트래픽이 표시되지 않음 / 연결 오류
클라이언트가 생성된 CA를 신뢰하지 않습니다. ca/ca.pem을 클라이언트/시스템 신뢰 저장소에 설치하고 TLS 인터셉션용으로 신뢰됨으로 표시하세요.
캡처를 지운 후 UI에 오래된 선택 항목이 표시됨
cleared SSE 이벤트에서 selectedId를 지우는 클라이언트로 업그레이드하거나 GET /api/captures 엔드포인트를 호출하여 상태를 새로 고치세요.
DELETE /api/captures에서 405 발생
서버 핸들러가 /api/captures에 대한 DELETE를 허용하는지, 그리고 후행 슬래시 불일치가 아닌지 확인하세요.
이 도구는 MITM이 활성화되면 TLS 인터셉션을 수행합니다. 트래픽 검사에 대한 명시적 승인이 있는 제어된 환경에서만 사용하세요. 생성된 CA는 강력합니다: 개인 키를 다른 루트 CA 개인 키와 동일한 수준의 기밀로 취급하세요. 공유 또는 프로덕션 신뢰 저장소에 CA를 설치하지 마세요.
기여를 환영합니다. 버그나 기능 요청은 이슈를 열어 주세요. 코드 기여의 경우:
이 프로젝트는 MIT 라이선스에 따라 배포됩니다. 자세한 내용은 LICENSE를 참조하세요.
저자: John Southerland (GitHub: jbsouthe)
프로젝트: http-breakout-proxy — HTTP 동작에 대한 디버깅, 개발 및 학습을 위해 제작되었습니다.
| Flag | Default | Description |
|---|
-l | 127.0.0.1:8080 | 프록시가 수신할 주소이자 UI 앱 주소. |
-mitm | true | HTTPS 중간자(MITM) 모드 인터셉션 활성화(TLS 인터셉션용 로컬 CA 생성). |
-ca | ./ca | MITM이 활성화되고 영속성이 선택된 경우 생성된 CA 인증서와 키가 저장되는 디렉터리. |
-f | ./captures.json | 캡처를 디스크에 저장하기 위한 선택적 경로 또는 디렉터리(예: ./captures.json). |
-max-body | 1048576 | 본문별 저장/표시할 최대 바이트 수. 더 큰 본문은 센티널 표시와 함께 잘립니다. |
-buffer-size | 1000 | 메모리 내 캡처용 순환 버퍼 용량. |
-v | false | 디버깅용 상세 로깅 활성화. |