mitmproxyを使って通信内容を取得したり、書き換えたりする方法について解説します。
今回の例では、iOSの通信を、サーバー上に立てたmitmproxyを経由させて、通信内容を取得・編集します。

mitmproxyとは

mitmproxy とはman-in-the-middle 型のプロキシサーバーのツールです。
pythonでインラインスクリプトを組み込むことで、通信内容を保存したり、書き換えたりすることができます。

mitmproxy のインストール

今回はpython3系を前提。

pip3 install mitmproxy

iOS側の設定

「設定」→「Wi-fi」から接続しているネットワークを選択します。
「プロキシを構成」を「手動」にして以下3つの項目を設定します。

サーバー:mitmproxyを動かすサーバーのIP アドレス
ポート番号:8080(デフォルトは8080。mitmproxy -p xxxxでポートを指定できる。)
認証:オフ

iOSで証明書をインストール

まずは、サーバー側でmitmproxyを起動します。

mitmproxy

iOS端末側で、上記プロキシに接続した上で、http://mitm.it にアクセスします。
Android なら Android、iOS なら iOS のアイコンをタップすることで証明書をインストールされます。

「設定」→「情報」→「証明書信頼設定」でインストールした証明書をオンにします。

mitmproxy側でiOSの通信が入ってきたら準備完了です。

mitmproxyの起動モード

mitmproxyには、mitmproxyとmitmdumpの2つの起動モードがあります。
前者はインタラクティブなCUIツールで、手動で通信を確認する場合はこちらを使用します。後者は、インタラクションをなくしたモードで、インラインスクリプトで自動取得を行う場合こちらを使用します。

mitmproxy
mitmdump

pythonスクリプトを組み込む

mitmdumpで、-sの後に作成したスクリプトを指定することで、オーバーライドすることができます。

mitmdump -s path_to_script.py

例えば、以下の例ではurlにtestの文字列を含むリクエストのヘッダーのlanguageをtestに書き換えます。

def request(context, flow):
 index = flow.request.url.find('test')
 if index != -1:
     flow.request.headers["language"] = "test"

HTTPイベントメソッドオーバライド

mitmproxyでスクリプトを組み込む場合、既存のメソッドをオーバーライドすることで、任意の処理を加えることができます。よく使用する代表的なメソッドが以下4つです。

request(context, flow)

クライアントがリクエストをする直前にこのメソッドが実行されます。リクエストを取得・編集することができます。

response(context, flow)

サーバーから受け取ったレスポンスを取得・編集することができます。

responseheaders(context, flow)

このメソッドはサーバーからレスポンスヘッダを受け取った直後に実行されます。 response(context, flow)より前に実行されるため、レスポンスボディを受け取る前にレスポンスヘッダを書き換えることができます。

error(context, flow)

エラーが発生した場合にこのメソッドに入ります。エラー内容を取得・編集ができます。

まとめ

以上、mitmproxyで通信をキャプチャ・編集する方法をご紹介しました。
詳細はmitmproxyの公式サイトを参照してください! https://mitmproxy.org/