ワンクリックMITMキャプチャ

MITM ワンクリックキャプチャ機能により、デバイス上でグローバルな中間者キャプチャを全自動で開始できます。他の一般的なツールと比較して、MITM証明書のインストールプロキシ設定 などの手間がなく、システムバージョンが異なることによるキャプチャ方法の違いを心配する必要もありません。さまざまな Android バージョンに対応しており、すべて処理済みです。さらに、リアルタイムのパケット改変と傍受もサポートします。

また、キャプチャ成功率も一般的なソフトウェアより高くなっています。アプリケーションの HTTP/HTTPS トラフィックを傍受できます。スクリプトは MITM キャプチャを自動的に有効化・無効化し、スクリプト終了後はデバイスとネットワークが即座に元の状態に復元されるため、追加設定は一切不要です。同時に、スクリプトは 海外向け MITM キャプチャにも対応しており、上流プロキシを指定することで海外アプリケーションのキャプチャも容易に行えます。

注目

ご使用のOSにかかわらず、キャプチャを確実に成功させるために、開始前に ネットワークファイアウォール を一時的に完全に無効化してください。

事前準備

まず、現在のPCとデバイスが同一ネットワークセグメントにあるか、USBで接続されていることを確認してください。以下では、FIRERPA が実行されているモバイルデバイスの IP を 192.168.0.2 と仮定します。次に、PC側で ツール準備 を正しく完了し、コマンドラインで mitmproxy が正常にインストールされていることを確認してください(ターミナルで mitmdump を実行して確認できます)。

Python 環境がなく、クローンや依存管理に慣れていない場合は、リリースページから startmitm.exe をダウンロードできます。これは startmitm.py のパッケージ版であり、Python をインストールしなくてもキャプチャを実行できます。このコンソールプログラムのコマンド引数は startmitm.py と同じです(このファイルはウイルス対策ソフトに誤検出される可能性があるため、使用するかどうかはご自身で判断してください)。

基本的なキャプチャ

ヒント

キャプチャ対象のアプリケーションが SSL PINNING(証明書固定)を使用しているか、QUIC プロトコルを使用している場合、いずれもキャプチャの効果に影響を与える可能性があります。当ツールは自動的に QUIC ダウングレードを強制しますが、フォールバックハンドシェイクの時間により、アプリケーションが一時的にカクつくことがありますので、しばらくお待ちください。アプリケーションが証明書固定を採用している場合、直接キャプチャすることはできません。その場合は、リバースエンジニアリングと Frida スクリプトを用いて SSL PINNING ロジックを回避する必要があります。

次のコマンドで簡単にキャプチャを開始できます。

python3 -u startmitm.py 192.168.0.2

キャプチャを終了するには、Ctrl+C を一度押すだけです。

共有キャプチャ

LAN 内の仲間と一緒に分析したい場合は、次のコマンドを実行します。相手側のブラウザで http://あなたのIPアドレス:7890 にアクセスすると、同じキャプチャ画面が表示され、一緒に簡単に分析できます。

python3 -u startmitm.py 192.168.0.2 --web-port 7890 --web-host 0.0.0.0

特定のアプリケーション

システム全体のトラフィックではなく、特定のアプリケーションのトラフィックのみを傍受したい場合は、IP アドレスの後に :パッケージ名 を付加します。以下の例では、com.some.package のトラフィックのみを傍受します。

python3 -u startmitm.py 192.168.0.2:com.some.package

リアルタイム変更

アプリケーションのリクエストやレスポンスデータをリアルタイムで変更できます。この機能は mitmproxy のイベントフックに基づいて実装されています。mitmproxy の API に従って、独自のフックスクリプトを作成する必要があります。フックスクリプトの作成方法については、mitmproxy 公式ドキュメント docs.mitmproxy.org/stable/addons-examples およびサンプルコード mitmproxy/examples/contrib を参照してください。

作成したフックスクリプトが http_flow_hook.py だと仮定し、次のコマンドでそのスクリプトを適用します。

python3 -u startmitm.py 192.168.0.2 -s http_flow_hook.py

異なるネットワーク

お使いのスマートフォンと現在のPCが同一ネットワークにないが、デバイスに物理的にアクセスできる場合は、USB ADB 経由でキャプチャすることも可能です。デバイスが USB ADB でPCに接続され、正しく認証されていることを確認してください。

PC に ADB デバイスが1台だけ接続されている場合は、次のコマンドを実行します。localhost はその ADB デバイスに対するキャプチャを意味します。

python3 -u startmitm.py localhost

複数の ADB デバイスが接続されている場合は、デバイスのシリアル番号を指定する必要があります。シリアル番号は adb devices の出力から取得できます。

python3 -u startmitm.py localhost --serial bfde362

さらに厳しいネットワーク環境、例えばスマートフォンとPCが同一ネットワークになく、物理的にも触れられないが、FIRERPA のポートにアクセスできる場合もキャプチャ可能です。よくあるシナリオとして、内蔵の frp サービスを使用して FIRERPA をリモートサーバーに転送する場合、あなたと FIRERPA の間には1つのポートのみが直接接続可能で、他のポートは相互に通信できません。スマートフォンはローカルのどのポートにもアクセスできず、ローカルもスマートフォンの FIRERPA ポートにしかアクセスできません。そのような場合は以下の方法を取ります。

まず、adb_pubkey.py を使用するか、API を呼び出して、ローカルの ADB 公開鍵をデバイスにインストールします。インストールが完了したら、connect を実行します。ここで x.x.x.x はデバイスのポート 65000 に接続可能な IP アドレスです。実際の環境に合わせて変更してください。

adb connect x.x.x.x:65000

その後、次のコマンドを実行するだけです。

python3 -u startmitm.py localhost

複数の ADB デバイスがある場合も同様に、--serial パラメータには ADB connect のアドレス(例: x.x.x.x:65000)を指定します。デバイスのシリアル番号ではありません。

python3 -u startmitm.py localhost --serial x.x.x.x:65000

上流プロキシ / 海外キャプチャ

startmitm 自体は mitmproxy をプロキシサービスとして起動します。デフォルトでは、すべてのトラフィックは mitmproxy からローカルのネットワークインターフェースを通じて送出されます。トラフィックをローカルから直接送出するのではなく、上流プロキシ経由で送出したい場合は、上流プロキシを指定できます。ただし、HTTP プロトコルの上流プロキシのみをサポートしています。同時に、DNS 汚染を避けるため、TCP クエリをサポートする上流 DNS も指定する必要があります。

python3 -u startmitm.py 192.168.0.2 --upstream http://127.0.0.1:7890 --proxy-dns 8.8.8.8

上流 HTTP プロキシに認証が必要な場合は、USER:PASSWORD を適宜置き換えてください。

python3 -u startmitm.py 192.168.0.2 --upstream http://USER:PASSWORD@x.x.x.x:8080 --proxy-dns 8.8.8.8

これにより、デバイスのトラフィックは上流プロキシ経由で送出され、デバイスのすべての DNS クエリはプロキシ経由で 8.8.8.8 に送信されます。