mitmproxy で iOS Simulator の HTTPS 通信を覗き見る
動機
アプリWebViewで自社製サードパーティーJSが不具合を引き起こしているとき、
- アプリでどんな通信が行われているか確認したい!
- 配信されているSDKをローカルのアプリ内でだけ改竄して、本番環境の動作を変えることなく動作検証を行いたい!
というケースがある。
アプリWebViewだと結構難しいので、簡単に検証できるようにしたい。
最終目標
- iOS Simulator から行われる通信について、暗号化される前の HTTPS 通信の内容を確認できるようにする
- iOS Simulator のリクエスト・レスポンスを改竄し、読み込まれる HTML, JS, CSS などをローカルのファイルと差し替えられるようにする。
方針
mitmproxy を使ったリクエストのオーバーライドで実現できるはず。
これを試してみる。
この記事でやること
この記事ではアプリの HTTPS 通信を mitmproxy 経由に変更し、暗号化される前の通信を覗き見るところまでやってみる。やることリストは以下。
- ローカルPCにて
mitmproxyの環境構築を行う - iOS Simulator 側で証明書の設定を行う
- iOS Simulator 経由で HTTPS 通信を行い、通信の内容を覗き見ることができるかチェックする
参考記事
ローカルPCにプロキシサーバを構築
ref. https://docs.mitmproxy.org/stable/overview-getting-started/
brew install mitmproxy
ブラウザを起動できるかチェック
mitmweb
ローカルPCから http://localhost:8081/ へアクセス

OK。
CLIも起動する。
mitmproxy

OK。
以降の作業は mitmweb を立ち上げたまま行う。
iOS Simulator への証明書インストール
証明書インストールは最初の一回だけやればOK。
https://zenn.dev/ankou/scraps/57976c577cbe5a を参考にセットアップした。基本詰まることはなかった(感謝!)
以下は細かいところでやり方が分からずハマった点。
ハマった点メモ
- Python2系のinstallの時には2.7.18をインストールすると良さげ
- 2.7.0をインストールすると自分の環境ではビルドエラーで失敗。2.7.18 はすんなり入った。(Python 2.7.18 は asdf 経由でインストール)
- macOS のキーチェーンに登録する証明書は macOS 用の証明書。
- iOS 用ではないので注意。
- キーチェーンアクセスで証明書を信頼する手順
- 右クリックメニュー > 情報を見る > 信頼 > この証明書を使用する時 > 常に信頼
Note
iOS のプロキシ設定を行わずに http://mitm.it/ にアクセスすると、以下のような画面が表示される。
Wi-Fiのプロキシ設定は http://mitm.it/ へローカルホスト経由で通信させる意味がある。

通信を捕捉できているか確認する
このセクションでは mitmproxy 側でリクエストを捕捉できるようになったか確認していく。
まずPC側でGUIを立ち上げる。
mitmweb
Note: mitmweb だけ立ち上げればOKな様子。 mitmproxy の立ち上げなしで以降の動作チェックは行うことができた。
PCで http://127.0.0.1:8081/ を開き、タブから Flow を開いておく。この時点では通信ログがない。

続いて、 iOS Simulator の Safari で適当なhttp通信を行うページを開く。今回は http://mitm.it/ を開いた。この通信ログが表示できていれば期待動作。
Flow を確認すると、通信の内容が捕捉できていた。

最後に本命のプロトコル https の通信を覗き見ることができるか試す。
https://www.tbs.co.jp/johnson_tbs/ を開いた結果は次で、通信の内容が暗号化されずに閲覧できた。

これで期待通り通信内容を閲覧できていることが確認できた。
※httpsの場合に暗号後の通信が表示されてしまう場合、ネットワークのHTTPSのプロキシ設定がONになっていないことが原因。
Wi-Fi などからネットワーク設定を開き、詳細設定 > プロキシ > 保護されたWebプロキシ(HTTPS)に サーバ: localhost, ポート: 8080を入力して、ブラウザをリロードするとうまくいく。
mitmproxy へのデータ送信を OFF にするには
使い終わったらWi-Fiのプロキシ設定をHTTPとHTTPSの両方でOFFにしておけば、mitmproxy側を経由しなくなり、mitmproxy側で通信内容を収集できなくなる。
プロキシの設定をOFFにしても即座にmitmproxyを経由しなくなるわけではない様子なので、センシティブな通信を含むときはちょっと気をつけて使ったほうがいいかも。
まとめ
mitmproxy で簡単に iOS Simulator の HTTPS 通信の中身を見ることができた。
次にやること
通信を改竄して読み込まれるファイルを変更してみる。別の記事で実験する。
参考にする記事: mitmproxyを使用してデータを改ざんする
