mitmproxy에서 iOS Simulator의 특정 URL에 대한 HTTP/HTTPS 응답 바디 변경

전체 MacOS의 프록시 설정을 로컬에서 시작하는mitmproxy에 설정하고 iOS Simultator의 HTTP/HTTPS 통신 메모를 수집하고 변경합니다.

기본 설정


mitmproxy(version 0.17.)를 설치합니다.
$ brew install mitmproxy
처음 시작할 때~/.mitmproxy/ 다음에 CA 인증서를 생성합니다.
$ mitmproxy    # Ctrl-C で抜ける
Mac의 프록시 설정과 ON/OFF의 정형 처리된 스크립트를 mitmproxy-wrap 같은 이름으로 저장하고 실행합니다.
#!/bin/sh
# save as mitmproxy-wrap

sudo networksetup -setwebproxy Wi-Fi localhost 8080
sudo networksetup -setsecurewebproxy Wi-Fi localhost 8080
sudo networksetup -setwebproxystate Wi-Fi on
sudo networksetup -setsecurewebproxystate Wi-Fi on
mitmproxy "$@"
sudo networksetup -setwebproxystate Wi-Fi off
sudo networksetup -setsecurewebproxystate Wi-Fi off

iOS Simultor 인증서 설정


Xcode에서 iOS Simulator는 하나 이상의 장치(OS)를 미리 시작하고 종료합니다.
ADVTrustStoreiosCertTrustManager.py를 사용하여 Mitmproxy의 CA 인증서를 iOS Simulator의 각 장치에 설치합니다.
$ ./iosCertTrustManager.py -a ~/.mitmproxy/mitmproxy-ca-cert.pem
subject= CN = mitmproxy, O = mitmproxy

Import certificate to iPhone 6 v10.0 [y/N] y
Importing to /Users/...(snip).../Library/Developer/CoreSimulator/Devices/...(snip).../data/Library/Keychains/TrustStore.sqlite3
  Existing certificate replaced
...(snip)...

Mitmproxy로 HTTP 응답 덮어쓰기


스크립트 필터링 준비:
새 mitmproxy 시 (2.0.2로 동작 확인):
# Usage: -s "replace_response_body.py <url_prefix> <file>"
import argparse

class Replacer:
    def __init__(self, url_prefix, file_name):
        self.url_prefix, self.file_name = url_prefix, file_name

    def response(self, flow):
        flow.response.replace(self.url_prefix, self.file_name)
        if flow.request.pretty_url.startswith(self.url_prefix):
            with open(self.file_name, "r") as file:
                flow.response.text = file.read()

def start():
    parser = argparse.ArgumentParser()
    parser.add_argument("url_prefix", type=str)
    parser.add_argument("file_name", type=str)
    args = parser.parse_args()
    return Replacer(args.url_prefix, args.file_name)
이전 mitmproxy 시 (0.17 동작 확인):
# Usage: -s "replace_response_body.py <url_prefix> <file>"
from mitmproxy.models import decoded

def start(context, argv):
    if len(argv) != 3:
        raise ValueError('Usage: -s "replace_response_body.py <url_prefix> <file>"')
    context.url_prefix, context.file = argv[1], argv[2]

def response(context, flow):
    if flow.request.pretty_url.startswith(context.url_prefix):
        with decoded(flow.response):
            with open(context.file, "r") as file:
                flow.response.content = file.read()
결과를 바꿀 파일을 준비하려면 다음과 같이 하십시오.
// save as sample.js

alert('hello mitmproxy');
다음은 https://www.google-analytics.com/analytics.js에서 시작된 URL의 HTTPS 응답 바디의 샘플을 sample.js로 다시 작성합니다.
$ mitmproxy-wrap -s "replace_response_body.py https://www.google-analytics.com/analytics.js sample.js"
Sample은 iOS Simulator를 시작하여 Safari와 같은 브라우저에서 해당 URL에 대한 요청이 발생할 때 발생합니다.js를 반환하고 실행하면 다음 대화상자가 나타납니다.

참조 페이지

  • mitmproxy에서 iOS Simulator의 노트 보기 |hmhv
  • 프록시 서버를 통해 iOS 실제 시스템의 SSL 통신을 캡처하거나 변조하는 방법 - Qita
  • mitmproxy/examples at v0.17.1 · mitmproxy/mitmproxy
  • 좋은 웹페이지 즐겨찾기