LoginSignup
22
4

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-12-03

はじめに

脆弱性診断していて、証明書ピンニングで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

22
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
4