Slide 1

Slide 1 text

モバイルアプリ 開発者のための mitmproxy 入門

Slide 2

Slide 2 text

mitmproxy とは mitm (Man-in-the-Middle) proxy とは、 マンインザミドル型のプロキシである 通常のプロキシができることはだいたいできる 通信の傍受 通信の改竄 リプレイ モバイル向けのサポー トが手厚い Android / iOS / browser ssh 通信もサポー ト Wi-fi 接続時のみ使用可能

Slide 3

Slide 3 text

セットアップはとても簡単 1. mitmproxy を自分のマシンにインストー ルして起動 2. Android/iPhone のネットワー ク設定を変更してプロキシ に、 ステップ 1. で起動した mitmproxy の情報を指定 3. 端末のブラウザで http://mitm.it にアクセス 4. 対応するアイコンをタップして証明書をインストー ル

Slide 4

Slide 4 text

mitmproxy で できること

Slide 5

Slide 5 text

通信の傍受 端末が行っている通信を全部見られる `l' キー でフィルタリング URL だけでなく、 ヘッダやボディも指定可能 `F' キー でフォワー ディング・ モー ド

Slide 6

Slide 6 text

通信の改竄 `i' キー で intercept するパター ンを指定できる intercept した通信は、 リクエスト内容やレスポンス内容を 改竄可能 ボディだけでなく、 メソッドやヘッダも編集できる

Slide 7

Slide 7 text

リプレイ 一度行った通信を編集して、 もう一度通信することができ る 下の図は、mitmproxy のサイトに載っていた、 リプレイで ハイスコアを記録した例 ハイスコアが 2^31 - 1 = 2,147,483,647 になっている

Slide 8

Slide 8 text

スクリプト 通信内容の改竄などは、 手動でやらなくても、 スクリプト (Python) で自動化できる > mitmproxy -s "path_to_the_script [arg1] [arg2]..."

Slide 9

Slide 9 text

便利なスクリプト (1) レスポンス内容の強制置換 # -*- coding: utf-8 -*- def response(context, flow): path = flow.request.path if path.startswith('/1.0/getRecommendedArticles'): flow.response.replace("艦これ", "HOGEHOGE")

Slide 10

Slide 10 text

便利なスクリプト (2) 擬似的な不安定なネットワー ク ランダムにリクエストを kill して接続が切断された状態 を再現する # -*- coding: utf-8 -*- import random def start(ctx, argv): if len(argv) != 3: raise ValueError('Usage: -s "pseudo_unstable_network.py hostname percentage(0-10)"') # You may want to use Python's argparse for more sophisticated argument parsing. ctx.arg1, ctx.arg2 = argv[1], argv[2] def request(context, flow): host = flow.request.host if host.endswith(context.arg1) and random.randint(0, 10) <= int(context.arg2): context.log("Kill the request for %s. Host: %s" % (flow.request.get_url(), host)) flow.kill(context._master) > mitmproxy -s "./pseudo_unstable_network.py api.example.com 8"

Slide 11

Slide 11 text

mitmproxy を使った開発 通信内容の確認 クライアントとサー バー、 どちらに問題があるか調べる アプリ開発者以外もカジュアルに挙動を確認できる テスト 特定の条件を満たさないと発生しないようなリクエスト のテストをしたい 予期しないレスポンスが返ってきたときにアプリがクラ ッシュしないか調べる 通信が返ってこない、 途中で通信が切れるなどの不安定 な状況でアプリが正常に動作するか確認する

Slide 12

Slide 12 text

みなさんも mitmproxy で 快適なアプリ開発を!