
Fridaスクリプトを使用して、実行時にモバイルアプリケーションを書き換え、すべてのHTTPSトラフィックを直接MitMするためのツールです。
HTTP Toolkit の一部: HTTP(S) の構築・テスト・デバッグのための強力なツール
このリポジトリには、モバイルデバイスでの完全自動化された HTTPS MitM 傍受に必要なすべてを実行するために設計された Frida スクリプトが含まれています。
このスクリプト群は、Android と iOS での HTTP(S) トラフィックの MitM 傍受のために、傍受の処理、証明書の信頼の管理、証明書ピンニングとトランスペアレンシー検証の無効化をまとめて行うためにすべて一緒に使用することもできますし、特定の機能だけをフックするために個別に使用・調整することもできます。
スクリプトは以下を自動的に処理できます:
-----BEGIN CERTIFICATE----- で始まる必要があります。テキストエディタで開くと、この内容を確認して抽出できます。config.js を開き、以下の詳細を追加します:
CERT_PEM: PEM 形式の CA 証明書PROXY_PORT: プロキシのポートPROXY_HOST: デバイスから見たプロキシのアドレス(または adb reverse tcp:$PORT tcp:$PORT を使用してポートを ADB 経由で転送し、ホストに 127.0.0.1 を使用します)frida-server をダウンロードし、解凍して、adb push でデバイスに転送し、次の 4 つのコマンドで実行します: adb shell、su、、。-----BEGIN CERTIFICATE----- で始まる必要があります。テキストエディタで開くと、この内容を確認して抽出できます。config.js を開き、以下の詳細を追加します:
CERT_PEM: PEM 形式の CA 証明書PROXY_PORT: プロキシのポートPROXY_HOST: デバイスから見たプロキシのアドレスhttps://build.frida.re をパッケージソースとして利用できます。frida-ps -Uai を実行して、正しく動作していることを確認してください。frida-ps -Uai で対象アプリの ID を確認します(簡単なテストには、github.com/httptoolkit/ios-ssl-pinning-demo を使用してみてください。ID は com.httptoolkit.ios-pinning-demo です)config.js から始めます)。使用するスクリプトは任意ですが、iOS の場合、次のコマンドが良い出発点です:
上記のコマンドは関連するすべてのスクリプトを使用していますが、通常は任意のサブセットを使用できます。ただし、ほぼすべてのケースで config.js を最初のスクリプトとして含める必要があります(他のスクリプトで使用されるいくつかの変数を定義します)。
たとえば、プロキシと証明書の設定を別の場所で処理し、難読化フォールバックなしで、Android でピンニング解除のみを行う場合は、次のように実行できます:
frida -U \
-l ./config.js \
-l ./android/android-certificate-unpinning.js
-f $PACKAGE_ID
各スクリプトには、何を行うか、どのように機能するかについての詳細なドキュメントが先頭の大きなコメントセクションに含まれています。スクリプトは次のとおりです:
config.js
他のスクリプトで使用される変数を定義します:
CERT_PEM - 信頼する追加の CA 証明書(PEM 形式)PROXY_HOST - 使用するプロキシサーバーの IP アドレス(IPv4)(ピンニング解除のみを行う場合は不要)PROXY_PORT - 使用するプロキシサーバーのポート(ピンニング解除のみを行う場合は不要)DEBUG_MODE - デフォルトは false ですが、これを true にすると、デバッグや問題のリバースエンジニアリングに役立つ追加の出力が多数有効になります。BLOCK_HTTP3 - デフォルトは true で、ポート 443 へのすべての UDP 接続をドロップして HTTP/3 をブロックします。これは、他のスクリプトよりも前にコマンドラインで指定する必要があります。
native-connect-hook.js
すべてのネットワークトラフィックを直接キャプチャし、すべての接続を設定されたプロキシホストとポートにルーティングします。
これは すべての ネットワーク接続に適用される低レベルのフックです。これにより、プロキシ設定を無視する接続や他の raw ソケット接続を行う接続も含め、すべての接続が強制的に対象のプロキシサーバーにリダイレクトされ、有効な場合は HTTP/3 接続もブロックされます。
このフックは libc に適用され、Android、Linux、iOS、およびその他の多くの関連環境で動作します。
native-tls-hook.js
これらのスクリプトは、より広範な HTTP Toolkit プロジェクトの一部であり、NGI Zero Entrust Fund を通じて資金提供されています。この基金は NLnet によって設立され、欧州委員会の Next Generation Internet プログラムから資金提供を受けています。詳細は NLnet プロジェクトページ をご覧ください。
chmod +x /.../frida-server/.../frida-serveradb devices を使用)を確認してください。Frida はデバイス上で root としてのみ実行されることに注意してください。上記の例で su が提供するのは、root 化されたデバイスで実行した場合の root 権限です。su などを実行した後に root になっているか確認するには、シェルで whoami を実行して root と表示されるか確認してください。tech.httptoolkit.pinning_demo です)config.js から始めます)。使用するスクリプトは任意ですが、Android の場合、次のコマンドが良い出発点です:
frida -U \
-l ./config.js \
-l ./native-connect-hook.js \
-l ./native-tls-hook.js \
-l ./android/android-proxy-override.js \
-l ./android/android-system-certificate-injection.js \
-l ./android/android-certificate-unpinning.js \
-l ./android/android-certificate-unpinning-fallback.js \
-l ./android/android-disable-root-detection.js \
-f $PACKAGE_ID
frida -U \
-l ./config.js \
-l ./ios/ios-connect-hook.js \
-l ./ios/ios-disable-detection.js \
-l ./native-tls-hook.js \
-l ./native-connect-hook.js \
-f $APP_ID
BoringSSL ベースのライブラリのすべての TLS 検証を変更して、設定した CA 証明書を信頼するようにします。
特に、これは iOS の組み込み BoringSSL API をフックします。これは iOS が TLS 証明書の検証を処理する通常の方法です(そのため、ほとんどすべての iOS HTTPS 傍受に十分です)が、iOS と Android の両方のいくつかの他のケースでも使用されます。
これにより、すべての証明書に対して自分の CA が事実上信頼され、その CA に対するすべての証明書ピンニング、証明書トランスペアレンシー、およびその他の制限が無効になります。他の多くの Frida フックとは異なり、これは TLS 検証を完全に無効にするものではない(これは非常に安全ではありません)ことに注意してください。代わりに、特定の CA 証明書を使用するすべての接続が信頼されるように検証をオーバーライドし、第三者による傍受を許可するために検証を緩めることはありません。
android/
android-proxy-override.js
対象アプリの Android プロキシ設定をオーバーライドし、正常なトラフィックがすべてプロキシサーバーを経由してリダイレクトされ、傍受されるようにします。
android-system-certificate-injection.js
ネイティブの Android API を変更して、すべてのトラストストアが追加の CA 証明書をデフォルトで信頼するようにし、暗号化された TLS トラフィックをキャプチャできるようにします。
android-certificate-unpinning.js
証明書ピンニング(システムで信頼されているすべての証明書ではなく、認識された証明書の小さなセットのみを受け入れる)や証明書トランスペアレンシー(使用されるすべての証明書が公開証明書ログに登録されていることを検証する)など、追加の証明書制限のための一般的な既知のテクニックの多くを変更または無効にします。
android-certificate-unpinning-fallback.js
未処理の証明書検証失敗を検出し、自動生成されたフォールバックパッチで未知の認識されないケースを処理しようとします。これはより実験的で、少し予測できない可能性がありますが、難読化されたケースには非常に役立ち、一般的には(最初の失敗の後に)ピンニングの問題を修正するか、少なくとも Frida のログ出力でさらなるリバースエンジニアリングのためのコードを強調表示します。このスクリプトは android-certificate-unpinning.js と一部のロジックを共有しており、単独では使用できません。このスクリプトを使用する場合は、フォールバックではないピンニング解除スクリプトも含める必要があります。
android-disable-root-detection.js
root 化された Android デバイスの検出を防ぐために、ネイティブ層と Java 層の両方で一般的な root 検出チェックを無効にします。
このスクリプトは、既知の root インジケーター(su、Magisk、関連アプリなど)に対するファイルシステムアクセス、シェルコマンド、パッケージ検索をインターセプトし、主要なシステムプロパティ(ro.secure、ro.debuggable など)を偽装して本番環境をシミュレートします。
ファイル存在チェックやシェルコマンド実行などの疑わしい動作をブロックし、標準的および高度な root チェックの両方を使用するアプリでの検出回避に役立ちます。
android-disable-flutter-certificate-pinning.js
Flutter ベースのアプリケーション(通常はシステムの証明書設定を無視します)が、明示的な証明書ピンニングのほとんどの場合でも、CA 証明書を信頼するようにします。このスクリプトは今のところ実験的です。
ios/
ios-connect-hook.js
すべての iOS ネットワークトラフィックを直接キャプチャし、すべての接続を設定されたプロキシホストとポートにルーティングします。
これは すべての ネットワーク接続に適用される低レベルのフックです。これにより、プロキシ設定を無視する接続や他の raw ソケット接続を行う接続も含め、すべての接続が強制的に対象のプロキシサーバーにリダイレクトされます。
ios-disable-detection.js
JailMonkey の脱獄検出を無効にします。
utilities/test-ip-connectivity.js
通常、傍受自体の一部としてこれを使用したいとは思わないかもしれませんが、設定のセットアップの一部としては非常に役立ちます。
このスクリプトを使用すると、候補となる IP アドレスのリストとターゲットポートを設定し、プロセスに各アドレスをテストさせ、最初に到達可能なアドレスについて Frida クライアントにメッセージを送信できます。これは、ターゲットデバイス(スマートフォン)からプロキシサーバー(コンピュータ)に到達するためにどの IP アドレスが最適かわからない場合に、自動化された設定プロセスに役立ちます。