web-dev-qa-db-ja.com

弱いSSL暗号スイートを強制するためのMITMツールはありますか?

AndroidアプリとHTTPSを使用するWebサーバーの間の通信をリバースエンジニアリングしようとしているとしましょう。

最初は、webmitmと偽の証明書を使用してMITMを実行しようとしました。しかし、webmitmが使用する偽の証明書がアプリによって信頼されていないため、アプリを起動できませんでした(信頼できる証明書を判断する独自の方法がアプリにあり、偽の証明書をAndroid信頼できる証明書として)

だから私は別のアプローチに来る。アプリとウェブサーバーの両方が弱い暗号をサポートしていることに気付きました(例:TLS_RSA_EXPORT_WITH_RC4_40_MD5)。だから私は、偽の証明書をブリッジとして使用する代わりに、クライアントのHelloパケットのみを変更して弱い暗号を適用し、途中で復号化や暗号化を行わずにサーバーの元の証明書を転送するmitmツールがあると思います。

別の言い方をすると、アプリが「Hello Webserver、私は次の暗号スイートをサポートします:XXX YYY ZZZ。サポートを1つ選択してください」、mitmツールはこのパケットをインターセプトし、「Hello Webserver、私はTLS_RSA_EXPORT_WITH_RC4_40_MD5のみをサポートします」に変更します。それをWebサーバーに転送します。どちらもこの暗号スイートをサポートしているので、残りの通信にはこれを使用します。そして、mitmツールはそれらの間ですべてを転送し、すべてのパケットを記録します。そして、記録されたパケットをオフラインで復号化しようとします。

何か案が?

9
user15580

あなたがやろうとしていることは...難しいでしょう。主なポイントは、ハンドシェイクの最後に、クライアントとサーバーが、ネゴシエートされたばかりのアルゴリズムとキーの保護下で、お互いにFinishedメッセージを送信することです。これらのメッセージのcontentsは、ClientHelloおよびServerHelloを含む、以前のすべてのハンドシェイクメッセージに対して計算されたハッシュ値です。 。つまり、クライアントとサーバーで同じClientHelloが表示されない場合(転送中に変更したため)、Finishedメッセージの内容が一致せず、ハンドシェイクが失敗します。 。

ClientHelloを正常に変更するには、暗号化を解除し、オフラインではなく、暗号化を回復する必要があります。ハンドシェイクの最後のキーとbeforeFinishedメッセージの転送により、内容を調整できます。

40ビット暗号化は、技術的に実現可能な領域です。最初の問題は、エクスポート暗号スイートでは、40ビットの鍵が中間鍵にすぎないことです。最終的なキーは128ビットに拡張されます。ブルートフォースはまだ実行可能ですが、事前計算されたテーブル(レインボーテーブル...)は実行できません。より大きな問題は、Finishedメッセージの内容を調整する必要があるため、暗号化キーだけでなくMACキーも破壊する必要があることです。これらのキーは大きい(128ビット)です。

したがって、残っている唯一の選択肢は、サーバーが使用するRSAキーを解読することです。理論的には、TLS_RSA_EXPORT_WITH_RC4_40_MD5を使用すると、サーバーの公開鍵のサイズは最大で512ビットになります。 512ビットのRSAキーは破壊可能ですが、それでもアマチュアにとってはかなりの努力です。 報告されています 1台のデスクトップPCで2か月で達成できること。最近、ある人 512ビットのRSAキーを75ドルで因数分解した が3日間で(75ドル相当のレンタルCPU)。 openssl s_clientのみをサポートしていると主張するクライアント(OpenSSLのコマンドラインツール:TLS_RSA_EXPORT_WITH_RC4_40_MD5など)を使用してサーバーへの接続を自分で試すと、サーバーから送信された証明書が表示されます。サーバーの公開鍵が512ビットのみの場合は、それを解読することができます。ただし、サーバーが「エクスポート暗号」の512ビットキーへの制限を守らない可能性があることに注意してください(前述のエクスポート規制が10年以上前に解除されたため)。

サーバーのRSAキーを破ることができる場合は、サーバーを偽装することができます。つまり、中間者攻撃にサーバー自身の証明書(クライアントの目には有効である必要があります)を使用できます。それができず、クライアントが受け入れる偽の証明書を作成する方法がない場合、私はあなたがやりたいことを達成する方法を見つけられません。

13
Thomas Pornin