
🤖 Android APKファイルをHTTPSインスペクション用に自動的に準備するCLIアプリケーション
AndroidアプリのAPKファイルをHTTPS通信の検査に自動で対応させるCLIツール
プロキシを使ってモバイルアプリのHTTPSトラフィックを検査することは、おそらくアプリの動作を理解する最も簡単な方法です。しかし、Android 7で導入されたネットワークセキュリティ設定と、証明書ピンニングを使用してMITM攻撃を防ごうとするアプリ開発者のおかげで、アプリをHTTPSプロキシで動作させるのはかなり面倒になっています。
apk-mitmはこのプロセス全体を自動化します。APKファイルを指定するだけで、apk-mitmは以下を実行します:
apk-mitmはAndroid App Bundleを使用したアプリのパッチ適用にも対応しており、端末のroot化は不要です。
証明書ピンニングのようなセキュリティ機能を回避するためにアプリの通常の動作を変更するには、アプリのソースコードを実行前に修正するか、アプリの実行中にフックして関数呼び出しをインターセプトする必要があります。
apk-mitmは現在、前者のアプローチ(Apktoolでアプリを「逆アセンブル」し、いくつかのファイルに変更を加え、再度Apktoolでアセンブルし直す)を採用しています。
このアプローチには、root化されたデバイスが不要という利点がありますが、いくつかの欠点もあります。最大の問題は、アプリは本来「逆アセンブル」されることを想定していないことです。Apktoolはそれを実現しようとしますが、特に大規模で複雑なアプリでは問題が発生することがよくあります。
もう一つの問題は、ネイティブバイナリ内で行われるチェック(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
✔ APKファイルをデコード中
✔ アプリマニフェストを変更中
✔ ネットワークセキュリティ設定を置き換え中
✔ 証明書ピンニングを無効化中
✔ 修正済みAPKファイルをエンコード中
✔ 修正済みAPKファイルに署名中
完了! 修正済みAPK: ./example-patched.apk
これでexample-patched.apkファイルをAndroidデバイスにインストールし、Charlesやmitmproxyのようなプロキシを使用してアプリのトラフィックを確認できます。
apk-mitmでは、*.xapkファイル(例:APKPureから)や*.apksファイル(SAIを使用して自分でエクスポート可能)を指定することで、Android App Bundleを使用するアプリにもパッチを適用できます。Linuxで行う場合は、zipとunzipの両方がインストールされていることを確認してください。
場合によっては、アプリを動作させるために手動で変更を加える必要があります。そのような場合には、--waitオプションが便利です。このオプションを有効にすると、apk-mitmはアプリを再エンコードする前に待機し、一時ディレクトリ内のファイルを変更できるようになります。
APKに対して様々な変更を試したい場合、--waitを使用するたびに最初からやり直す必要があるため、あまり便利ではないかもしれません。そのような場合は、APKLabを検討してみてください。これはVS Code上に構築されたAndroidリバースエンジニアリングワークベンチで、apk-mitmサポートが組み込まれており、より迅速な反復が可能です。
Android TVなどの一部のデバイスでは、システムのルート証明書ストアに新しい証明書を追加できない場合があります。その場合でも、プロキシの証明書をアプリのネットワークセキュリティ設定に直接追加すれば、どのデバイスでも動作します。--certificateフラグにプロキシで使用する証明書(.pemまたは.derファイル)のパスを指定してapk-mitmを実行することで実現できます。
アプリがGoogle Mapsを使用しており、パッチ適用後にマップが表示されない場合、アプリのAPIキーが開発者の証明書に制限されている可能性があります。制限のない独自のAPIキーを作成し、--waitオプションを指定してapk-mitmを実行し、アプリのAndroidManifest.xmlファイル内のcom.google.android.geo.API_KEYの値を置き換える必要があります。
デコードまたはエンコード中にapk-mitmがクラッシュする場合、問題はおそらくApktoolに関連しています。GitHub上のApktoolのIssueを確認して、回避策の可能性を探ってください。問題の影響を受けないApktoolバージョンを見つけた場合、--apktoolオプションでそのJARファイルのパスを指定することで、apk-mitmにそのバージョンを使用させることができます。
MIT © Niklas Higi