web-dev-qa-db-ja.com

DHE_RSA暗号スイートを使用する場合のWiresharkでのTLSの復号化

一時的なDiffie-Hellman暗号スイートが使用されている場合、TLSメッセージを復号化するにはどうすればよいですか? SSLクライアントからプリマスターシークレットとマスターシークレットを公開できます。それを使用して、Wiresharkでメッセージを復号化する方法は?

48
Kalai

背景:Wiresharkは、マスターシークレット(プレマスターシークレットから導出できる)を計算できる場合、SSLセッションの復号化をサポートしています。 RSAキー交換を使用する暗号スイートの場合、秘密RSAキーを使用して、暗号化されたプレマスターシークレットを復号化できます。

エフェメラルDiffie-Hellman(DHE)暗号スイートの場合、RSA秘密鍵はDHパラメーターの署名にのみ使用されます(暗号化の場合はではありません)。これらのパラメーターはDH鍵交換で使用され、共有秘密(事実上、回線上には表示されないプリマスター秘密)になります。

Wiresharkは、SSLを復号化するさまざまな方法をサポートしています。

  • プライベートRSAキーを使用してプレマスターシークレットを復号化する。 RSA鍵交換で機能し、上記の制限を受けます。
  • 識別子をマスターシークレットにマップする SSLキーログファイル を使用します。使用可能な識別子は次のとおりです。

    • 暗号化されたプレマスターシークレットの最初の8バイト(16進数でエンコードされた16文字)(ClientKeyExchangeハンドシェイクメッセージでネットワーク経由で送信されたもの)。 (RSA XXX YYY、以降 Wireshark 1.6.
    • Client Helloハンドシェイクメッセージのランダムフィールド内の32バイト(16バイトでエンコードされた64バイトの文字)。 (CLIENT_RANDOM XXX YYY、以降 Wireshark 1.8.
      • クライアントランダムを(マスターシークレットではなく)プリマスターシークレットにマップするバリアントも存在します。 (PMS_CLIENT_RANDOM XXX ZZZ、以降 Wireshark 2.
      • TLS 1.3をサポートし、クライアントランダムをそれぞれのシークレットにマップする別のバリ​​アントが存在します。 CLIENT_RANDOMの代わりに、キーはCLIENT_EARLY_TRAFFIC_SECRETCLIENT_HANDSHAKE_TRAFFIC_SECRETSERVER_HANDSHAKE_TRAFFIC_SECRETCLIENT_TRAFFIC_SECRET_0またはSERVER_TRAFFIC_SECRET_0のいずれかです。 Wireshark 2.4 以降。
    • Server HelloハンドシェイクメッセージのセッションIDフィールド。 (RSA Session-ID:XXX Master-Key:YYY、以降 Wireshark 1.6.
    • Client Hello TLS拡張のセッションチケットまたはセッションチケットハンドシェイクメッセージ。 (RSA Session-ID:XXX Master-Key:YYY、以降 Wireshark 1.11.

セッションのそのようなSSLキーログファイルを生成するには、NSSアプリケーションを起動する前に、SSLKEYLOGFILE環境変数をファイルに設定します。 Linuxのシェルコマンドの例:

export SSLKEYLOGFILE=$PWD/premaster.txt
firefox

Windowsでは、cmdsetx SSLKEYlOGFILE "%HOMEPATH%\Desktop\premaster.txt"の呼び出しなど)またはシステム構成パネルを使用して、グローバル環境変数を設定する必要があります。その後、アイコンからFirefoxを起動できます。 :(Linux)NSS 3.24以降のFirefoxのユーザーは、Firefox開発者がこれを無効にしたため、この方法を使用できない可能性があります デフォルト =。

SSLキーログファイルは、WiresharkのEdit->PreferencesProtocols->[〜#〜] ssl [〜#〜]、フィールド(Pre)-Master-Secretログファイル名(または-o ssl.keylog_file:path/to/keys.logwiresharkまたはtsharkに渡します)。

これを実行した後、以前のキャプチャとライブキャプチャのSSLセッションを復号化できます。それでもトラフィックを復号化できない状況が発生した場合は、次を確認してください。

  • キーログファイルのパスが正しいかどうか(プログラムが作業ディレクトリを変更する場合は絶対パスを使用してください)。
  • キーログファイルにプログラムのキーマテリアルが実際に含まれているかどうか。
  • wiresharkがGnuTLSでコンパイルされているかどうか(Wireshark 1.10.1をGnuTLS 3.2.4およびlibgcrypt 1.5.3でテストしました)
  • 他のセッションを復号化できるかどうか。たとえば、機能するhttps://lekensteyn.nl/を試しましたが、Camellia暗号スイートを使用しているサイトは失敗しました。

それでもすべてのトラフィックを復号化できない場合は、Wiresharkにバグが含まれている可能性があります(私の場合、Camelliaのサポートが欠落していました)。デバッグを開始するには、キャプチャを保存し、SSLロギングを有効にしてWiresharkを開始します。

wireshark -o ssl.debug_file:debug.txt savedcapture.pcapng

キャプチャが読み込まれた後、プログラムを再び閉じることができます。 (実際にキャプチャを保存する必要はありませんが、問題を再現しやすくなり、ログダンプでのさらなるノイズを回避できます。)次のような行が表示される場合があります。

ssl_generate_keyring_material not enough data to generate key (0x33 required 0x37 or 0x57)

これらの数値は、epan/dissectors/packet-ssl-utils.hで定義されている定数の組み合わせです。

215-#define SSL_CLIENT_RANDOM       (1<<0)
216-#define SSL_SERVER_RANDOM       (1<<1)
217:#define SSL_CIPHER              (1<<2)
218-#define SSL_HAVE_SESSION_KEY    (1<<3)
219-#define SSL_VERSION             (1<<4)
220-#define SSL_MASTER_SECRET       (1<<5)
221-#define SSL_PRE_MASTER_SECRET   (1<<6)

ご覧のとおり、ここにSSL_MASTER_SECRET(0x20)がありません。ログファイルをさらに見ると、次の情報も見つかります。

dissect_ssl3_hnd_srv_hello can't find cipher suite 0x88

この暗号スイートは実際、cipher_suitesで定義されているepan/dissectors/packet-ssl-utils.c構造体にはありません。 RFC 5932-Camellia Cipher Suites for TLSを調べた後、CipherSuiteに必要なパラメーターを見つけました。その結果、パッチは Wiresharkに送信されます となるはずです https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=9144 。安定した1.12シリーズでは、暗号スイートとTLSサポートが大幅に改善されているため、手動でパッチを適用する必要はありません。

56
Lekensteyn

「プリマスターシークレットを公開」できる場合、キー交換ではephemeralDiffie-Hellmanを使用しますが、クライアントまたはサーバーへの特権アクセスがあります。これがDHEのポイントの1つです。実際のキー交換では、クライアントもサーバーも独自のRAM以外の場所に格納しない、新しく生成されたDHキーペアを使用します。永続的なサーバーのキーのコピーがあっても、署名にのみ使用されるため、Wiresharkのパッシブ攻撃者として何も得られません。そのキーを使用してサーバーを偽装し、アクティブな 中間者攻撃 をマウントできます。

ただし、プリマスターシークレットにアクセスできる場合は、粗雑なパケットキャプチャに頼ることなく、クリアデータに直接アクセスできる必要があります。したがって、あなたの質問は奇妙です。

とにかく、後続のデータレコードは the standard (または thepreviousversions のいずれか)に従って復号化できます(該当する場合) )、これは興味深いプログラミング演習です。 ssldump のソースコードがそのタスクで再利用される可能性があります。

9
Thomas Pornin