🥚
AVD(Android 11)でOWASP ZAPの証明書をインストールする
はじめに
- Android 7.0(APIレベル24)にて、証明書の扱いが変更となりました。
- Android Developers Blog: Changes to Trusted Certificate Authorities in Android Nougat
- → Android 6.0(APIレベル23)以前でのカスタム証明書インストール方法が使用できなくなりました。
- 現在のAndroidバージョン別シェアを確認すると、Android 7.0(APIレベル24)以上のシェアが約75%となっています。
-
古いバージョンでの動作確認や診断は現実の運用にそぐわないものとなりつつあります。
-
→ Android 7.0(APIレベル24)以上を使用して診断できるようにするため、まずスマートフォンからの通信をOWASP ZAPなどのプロキシツールで中継できるようにする必要があります。
# 今回の構成 AVD < -- > OWASP ZAP(プロキシツール) < -- > サーバ
-
想定環境
- Android Virtual Device
- Android Studioを準備して、AVD Managerから作成
- Android 11
- OWASP ZAP 2.10.0
作業手順
- AVDを予め作成しておきます。
- 作成方法は、こちらを参考ください。
- FirdaでAndroid APKをHookingする
- AVDを起動後、「セキュリティ > 画面ロック」から、ロック解除用のPINコードを設定しておきます。
- OWASP ZAPを開き、「オプション > ダイナミックSSL証明書」へ移動し、OWASP ZAPのルートCA証明書を出力します。
- 下記のコマンドを実行して、AVDを実行します。
# $ANDROID_HOME="/Users/<user-name>/Library/Android/sdk
$ANDROID_HOME/emulator/emulator -avd Pixel_4a
-
emulator
をパスに通して、直接emulator
コマンドを実行してもOKです。export PATH=$ANDROID_HOME/emulator:$PATH
- パスを通す場合、
/tools
配下のemulator
ではなく、上記のように/emulator
配下のemulator
にします。
- パスを通す場合、
- 起動したAVDにて、「設定 > セキュリティ > 暗号化と認証情報 > 信頼できる認証情報」を表示して、「OWASP Root CA」がシステムタブに表示されていないことを確認します。
5.「設定 > ネットワークとインターネット > Wi-Fi」を開き、現在接続しているWi-Fiの歯車アイコンをタップします。
- 鉛筆アイコンをタップして詳細設定画面を開き、「詳細設定」を開きます。
- 下記の設定をし、「保存」ボタンをタップします。
- プロキシ:手動
- プロキシのホスト名:10.0.2.2
- プロキシポート:18080
- OWASP ZAPの「オプション > ローカルプロキシ」を開き、下記の設定をし、「保存」ボタンをクリックする
- アドレス:localhost
- ポート:18080
- AVD上でブラウザを開き、
https://www.google.co.jp
へアクセスします。
- AVD上では、下記の画像のように、証明書エラー画面が表示されます。
- OWASP ZAP上では、http接続の通信ログが表示されます。
- 下記のコマンドを実行して、証明書の発行者のハッシュ値を取得します。
openssl x509 -inform PEM -subject_hash_old -in owasp_zap_root_ca.cer | head -1
- 8.で取得したハッシュ値を使用して、証明書ファイル名を変更します。
cp owasp_zap_root_ca.cer <hash>.0
- 1度AVDを終了し、下記のコマンドを実行して、再度実行します。
$ANDROID_HOME/emulator/emulator -avd Pixel_4a -writable-system
-
writable-system
オプションの詳細は、下記を参照してください。
- 下記のコマンドを実行して、AVDの
/system
配下へ書き込みできるようにします。
adb root
adb shell avbctl disable-verification
adb disable-verity
adb reboot
adb root && adb remount
-
下記のコマンドを実行して、
/system
配下が書き込みできるようになっているかを確認します。adb shell mount | grep system /dev/block/dm-1 on /system_ext type ext4 (ro,seclabel,relatime) overlay on /system_ext type overlay (rw,seclabel,noatime,lowerdir=/system_ext,upperdir=/mnt/scratch/overlay/system_ext/upper,workdir=/mnt/scratch/overlay/system_ext/work,override_creds=off) overlay on /system type overlay (rw,seclabel,noatime,lowerdir=/system,upperdir=/mnt/scratch/overlay/system/upper,workdir=/mnt/scratch/overlay/system/work,override_creds=off)
- 9.で作成した証明書をAVDへ転送します。
adb push <hash>.0 /system/etc/security/cacerts
- 下記のコマンドを実行して、転送した証明書ファイルの権限を変更します。
adb shell "chmod 644 /system/etc/security/cacerts/<hash>.0"
- 下記のコマンドを実行して、AVDを再起動します。
adb reboot
- 再起動時は、writable-system`オプションが有効となっているため、1度AVDを終了して、3.のコマンドを再度実行します。
- ※ 3.のコマンドを実行した結果、「OWASP Root CA」証明書が表示されない場合、10.のコマンドを実行して確認します。
- 起動したAVDにて、「設定 > セキュリティ > 暗号化と認証情報 > 信頼できる認証情報」を表示して、「OWASP Root CA」がシステムタブに表示されることを確認します。
- 6.と同様にブラウザを開き、OWASP ZAPで通信を取得できているかを確認します。
補足
emulator
コマンド実行時、PANIC: Missing emulator engine program for 'x86' CPU
が出た場合
- Android SDKの
tools
系のパスがemulator
より早くが読み込まれると発生します。-
→ パスや環境変数の順番を変更し、
emulator
のパスがtools
より上になるように記載します。export ANDROID_HOME=/Users/<username>/Library/Android/sdk # emulatorコマンドのパス export PATH=$ANDROID_HOME/emulator:$PATH # adbコマンドなどのパス export PATH=$ANDROID_HOME/platform-tools:$PATH
-
参考
- Dynamic Mobile App Security Testing (DMAST) with Android Emulator OWASP ZAP | by Alex Myers Security Engineer | Medium
- How to configure Burp Suite proxy with an Android emulator? | by secabit | Medium
- Install Burpsuite’s or any CA certificate to system store in Android 10,11 and Kali linux. | by n00🔑 | Medium
- アプリの通信内容を確認する(Android7以降) - kapieciiのブログ
- android - adb remount fails - mount: 'system' not in /proc/mounts - Stack Overflow
- PANIC: Missing emulator engine program for 'x86' CPU. - idubmorganのブログ
Discussion