はじめに
脆弱性診断していて、証明書ピンニングで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 をインストールする
py -m pip install --upgrade pip
py -m pip install frida
py -m pip install frida-tools
frida とコマンドを叩いてUsageが表示されたらOK
Fridaサーバーの準備
以降はGitBashが楽でしたのでGitBash使っています。
Android端末のプロセッサのアーキテクチャごとに落とすライブラリが異なるため、下記コマンドで調べる
adb shell getprop ro.product.cpu.abi
保持しているPixel3aの1つで試した時は下記の出力になったのでarm64のようです。
arm64-v8a
下記URLからプロセッサに対応したファイルをダウンロードしてくる
検証時に取得したのは下記
frida-server-12.7.11-android-arm64.xz
取得後、解凍する
unxz frida-server-12.7.11-android-arm64.xz
※少しハマったのですが解凍できなかったらファイルのダウンロードに失敗しているかも
Android側にFridaServerのソースを置く。SELinuxを終了させる。実行権限つける。Server起動する。
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上で動いているアプリケーションの確認
frida-ps -U
xxxxというアプリで絞るとこんな感じです
frida-ps -U | grep xxxx
控える
9999 jp.xxxx.xxxx.android
SSLバイパスのソースを用意する
ソースコードは添付された下のjavascriptソースコードを任意のファイル名で保存してください。 ※検証時は「frida-ssl-2.js」というファイル名で保存
Fridaサーバー経由でアプリを起動する。下記コマンドを参考にしてください。パッケージ名は適宜診断対象のものに置き換えてください。
frida -U -l frida-ssl-2.js --no-paus -f jp.xxxx.xxxx.android
Android側でアプリが起動される。証明書ピンニングが外れた状態で操作できる。アプリ終了するとまたfrida経由で起動する必要があると思う。Android端末を再起動すると、Fridaサーバーの起動からやらないと行けない(最後&付いてたあのコマンド)
/*
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
Welcome | Frida • A world-class dynamic instrumentation framework
Project: Universal Android SSL Pinning Bypass 2 | Frida CodeShare