見出し画像

Bypass SSL Pinningでアプリ版Twitterの通信を監視

急に、Bypass SSL Pinningでアプリ版Twitter(現X)の通信を監視したくなるときってありますよね

今回はAndroid版Twitterアプリの通信の解析を行います

一般に、SSL PinningされているアプリのHTTP通信は調べることはできませんが、Bypass することで調べることができます

主に参考にした記事はこちらです
https://4pfsec.com/ssl-pinning-bypass

筆者の環境は、MacBook Air M3チップ、Sonoma 14.4.1です


必要なもの

①Androidのエミュレータ

今回はAndroid Studioを使います。こちらからダウンロードしましょう

筆者はApple SiliconのためAndroid Studioしか使えませんが、皆さんは好きなエミュレータを使えば良いと思います

②Burp Suite

こちらからCommunity Editionをダウンロード

③Frida

pythonベースなので、pipでダウンロードできます

$ pip install frida
$ pip install frida-tools

それから、https://github.com/frida/frida/releasesから
・frida-server-xx.x.x-android-arm64.xz
・frida-gadget-xx.x.x-android-arm64.so.xz
の2つをダウンロード

両方解凍し、
前者は、frida-serverという名前に変えて適当な場所に
後者は、gadget-android-arm64.soという名前に変えて、~/.cache/frida/ に移動(無ければ作成)

root化

Google Playが入っているAndroid Studioのエミュレータはroot化されていませんので、root化します

エミュレータの起動

まずエミュレータを起動します
こちらの記事が参考になります

筆者は
・device Pixel 8 Pro
・image R arm64-v8a Android11.0 (Google Play)
を選びました
Android11以上でGoogle Playと書かれているものを選べば大丈夫だと思います。皆さんの環境に合わせて適宜変更してください

adbコマンドの準備

adbコマンドが使えるようにします。元から使える環境であればそのままで。Apple Siliconの方はこちらの記事が参考になります

$ adb devices

と実行し、実行中のエミュレータが表示されたらOKです

このとき、offlineの謎のデバイスが表示されることがあります(筆者は表示されました)
調べるとどうやら、Bypass SSL Pinning と全く関係ないのですが、音楽関係のソフトで表示されるようです?(真偽は不明、参考記事はこちら
気になる人は切っておきましょう(というか、adbコマンドを実行する際にいちいち -s でデバイスと指定しないといけないので切るべき)

rootAVDの実行

$ git clone https://github.com/newbit1/rootAVD.git
$ cd rootAVD
$ ./rootAVD.sh

を順に実行
Command Examplesがたくさん出てくるので、その中の

./rootAVD.sh system-images/なんちゃらなんちゃら/ramdisk.img

の行をコピーしてそのまま実行

実行が完了すると勝手にエミュレータの電源が落ちます(Yes/Noが出てきたらどちらでも良いのでクリック。数秒待てば勝手に消える)

実行が完了しない場合、エミュレータのAndroidのバージョンが高すぎる可能性があります

Android Studio の Device Manager に戻ってきたら、
3点リーダー > Cold Boot で起動します
再生ボタンから起動しようとしても、起動しませんでした

Magisk

起動すると「Magisk」というアプリがインストールされているので、起動します

起動するとすぐになんか出てくるので「OK」をクリックしてください
エミュレータが勝手に再起動します

super user になる

ターミナルに戻り、次のコマンドを実行

$ adb shell su

エミュレータ側になんか表示されるので、10秒以内に「GRANT」をクリック

これでめでたくroot化できました

Burp Proxyの設定

Proxy listenersの追加

Burp Suiteを起動し、Proxy > Proxy settingsと進む

「Proxy listeners」のaddをクリック、「Bind to port」は8080を、「Specific address」は192.168.x.xを選び、okをクリック
それから少し下にある「Import / export CA certificate」をクリックし、derファイルを適当な場所に保存します

エミュレータでのプロキシ設定

エミュレータの設定アプリ > Network&internet > Wi-Fi > 設定マーク > 右上の鉛筆
と進み、AndroidWifiの設定を開き、右上の編集マークをクリック

プロキシを手動
Proxy を Manualに
Proxy hostname を 192.168.x.x
Proxy port を 8080
にして保存

次に、ターミナルに戻り、次のコマンドを実行

$ adb push <先ほど保存したderファイルのパス> /sdcard/cacert.cer

エミュレータの設定アプリに戻り、「CA」と検索、少し下にある「CA Certificate」を選び、「Install anyway」をクリック。ファイルアプリのUIになるので、ハンバーガーメニューから端末名を選び、出てきた「cacert.cer」をクリックすると証明書がインストールされます

この時点で、Chromeアプリで適当なサイトを見ると、Burp Suite の「HTTP history」で通信が監視できているのがわかります

見えない場合、エミュレータのWi-Fiがいつの間にか切れているかもしれません。筆者もこれの現象に遭遇し、こちらのサイトを参考に設定し、再起動を何度か繰り返したら復帰しました

通常のHTTP通信は監視できるようになりましたが、Twitter は SSL Pinning されているので、さらに作業を進めていきます

Frida Serverの起動

$ adb push <frida-serverファイルのパス> /data/local/tmp/

を実行し、frida-serverファイルをエミュレータ内に移動

$ adb shell

でエミュレータ内のshellに入ります

su
cd /data/local/tmp/
chmod +x frida-server
./frida-server &

を順番に実行し、謎の数字(PID)が表示されたら成功です

SSL PinningをBypass

ようやく本題です

Google Play から Twitter(現X)をインストール

そして次のコマンドを実行

$ frida --codeshare masbog/frida-android-unpinning-ssl -U -f com.twitter.android -U

エミュレータ内で Twitter が立ち上がり、Burp Suite の HTTP history で通信内容が確認できます


お疲れ様です
最後までご覧いただきありがとうございました

この記事が気に入ったらサポートをしてみませんか?