🥚

今度こそAndroid端末からプロキシツールで通信を取得したい

2022/12/21に公開

今度こそAndroid端末からプロキシツールで通信を取得したい

注意事項

  • 本手順は、あくまで自身の環境下で現象回避のために実施した手順のメモとなります。
    • 環境依存の問題などの可能性もあるため、本記事を参考される場合はご留意ください。

背景

  • 前回、この記事にて、Chrome上の通信をプロキシツールで取得できるようにした。
  • Appの通信とブラウザの通信取得が排他になる、バージョンアップなどで正常に動作しないパターンがあったため、より良い回避策を考える。

前提(検証環境)

  • 前回記事を参考ください。
    • OWASP ZAP:v2.12.0
    • Burp Suite Community Edition:v2022.12.4

そもそもどうして取れなくなった?

  • 前々回記事の通り、Android版Chrome v99にて、「Certificate Transparency(証明書の透明性)」が全ユーザへ適用されるようになりました。
  • → Burp SuiteなどのプロキシツールのCA証明書の場合、これにより、不正な証明書(証明書の透明性に問題あり)とChrome側が判断するようになりました。

今回の対策

  • 前回は、(Root化前提で)システム証明書とユーザ証明書を両方導入、システム証明書側のBurp Suite証明書を切ることで対応していました。
    • 最近は、それだと別の証明書エラーになることが確認されました。
  • 今回は、Chrome側の設定を修正して、例外処理を設けさせることで対応します。
    • セキュリティレベルを意図的に下げるため、内容を理解した上で実施します。
  1. Burp Suite/OWASP ZAPから、プロキシ証明書を取得します。
  2. 下記のコマンドを実行し、プロキシ証明書のSPKIフィンガープリント値を取得します。
    • Burp Suite
      openssl x509 -in <burp_ca_file.der> -pubkey -inform der -noout | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | openssl enc -base64
      
    • OWASP ZAP
      openssl x509 -in <zap_ca_file>.cer -pubkey -noout | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | openssl enc -base64
      
  3. 下記のファイル(chrome_patch.txt)を新規作成し、2.で取得したフィンガープリント値を記載します。
    chrome --ignore-certificate-errors-spki-list=<spki_fingerprint>
    
  4. Android端末とホスト端末をadbコマンドで接続し、下記のコマンドを実行します。
    adb push chrome_patch.txt /storage/self/primary/Download/
    
  5. Android端末のシェルへ入り、下記のコマンド群を実行していきます。
    hammerhead:/ $ su
    hammerhead:/ # cp /storage/self/primary/Download/chrome_patch.txt \
                      /data/local/chrome-command-line
    hammerhead:/ # cp /storage/self/primary/Download/chrome_patch.txt \
                      /data/local/android-webview-command-line
    hammerhead:/ # cp /storage/self/primary/Download/chrome_patch.txt \
                      /data/local/webview-command-line
    hammerhead:/ # cp /storage/self/primary/Download/chrome_patch.txt \
                      /data/local/content-shell-command-line
    hammerhead:/ # cp /storage/self/primary/Download/chrome_patch.txt \
                      /data/local/tmp/chrome-command-line
    hammerhead:/ # cp /storage/self/primary/Download/chrome_patch.txt \
                      /data/local/tmp/android-webview-command-line
    hammerhead:/ # cp /storage/self/primary/Download/chrome_patch.txt \
                      /data/local/tmp/webview-command-line
    hammerhead:/ # cp /storage/self/primary/Download/chrome_patch.txt \
                      /data/local/tmp/content-shell-command-line
    
  6. 続けて下記のコマンド群を実行し、5.でコピーしたフラグファイルをChrome起動時に読み込めるようにします。
    hammerhead:/ # chmod 555 /data/local/chrome-command-line \
                             /data/local/android-webview-command-line \
                             /data/local/webview-command-line \
                             /data/local/content-shell-command-line                                                                                                                                                  
    hammerhead:/ # chmod 555 /data/local/tmp/chrome-command-line \
                             /data/local/tmp/android-webview-command-line \
                             /data/local/tmp/webview-command-line \
                             /data/local/tmp/content-shell-command-line 
    
  7. Android端末でChromeを起動し、chrome://flagsを開きます。
  8. 「Enable command line on non-rooted devices」を検索し、設定値を「Enabled」に変更します。
    • 「Relaunch」ボタンが表示されますが、一旦無視します。
  9. 下記のコマンドを実行し、Chromeを強制終了します。
    hammerhead:/ # am force-stop com.android.chrome
    
  10. もう1度Chromeを起動し、chrome://versionを開きます。
    • 「コマンドライン」の先頭に、3.で設定したフラグがあれば、設定完了となります。
  11. Android端末とプロキシツールを接続し、HTTPSのサイトを表示します。
    • Chrome

    • AndroGoat

参考

Discussion