【Windows10】証明書ピンニングのバイパスしつつAndroidアプリの脆弱性診断

## はじめに

脆弱性診断していて、証明書ピンニングでAPIの診断ができなかったアプリがあったのがきっかけです。
証明書ピンニングの解除ができなかったためバイパス手段を探して無理やり診断した時の手順の纏めです。
基本はMacでも同じで、コマンドを適宜変えれば行けるはずです。
iOSは未検証です。
悪用しないようにお願いします。

## 検証環境など

### 利用したもの
xxxxアプリ（診断対象のAndroidアプリ）
Pixel3a（Android9,開発者モードON）
Windows 10 Pro
Android Studio(のadbコマンド)
WindowsとAndroidを繋ぐUSBケーブル

### 前提
Fridaを使います。
最初PowerShellでその後GitBash使っていますが、試行錯誤してる間に途中からGitBashが楽だなと思って変更しました。
Androidアプリの通信を取得する手法はBurpSuite+Androidなどで調べてください。
今回はbypassの手順だけ纏めます。
USBでWinとAndroidを接続しておきます。

## Fridaクライアントの準備

Python3系の最新版をインストール(64bit) ※検証時は3.8を利用しました。
環境変数を通す

```
C:\Users\hogehoge\AppData\Local\Programs\Python\Python38\
C:\Users\hogehoge\AppData\Local\Programs\Python\Python38\Scripts\
c:\users\hogehoge\appdata\local\programs\python\python38\lib\site-packages
```

PowerShellを起動。
python -V でバージョン確認して、最新であることを確認
pipを最新にして frida と frida-tools をインストールする

```powershell
py -m pip install --upgrade pip
py -m pip install frida
py -m pip install frida-tools
```

frida とコマンドを叩いてUsageが表示されたらOK


## Fridaサーバーの準備

以降はGitBashが楽でしたのでGitBash使っています。

### Android端末のプロセッサのアーキテクチャごとに落とすライブラリが異なるため、下記コマンドで調べる

```bash
adb shell getprop ro.product.cpu.abi
```

保持しているPixel3aの１つで試した時は下記の出力になったのでarm64のようです。

```bash
arm64-v8a
```

### 下記URLからプロセッサに対応したファイルをダウンロードしてくる

https://github.com/frida/frida/releases

### 検証時に取得したのは下記

[frida-server-12.7.11-android-arm64.xz](https://github.com/frida/frida/releases/download/12.7.11/frida-server-12.7.11-android-arm64.xz)

### 取得後、解凍する

```bash
unxz frida-server-12.7.11-android-arm64.xz
```

※少しハマったのですが解凍できなかったらファイルのダウンロードに失敗しているかも

### Android側にFridaServerのソースを置く。SELinuxを終了させる。実行権限つける。Server起動する。

```bash
adb push ./frida-server-12.7.11-android-arm64 /data/local/tmp/
adb shell ‘su -c setenforce 0’
adb shell “chmod 755 /data/local/tmp/frida-server-12.7.11-android-arm64”
adb shell ‘su -c /data/local/tmp/frida-server-12.7.11-android-arm64 &’
```

最後のコマンドのあとコマンドのレスポンス帰ってこないのでCtrl+cで終わらせる
サーバーは起動しているはず
多分最後の&のせいだけど、&を抜いた状態で動くか確認していない
サーバーの準備は完了


## fridaサーバーを用いた証明書ピンニングのバイパス

### Android上で動いているアプリケーションの確認

```bash
frida-ps -U
```

xxxxというアプリで絞るとこんな感じです

```bash
frida-ps -U | grep xxxx
```

控える

```bash
9999  jp.xxxx.xxxx.android
```

### SSLバイパスのソースを用意する
ソースコードは添付された下のjavascriptソースコードを任意のファイル名で保存してください。　※検証時は「frida-ssl-2.js」というファイル名で保存

### Fridaサーバー経由でアプリを起動する。下記コマンドを参考にしてください。パッケージ名は適宜診断対象のものに置き換えてください。

```bash
frida -U -l frida-ssl-2.js --no-paus -f jp.xxxx.xxxx.android
```

### Android側でアプリが起動される。証明書ピンニングが外れた状態で操作できる。アプリ終了するとまたfrida経由で起動する必要があると思う。Android端末を再起動すると、Fridaサーバーの起動からやらないと行けない（最後&付いてたあのコマンド）


```js
/* 
   Universal Android SSL Pinning Bypass
   by Mattia Vinci and Maurizio Agazzini 
   $ frida -U -f org.package.name -l universal-ssl-check-bypass.js --no-pause
    https://techblog.mediaservice.net/2018/11/universal-android-ssl-check-bypass-2/
*/
Java.perform(function() {
    var array_list = Java.use("java.util.ArrayList");
    var ApiClient = Java.use('com.android.org.conscrypt.TrustManagerImpl');
    ApiClient.checkTrustedRecursive.implementation = function(a1, a2, a3, a4, a5, a6) {
        // console.log('Bypassing SSL Pinning');
        var k = array_list.$new();
        return k;
    }
}, 0);
```

## 参考サイト
全部載せきれてなさそうです。思い出したら追記します。
[動的解析：証明書ピンニングのバイパス | Android のネットワーク API - owasp-mstg-ja](https://coky-t.gitbook.io/owasp-mstg-ja/android-tesutogaido/0x05g-testing-network-communication#pinningunobaipasu)
[Welcome | Frida • A world-class dynamic instrumentation framework](https://frida.re/docs/home/)
[Project: Universal Android SSL Pinning Bypass 2 | Frida CodeShare](https://codeshare.frida.re/@sowdust/universal-android-ssl-pinning-bypass-2/)