본문 바로가기

카테고리 없음

mitmproxy로 네트워크 트래픽 확인하기

  • 이전 회사에서 fiddler 라는 프로그램으로 static js 디버깅을 했었음
  • windows os에서는 무료로 사용할 수 있지만 macOS에서 사용하려면 유료였음
  • fiddler를 대체할만한 프로그램을 찾아보다가 mitmproxy를 알게 됐음 
  • mitmproxy를 활용하여 프론트엔드-백엔드 연동이 필요한 디버깅을 수월하게 함

mitmproxy 란?

  • HTTP/HTTPS 트래픽을 중간에서 가로채서 분석하고 수정할 수 있는 도구
  • official page: https://mitmproxy.org/

주요 기능

  1. 트래픽 모니터링
    • 모든 HTTP/HTTPS 요청과 응답을 실시간으로 확인
    • 헤더, 쿠키, 데이터 등을 분석
  2. 트래픽 수정
    • 요청/응답을 중간에서 변경 가능
    • 특정 도메인의 요청을 다른 서버로 리다이렉트
    • Python 스크립트로 커스텀 로직 추가

주로 사용되는 상황:

  • 웹/앱 개발 시 디버깅
  • API 테스트
  • 네트워크 문제 분석
  • 보안 테스트

동작 방식

[브라우저] → [시스템 프록시 설정] → [mitmproxy] → [인터넷/웹서버]

  1. 브라우저가 https://google.com 접속 시도
  2. 시스템 프록시 설정으로 인해 요청이 localhost:8080(mitmproxy 기본 포트)로 전달됨
  3. mitmproxy가 요청을 분석/기록
  4. mitmproxy가 실제 google.com으로 요청을 전달
  5. google.com이 응답
  6. mitmproxy가 응답을 분석/기록
  7. mitmproxy가 브라우저에게 응답 전달

비슷한 프로그램

  • Charles Proxy
    • 유료
  • Fiddler
    • Windows 에서 많이 사용
    • 특정 파일로 바인딩하는 기능을 Mac에서 사용하려면 유료
  • Wireshark

설치

mitmproxy 설치

  • 환경: macOS
# homebrew를 통한 설치
brew install mitmproxy

# mitmproxy 실행
mitmproxy

인증서 설치

# --listen-port 8888 옵션은 생략가능. 기본 포트는 8080. 충돌 시 포트 지정하여 실행.
mitmproxy --listen-port 8888

인증서 설치

# macOS (automated)
sudo security add-trusted-cert -d -p ssl -p basic -k /Library/Keychains/System.keychain ~/.mitmproxy/mitmproxy-ca-cert.pem
  • 설치 후 키체인 접근 앱에서 확인 가능
  • 키체인 접근 - 시스템 키체인 하위 시스템

실행

프록시 서버 설정

아래 방법 중 하나를 선택하여 프록시 서버를 설정한다.

시스템 설정

  • 시스템 설정 - Wi-Fi - 연결된 Wi-Fi 의 세부사항… 버튼 클릭 - 프록시

혹은

  • 시스템 설정 - 검색바에 프록시 검색 - 프록시(연결된 네트워크의 프록시 창이 열림)
  • 웹 프록시(HTTP), 보안 웹 프록시(HTTPS) 를 켜고 다음 정보를 입력한다.
    • 서버
      • 127.0.0.1
    • 포트
      • 8080

터미널

networksetup -setsecurewebproxy "Wi-Fi" localhost 8888 # https
networksetup -setwebproxy "Wi-Fi" localhost 8888 # http

mitmproxy 실행

# mitmproxy 실행
mitmproxy

종료

  • q 를 눌러 종료

프록시 설정 해제

  • 프록시 설정 화면에서 웹 프록시(HTTP), 보안 웹 프록시(HTTPS) off
  • 설정을 해제 하지 않으면 모든 인터넷이 안됨

 

프록시 설정 및 mitmproxy 실행 스크립트화

프록시 설정 및 mitmproxy 실행 스크립트 파일 생성

# proxy-start

#!/bin/bash
networksetup -setwebproxy "Wi-Fi" localhost 8888
networksetup -setsecurewebproxy "Wi-Fi" localhost 8888
mitmproxy --listen-port 8888

프록시 설정 해제 스크립트 파일 생성

# proxy-stop

#!/bin/bash
networksetup -setwebproxystate "Wi-Fi" off
networksetup -setsecurewebproxystate "Wi-Fi" off

실행 권한 추가

chmod +x proxy-st*

명령어로 추가

sudo mv proxy-st* /usr/local/bin

 

고급

요청 가로채기(Python addon)

redirect.py 파일 생성

from urllib.parse import urlparse

from mitmproxy import http

# "가로챌 서버":"redirect할 서버"
mapping = {
    "https://my-server.com": "http://localhost:8080",
    "https://api.my-server.com": "http://localhost:8080",
    "https://my-2nd-server.com": "http://localhost:8080"
}

def request(flow: http.HTTPFlow) -> None:
    # pretty_host takes the "Host" header of the request into account,
    # which is useful in transparent mode where we usually only have the IP
    # otherwise.

    for org_url, redirect_url in mapping.items():
        org_parsed = urlparse(org_url)
        if flow.request.pretty_host == org_parsed.hostname:
            redirect_parsed = urlparse(redirect_url)
            flow.request.host = redirect_parsed.hostname
            if redirect_parsed.port is not None:
                flow.request.port = redirect_parsed.port
            else:
                if redirect_parsed.scheme == "https":
                    flow.request.port = 443
                else:
                    flow.request.port = 80
            flow.request.scheme = redirect_parsed.scheme

redirect.py 참조하도록 실행

# mitmproxy -s [redirect.py 파일 위치]
mitmproxy -s ~/.mitmproxy/redirect.py

config.yaml 파일 생성

실행 시 redirect.py 자동으로 참조하도록 하려면 ~/.mitmproxy/config.yaml 파일에 참조할 파일을 작성한다.

# scripts: ["파일경로"]
scripts: ["~/.mitmproxy/redirect.py"]
http2: false # 필요 시 
listen_port: 8090 # 필요 시. mitmproxy 기본 포트는 8080

특정 파일 로컬 파일로 대체하기(map_local)

Options - map_local 에서

|요청을 가로챌 대상 파일|가로챈 요청을 대체할 파일

# e.g.
- 요청을 가로챌 대상 파일: https://file.my-server.com/my-script.min.js

- 대체 파일: /Users/river/my-local-script.min.js

|https://file.my-server.com/my-script.min.js|/Users/river/my-local-script.min.js

형태로 입력 후 [esc] - q 를 눌러 빠져나온다

더보기

구분자는 꼭 | 가 아니어도 됨

맨 앞에 쓰인 첫번째 기호가 구분자로 쓰임

!https://file.my-server.com/my-script.min.js!/Users/river/my-local-script.min.js

이렇게 사용할 수도 있음

References

https://blog.psi59.com/posts/2020-08-09-mitmproxy-installation/

https://blog.outsider.ne.kr/1514

https://velog.io/@rolroralra/mitmproxy-사용법