AndroidのChrome 99以降の通信取得手順

AndroidのChrome99以降のバージョンから通信の取得手順が増えたので簡単にメモします。

※PortSwiggerの記事に下記の記載があるためroot権限が必要ない手順を取ります。
>In addition, you need to make further configuration changes in order to proxy HTTPS traffic from a Chrome browser that's at version 99 or above.
>For further information on how to perform these steps, you can refer to the following external links. Please note that we're not responsible for the content of these pages:
>
>出典: [Configuring an Android device to work with Burp Suite Professional](https://portswigger.net/burp/documentation/desktop/mobile/config-android-device)

## 検証環境

* Android 9
* Chrome 107.0.5304.91

## 手順

方法としてはChromeの起動オプションでBurpSuiteの証明書の透明性チェックを無効にすることで通信を取得できるようにします。

### Chromeの設定

- Chromeを開き`chrome://flags`にアクセス
- Search flagsから`Enable command line on non-rooted devices`と検索
- 設定を`Enable`に変更

これでChromeがコマンドラインファイルを読み込めるようになります。

![chrome-flags.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1994500/2d6c928d-5f89-97d4-de12-526ed95268f3.png)

### コマンドラインファイルの作成

- BurpSuiteからCA証明書をエクスポート
- 証明書の保存場所に移動して下記コマンドでSPKIフィンガープリントを取得
```shell
$ openssl x509 -in cacert.der -pubkey -inform der -noout | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | openssl enc -base64
```
- 取得した値を使って`chrome.txt`を作成
```chrome.txt
chrome --ignore-certificate-errors-spki-list=$SPKI_FINGERPRINT
```

※ファイル名は任意の名前で問題ありません。

### Android端末に送信

- `adb`コマンドでファイルをAndroid端末に送信
```shell
$ adb push chrome.txt /sdcard/
```
- 送信したファイルを以下に保存する
    - /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
```shell
$ adb shell cp /sdcard/chrome.txt /data/local/tmp/chrome-command-line
$ adb shell cp /sdcard/chrome.txt /data/local/tmp/android-webview-command-line
$ adb shell cp /sdcard/chrome.txt /data/local/tmp/webview-command-line
$ adb shell cp /sdcard/chrome.txt /data/local/tmp/content-shell-command-line
```
- Chromeが読み込めるように権限を変更
```shell
$ adb shell chmod 755 /data/local/tmp/chrome-command-line
$ adb shell chmod 755 /data/local/tmp/android-webview-command-line
$ adb shell chmod 755 /data/local/tmp/webview-command-line
$ adb shell chmod 755 /data/local/tmp/content-shell-command-line
```
:::note warn
変更
パーミッションを**555**から**755**へ変更しています。  
ファイルを書き換えるたびに削除するのが面倒なので。
:::

### Chromeの起動オプションの確認

- ファイルを送信後、Chromeを再起動
- `chrome://version`にアクセス
- コマンドラインにオプションが表示されているか確認
    - `--ignore-certificate-errors-spki-list=SPKI_FINGERPRINT`

![chrome-version.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1994500/9a58c0d0-52eb-fd2f-0b98-d56c0fd1beec.png)

※SPKI_FINGERPRINTの箇所はopensslコマンドで取得した値になります。

### BurpSuiteで通信の確認

Chromeの起動オプション設定後、BurpSuiteで通信が取れるようになっていると思います。

![burppp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1994500/0da011e7-8aab-da00-9a82-b1c76c7f5931.png)

## 一連の流れ

Chromeの設定以外はスクリプトにして実行したら簡単かと思います。

```shell:chromeflag.sh
# コマンドラインファイルの作成
SPKI_FINGERPRINT=`openssl x509 -in cacert.der -pubkey -inform der -noout | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | openssl enc -base64`
echo "chrome --ignore-certificate-errors-spki-list=$SPKI_FINGERPRINT" > chrome.txt

# Android端末へ送信
adb push chrome.txt /sdcard/
adb shell cp /sdcard/chrome.txt /data/local/tmp/chrome-command-line
adb shell cp /sdcard/chrome.txt /data/local/tmp/android-webview-command-line
adb shell cp /sdcard/chrome.txt /data/local/tmp/webview-command-line
adb shell cp /sdcard/chrome.txt /data/local/tmp/content-shell-command-line

# 権限設定
adb shell chmod 755 /data/local/tmp/chrome-command-line
adb shell chmod 755 /data/local/tmp/android-webview-command-line
adb shell chmod 755 /data/local/tmp/webview-command-line
adb shell chmod 755 /data/local/tmp/content-shell-command-line
```
:::note warn
変更
パーミッションを**555**から**755**にしています。  
ファイルを書き換えるたびに削除するのが面倒なので。
:::

## 参考記事

* [Android Chrome 99 expands Certificate Transparency, breaking all MitM dev tools](https://httptoolkit.com/blog/chrome-android-certificate-transparency/)
* [Configuring an Android device to work with Burp Suite Professional](https://portswigger.net/burp/documentation/desktop/mobile/config-android-device)
* [opensslコマンドで「unable to load certificate」とエラーが出る](https://www.mtioutput.com/entry/2019/01/07/120000)