HTTPS 検査用に Android APK ファイルを自動的に準備する CLI アプリケーション
プロキシを使用してモバイル アプリの HTTPS トラフィックを検査するのが、おそらくその仕組みを理解する最も簡単な方法です。ただし、Android 7 で導入されたネットワーク セキュリティ構成と、アプリ開発者が証明書の固定を使用して MITM 攻撃を防止しようとしているため、アプリを HTTPS プロキシで動作させるのは非常に面倒なものになっています。
apk-mitm
プロセス全体を自動化します。 APK ファイルを与えるだけで、 apk-mitm
次のことを行います。
apk-mitm
使用して、Android App Bundle を使用してアプリにパッチを適用することもできます。携帯電話を root 化する必要はありません。
証明書の固定などのセキュリティ機能を回避するためにアプリの通常の動作を変更するには、アプリを実行する前にソース コードを変更するか、実行中にアプリを「フック」して関数呼び出しをインターセプトする必要があります。
apk-mitm
は現在、最初に Apktool を使用してアプリを「逆アセンブル」し、いくつかのファイルに変更を加えてから、(再び Apktool を使用して)それを再び組み立てることによってアプリのコードを変更する前者のアプローチを採用しています。
このアプローチには、ルート化されたデバイスが必要ないという利点がありますが、いくつかの欠点もあります。最大の問題は、アプリが実際には逆アセンブルされることを意図していないことです。 Apktool はとにかくそれを達成しようとしますが、特に大規模で複雑なアプリの場合、問題が発生することがよくあります。
このアプローチのもう 1 つの問題は、ネイティブ バイナリ内で実行されるチェック (Flutter などのフレームワークの場合と同様) など、一部の証明書ピン留め方法は回避するのが非常に難しいか不可能であることです。このため、よりトリッキーなアプリに対しては、他のアプローチを試すことが有益な場合があります。
具体的には、mitmproxy のandroid-unpinner
プロジェクトと、その基礎となる HTTP Toolkit によるfrida-interception-and-unpinning
スクリプトに焦点を当てたいと思います。彼らのアプローチは、Frida を使用して実行時にパッチを適用します。これは非常に強力ですが、root 化されたデバイスなしでは使用できないか、使用するのがより困難になることを意味します。
Node.js (14 以降) および Java (8 以降) の最新バージョンがある場合は、以下を実行してapk-mitm
インストールできます。
npm install -g apk-mitm
インストールしたら、次のコマンドを実行してアプリにパッチを適用できます。
apk-mitm < path-to-apk >
example.apk
という APK ファイルにパッチを適用すると、次のようになります。
$ apk-mitm example.apk
✔ Decoding APK file
✔ Modifying app manifest
✔ Replacing network security config
✔ Disabling certificate pinning
✔ Encoding patched APK file
✔ Signing patched APK file
Done ! Patched APK: ./example-patched.apk
これで、Android デバイスにexample-patched.apk
ファイルをインストールし、Charles や mitmproxy などのプロキシを使用してアプリのトラフィックを確認できるようになりました。
*.xapk
ファイル (たとえば APKPure から) または*.apks
ファイル (SAI を使用して自分でエクスポートできます) を提供することで、 apk-mitm
で Android App Bundle を使用してアプリにパッチを適用することもできます。 Linux でこれを行う場合は、 zip
とunzip
両方がインストールされていることを確認してください。
場合によっては、アプリを動作させるために手動で変更を加える必要があります。このような場合、 --wait
オプションが必要になります。これを有効にすると、 apk-mitm
アプリを再エンコードする前に待機するようになり、一時ディレクトリ内のファイルに変更を加えることができるようになります。
APK に対するさまざまな変更を試したい場合、 --wait
使用することは、使用するたびに最初から開始する必要があるため、おそらく最も便利なオプションではありません。この場合、APKLab を検討してみるとよいでしょう。これは、VS Code 上に構築された Android リバース エンジニアリング ワークベンチで、 apk-mitm
サポートが付属しており、より迅速に反復できるようになります。
一部のデバイス (Android TV など) では、システムのルート証明書に新しい証明書を追加できない場合があります。そのような場合でも、どのデバイスでも機能するため、プロキシの証明書をアプリのネットワーク セキュリティ構成に直接追加できます。これを実現するには、プロキシで使用される証明書 ( .pem
または.der
ファイル) のパスに--certificate
フラグを設定してapk-mitm
実行します。
アプリが Google マップを使用していて、パッチ適用後にマップが壊れた場合、アプリの API キーは開発者の証明書に制限されている可能性があります。制限なしで独自の API キーを作成し、 --wait
オプションを指定してapk-mitm
実行して、アプリのAndroidManifest.xml
ファイル内のcom.google.android.geo.API_KEY
値を置き換えることができるようにする必要があります。
デコードまたはエンコード中にapk-mitm
がクラッシュする場合、問題はおそらく Apktool に関連しています。 GitHub で問題を確認し、考えられる回避策を見つけてください。問題の影響を受けない Apktool バージョンを見つけた場合は、 --apktool
オプションで JAR ファイルのパスを指定することで、 apk-mitm
にそのバージョンを使用するように指示できます。
MIT © ニクラス・ヒギ