android13でパケットキャプチャをする(TLS復号もあるよ!)
この記事の目的
- androidでパケットキャプチャをする方法をまとめます
- Fiddlerを使います
- TLSの復号もできるのでhttps通信の中身を参照できます
注意
- この記事に書いてあることはすべて自己責任で行ってください
環境(使うもの)
- Pixel 5a(OSはandroid 13)
- ノートパソコン(fiddlerが使えれば何でもよいですが、私はwindows11を使いました)
- fiddler classic
パケットキャプチャ時の構成は以下のような感じです
試してないですが、Fiddlerの代わりにBurpを使うこともできるはずです。
Wiresharkはパケットキャプチャの仕方が違うのでこの方法は使えません。
手順
1. Pixel 5aの購入
今回の方法ではandroid端末にFiddlerのルート証明書をインストールする必要があります。
ルート証明書インストールには端末のroot化が必要なのですが、root化するとデータが初期化されるのでパケットキャプチャ専用の端末を買いに行きましょう。
機種や販売元のキャリアによってroot化ができたりできなかったりするので、購入の際は注意してください。
2. Magiskによるroot化
MagiskでPixelをroot化します。
やり方はネット上に転がっているので各自調べてみてください。
私は以下のサイトを参考にしました。
3. Magiskモジュールのインストール
"MagiskTrustUserCert"というMagiskモジュールをインストールします。
-
以下のgithubのリリースから最新のモジュール(ZIPファイル)をダウンロードする
https://github.com/NVISOsecurity/MagiskTrustUserCerts -
ダウンロードしたZIPファイルを、Magiskにインストール
-
端末再起動
-
Magiskを開き、以下の画面のようになっていればOK
4. FiddlerをPCにインストール
特筆すべき点なし。ググってください
5. Fiddlerの設定変更&ルート証明書のダウンロード
-
HTTPS復号化設定&ルート証明書ダウンロード
以下画像の赤枠の"Decrypt HTTPS traffic"にチェックを入れた状態で、"Export Root Certificate to Desktop"をクリックし、ルート証明書をPCにダウンロードします。
最後に"OK"をクリックして設定を保存してください。
-
リモートデバイスからの通信を許可する
デフォルトだとPixelからFiddlerへの接続は許可されていません。
赤枠の"Allow remote computers to connect"にチェックを入れ、設定を保存してください。
6. ルート証明書をPixelに転送し、インストールする
ダウンロードしたFiddlerのルート証明書をUSB接続などでPixelにコピーしてください。
その後、設定アプリから証明書のインストールを選択し、コピーした証明書ファイルをインストールします。
インストールすると信頼できる認証情報のユーザ証明書一覧にFiddlerの証明書が追加されます。
パケットキャプチャをするには、この証明書をシステム証明書に追加しなくてはいけません。
先ほど追加したMagiskモジュールは再起動時にユーザ証明書をシステム証明書にコピーしてくれるモジュールなので、端末を再起動していきます。
7. 端末再起動
Pixelを再起動します。
再起動が完了すると自動でシステム証明書一覧にFiddlerの証明書が追加されているはずです。
8. Pixelでプロキシを設定
Fiddlerはプロキシとして動作するツールです。
なのでPixelからの通信がFiddlerに送信されるようにネットワークを設定します。
- PCでモバイルホットスポットを有効化する(windowsの場合)
- PixelのWi-Fiを、有効化されたモバイルホットスポットに接続する。
- 「ネットワークの詳細」画面の右上のペンマークをタップする。
- 以下の通り設定を変更する
・プロキシを「手動」に変更。
・「プロキシのホスト名」にFiddlerをインストールしたパソコンのIPアドレスを入力。
・「プロキシポート」に「8888」を入力。
- 設定を保存
- 以下の方法でPixelからFiddlerに接続できることを確認
・ブラウザを開いてhttp://[IPAddressofFiddlerHostMachine]:8888 にアクセスする
・「Fiddler Echo Service」という画面が表示されればOK
以上で準備完了です。
ブラウザのパケットキャプチャしてみる
試しにyahooのサイトにアクセスしてみます。
- Chromeでyahooにアクセスする
- 証明書エラーが出るので、詳細設定からアクセスを許可してください。
- Fiddler上でyahooにアクセスしている通信を見つけます。(以下の画像の2行目)
ダブルクリックすると右枠が表示されます。この時点ではまだ復号化がされていないので、"Respond body is encoded. Click to decode"をクリックします
- 復号が行われて、htmlのソースが表示されます
アプリのパケットキャプチャはできたりできなかったりする
ブラウザの場合は手元の操作で証明書エラーを回避できますが、アプリの場合はそれができず、通信がエラーになることがあります。
回避方法は不明です。
別解(ルート証明書インストール)
今回の記事の肝は、手順3の"MagiskTrustUserCert"モジュールのインストールです。
このモジュールのおかげで、手順6で再起動をすると証明書が勝手にシステム証明書としてコピーされます。
この方法がダメになった場合に備えて別解をメモしておきます。
1. Magiskモジュール(magic_overlayfs)のインストール
"magic_overlayfs"というMagiskモジュールをインストールします。
このモジュールを入れると、roでマウントされている/systemをrwでマウントしなおすことができます。
権限なしで
-
以下のgithubのリリースから最新のモジュール(ZIPファイル)をダウンロードする
https://github.com/HuskyDG/magic_overlayfs -
ダウンロードしたZIPファイルを、Magiskにインストール
-
端末再起動
-
Magiskを開きモジュールが有効になっていることを確認する
-
以下の記事を参考に/systemをマウントしなおし、Fiddlerの証明書を/system/etc/security/cacertsにコピーする
https://zenn.dev/sakura/articles/be97266e4c8bf6cb7b15
以上で証明書のインストールができるはずです。
モジュールの使い方については以下動画を見るとよいです
失敗した方法
パケットキャプチャの方法を模索する中で、ダメだった方法を記録しておきます。
- tPacketCaptureを使う
- "android パケットキャプチャ"でググると上の方に出てくるアプリ
- httpsの復号化はできない
- モジュールを使わずに、単純に
mount -o rw,remount /system
でマウントしなおす- エラーになりました
- 別のパスをバインドさせてマウントしなおす
- 以下のリンク先の方法
- エラーになりました
- adbコマンドで証明書をプッシュする
- 以下のリンク先の方法
-
adb root
の時点でエラーになり断念- 以下の記事に
adb root
を有効化する方法がありましたが未検証です - https://liwugang.github.io/2021/07/11/magisk_enable_adbr_root.html#实现
- 以下の記事に
未検証の方法
成功も失敗もしていない未検証の方法を以下に記録しておきます。
- PCAPdroidを使う
- root権限なしでTLS復号ができるパケットキャプチャアプリ。
- 日本では配信されていないため未検証。
- ドキュメントを見る限りかなり便利そう。
- キャプチャしたデータをWireshrakに読み込ませることも出きるっぽい。SSLKEYLOGFILEのデータも出してくれるようなのでWiresharkに読み込ませたデータのTLS復号もできるはず。すごい
- SystemRWを使う
- 5chに書いてあった方法
- やり方がよくわからなかったので未検証
余談
今回記事を書こうと思ったきっかけは以下のzennの記事です。
この記事の通りなら結構簡単にandroidのパケットキャプチャが出来そうだな~と思いました。
実際はこの時よりセキュリティ周りが固くなっているようでかなり苦戦しましたが。
あと、16歳でこの記事書けるのシンプルにすごくないですか?
負けてられないなと思って頑張りました。
Discussion