2022-02-23

mitmproxyの使い方

アプリケーションのデバッグ時に通信内容を覗いたり、テスト時にリクエスト内容を書き換えるのに便利なmitmproxyの使い方のメモです。

mitmproxyのインストールと起動

ref. Installation - mitmproxy docs

sh
# macOS
brew install mitmproxy

# or Arch Linux
pacman -S mitmproxy

# or Python Package Index
pipx install mitmproxy
sh
mitmproxy

# or
mitmproxy -p 8080

証明書とプロキシの設定 (Android)

※ 以下の方法ではブラウザ (Chrome) の通信しかプロキシできません。 アプリの通信プロキシするには、証明書をrootのファイルシステム上に配置するかAPKを書き換える必要があります。

設定 > ネットワークとインターネット > インターネット > 利用しているWifiの⚙️アイコン > 詳細設定

mitmproxyを動かしているマシンのIPアドレス、ポートを設定する。

HTTPSの通信をプロキシするにはAndroid端末に証明書を設定する必要があります。

http://mitm.itにAndroidのChromeでアクセスすると、各クライアント向けの証明書と設定方法が参照できます。ここからAndroid向けの証明書をダウンロードします。

このページの下にも書いてあるとおり、この証明書をインストールしても他のユーザから通信を覗かれるようなことはありません。

設定 > セキュリティ > 詳細設定 > 暗号化と認証情報 > 証明書のインストール > CA証明書を選択して、ダウンロードした証明書をインストールします。

証明書とプロキシの設定 (Archlinux / GNOME)

Settings > Network > Network Proxy

Androidと同じようにmitm.itから証明書をダウンロードしてインストールします。 ref. Grawity/Adding a trusted CA certificate - Arch Linux Wiki

sh
sudo trust anchor --store ./mitmproxy-ca-cert.pem

アンインストールするときは、

sh
sudo trust anchor --remove ./mitmproxy-ca-cert.pem

mitmproxyの操作方法

key / command説明
h,j,k,lカーソル移動
?ヘルプ
q戻る
fフィルタ (ドメインやリクエスト/レスポンスの内容でフィルタできる)
:export.clip curl @focus選択中のリクエストをcurlコマンドとしてクリップボードにコピーする

ショートカットの設定

yaml
# ~/.mitmproxy/keys.yaml
-
  key: c
  ctx: ["flowlist"]
  cmd: export.clip curl @focus
  help: Export a flow as a curl command to the clipboard.

ref. Keyboard shortcut for copying URL/curl command/etc. #2649

通信内容を書き換える

このようなPythonスクリプトを用意して、起動時に指定することでリクエスト・レスポンスの内容を書き換えることができます。

python
# client_hints_override.py
from mitmproxy import http

class ClientHintsOverride:
    def request(self, flow: http.HTTPFlow) -> None:
        flow.request.headers["sec-ch-ua-platform"] = "Windows"
        flow.request.headers["sec-ch-ua-platform-version"] = "10"

addons = [ClientHintsOverride()]
sh
mitmproxy -s ./client_hints_override.py

ref. Creating scripts for mitmproxy - Bad Gateway