mitmproxy で通信を見る
開発中の悩み
アプリケーションやSDK、Webサイトの開発中にAPIが正常に動作しているかをチェックしたいことがよくあります。特にリリースビルドをしたアプリケーションやSDKが正常に動作しているのかをログの出力を行わずに確認したい欲求が生じます。
通信が正常に動作しているかの不安・疑問を解消するには実際に行われている通信内容をチェックできれば解決します。じゃあ早速覗いてみましょう。tとはいうものの、よほどのハッカーでもない限り自力で通信の中身を見ることは難しいです。そこで役に立つのがタイトルに記載している mitmproxy です。具体的にどうすればみることができるのかを下の方で説明します。
mitmproxy
mitmproxy is a free and open source interactive HTTPS proxy.
mitmproxy は、無料でオープンソースのインタラクティブな HTTPS プロキシです。
名称の成り立ちは、
MITM + proxy
となっています。
HTTP / HTTPS プロキシとは
mitmproxy が一体何者なのかを説明します。そのためにはまず HTTPS プロキシの正体を知る必要があります。
プロキシとは「代理」を意味する単語で HTTP 通信の代理になるもの。
HTTPSの場合は、プロキシサーバはルータのようにパケットの転送だけを行います。
じゃあ見れないじゃん。ってなりますが、それを解消したのが mitmproxy です。
HTTPとHTTPSの違い
さらにプロキシを知る前に HTTP と HTTPS の違いを知っておく必要があります。
HTTP と HTTPS の違いはなんでしょうか?
「S がついているかついていないか!」。
つまんねーこと聞くなよ!
と蕪羅亭魔梨威さんの言葉を借りつつ、真面目に説明します。
HTTP
HTTPは通信プロトコル(規約みたいなもの)で約30年前に登場したもの。
HTTP は平文で通信を行うので簡単に傍受・改ざんが可能です。各通信キャリアで通信の最適化という改ざんがHTTPでは実施されていました。
過去に Softbank がhttpで送信されていた画像を非可逆圧縮し騒ぎになったことがあります(ハッシュの不一致によるエラー)。
HTTPS
Hypertext Transfer Protocol Secure
SSL/TLSプロトコルによって提供されるセキュアな接続の上でHTTP通信を行います。
HTTPと異なり暗号化されているため簡単に覗けないです。
最近は HTTPS で通信するのが一般的になってきたのもあって先程の通信の最適化が行われることもなくなってきています。
通信会社も手出しができないセキュリティを突破するために登場したのが HTTPS プロキシ を間に挟んでやりとりをする方法です。
HTTP プロキシの挙動
HTTP の挙動は非常に簡単です。リクエストを横流しするだけで通信の中身をチェックすることができます。
1. GETリクエスト
2. リクエストを転送
HTTPS プロキシの挙動
HTTPS の場合は、HTTPと異なり、間に入って証明書の作成等が必要なのでやりとりが増えます。
1. 接続要求
2. 接続の確立
3. TLS接続を開始 SNIで接続先のホスト名を提示
4. mitmproxy が受け取ったSNIでTLS接続を開始
5. 偽証明書を作成するための CN & SAN 値を含む証明書で応答
6. mitmproxy が偽証明書を生成し、TLSハンドシェイクを続行
7. 確立されたTLS接続でリクエスト
8. mitmproxy は手順4で開始したTLS接続でリクエスト
mitmproxy を実際に使う
さて、mitmproxy を実際に使ってみましょう。
Macの環境設定
今回はMacとiPhoneを利用した環境設定を紹介します。
動作環境
Mac
macOS Catalina 10.15.2
iPhone
iPhone7 iOS 13.3
インストール
Mac であれば Homebrew でインストールできます。
brew install mitmproxy
Wi-Fi 設定
PCを経由してスマートフォンが通信を行えるように設定します。
まず、"ネットワーク"環境設定を開き、Mac のIPアドレスを確認します。
確認したIPアドレスをMacで利用しているWi-Fiと同じものに切り替えてから設定します。ついでにポートも設定しましょう。
実行
mitmproxy -p 9999
iOS の環境設定
HTTPプロキシの設定後に下記へアクセス。
証明書がプラットフォームごとに配置されているのでインストールする。 *
Android の環境設定
Android 7以降では root を取得し ProxyDroid を入れると動きます。
やることはだいたい同じなので割愛。
iPhone の Safari で https://supership.jp/ にアクセス
今回は favicon の通信をチェックしてみましょう。
という感じの内容が閲覧できます。
Python で自動化可能(mitmdump)
URL に hogefuga が入っている通信の情報だけを取得するスクリプト
from datetime import datetime
def response(flow):
if flow.request.pretty_url.find("hogefuga") != -1:
with open("response/" + datetime.now().strftime("%Y%m%d-%H%M%S-") + flow.request.path.split('/')[-1],"wb") as f:
f.write(flow.response.content)
実行
mitmdump -s hogefuga.py
法律違反じゃないの?
不正アクセス行為の禁止等に関する法律
第三条 何人も、不正アクセス行為をしてはならない。
(他人の識別符号を不正に取得する行為の禁止)
本人です。
昭和二十三年法律第三十九号
軽犯罪法
第一条 左の各号の一に該当する者は、これを拘留又は科料に処する。
二十三 正当な理由がなくて人の住居、浴場、更衣場、便所その他人が通常衣服をつけないでいるような場所をひそかにのぞき見た者
Webは通常衣服をつけないでいるような場所ではありません。
というか服を着てください。
mitmproxy を使ったことで生じたメリット
● 通信内容が見れて楽しい
● 作成したアプリ・SDKが正しく実装されているかどうかを通信内容と
アクションを対応付けて確認できる
● アプリの通信内容を見て、アプリの改善案を提案できる
● テストでリクエストを変更したり、再送して自動化できる
mitmproxy を使ったことで生じたデメリット
● 自分の中にある倫理観との戦いが生まれる
● 他アプリがバックグラウンドでトラッキングしていることがわかる
● 発生したパケット量を見て悲しくなる
mitmproxy は特効薬にも毒にもなるツールなので用法用量は正しく守りましょう。