一時的なDiffie-Hellman暗号スイートが使用されている場合、TLSメッセージを復号化するにはどうすればよいですか? SSLクライアントからプリマスターシークレットとマスターシークレットを公開できます。それを使用して、Wiresharkでメッセージを復号化する方法は?
背景:Wiresharkは、マスターシークレット(プレマスターシークレットから導出できる)を計算できる場合、SSLセッションの復号化をサポートしています。 RSAキー交換を使用する暗号スイートの場合、秘密RSAキーを使用して、暗号化されたプレマスターシークレットを復号化できます。
エフェメラルDiffie-Hellman(DHE)暗号スイートの場合、RSA秘密鍵はDHパラメーターの署名にのみ使用されます(暗号化の場合はではありません)。これらのパラメーターはDH鍵交換で使用され、共有秘密(事実上、回線上には表示されないプリマスター秘密)になります。
Wiresharkは、SSLを復号化するさまざまな方法をサポートしています。
識別子をマスターシークレットにマップする SSLキーログファイル を使用します。使用可能な識別子は次のとおりです。
RSA XXX YYY
、以降 Wireshark 1.6. )CLIENT_RANDOM XXX YYY
、以降 Wireshark 1.8. )PMS_CLIENT_RANDOM XXX ZZZ
、以降 Wireshark 2. )CLIENT_RANDOM
の代わりに、キーはCLIENT_EARLY_TRAFFIC_SECRET
、CLIENT_HANDSHAKE_TRAFFIC_SECRET
、SERVER_HANDSHAKE_TRAFFIC_SECRET
、CLIENT_TRAFFIC_SECRET_0
またはSERVER_TRAFFIC_SECRET_0
のいずれかです。 Wireshark 2.4 以降。RSA Session-ID:XXX Master-Key:YYY
、以降 Wireshark 1.6. )RSA Session-ID:XXX Master-Key:YYY
、以降 Wireshark 1.11. )セッションのそのようなSSLキーログファイルを生成するには、NSSアプリケーションを起動する前に、SSLKEYLOGFILE
環境変数をファイルに設定します。 Linuxのシェルコマンドの例:
export SSLKEYLOGFILE=$PWD/premaster.txt
firefox
Windowsでは、cmd
(setx SSLKEYlOGFILE "%HOMEPATH%\Desktop\premaster.txt"
の呼び出しなど)またはシステム構成パネルを使用して、グローバル環境変数を設定する必要があります。その後、アイコンからFirefoxを起動できます。 注:(Linux)NSS 3.24以降のFirefoxのユーザーは、Firefox開発者がこれを無効にしたため、この方法を使用できない可能性があります デフォルト =。
SSLキーログファイルは、WiresharkのEdit->Preferences、Protocols->[〜#〜] ssl [〜#〜]、フィールド(Pre)-Master-Secretログファイル名(または-o ssl.keylog_file:path/to/keys.log
をwireshark
またはtshark
に渡します)。
これを実行した後、以前のキャプチャとライブキャプチャのSSLセッションを復号化できます。それでもトラフィックを復号化できない状況が発生した場合は、次を確認してください。
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サポートが大幅に改善されているため、手動でパッチを適用する必要はありません。
「プリマスターシークレットを公開」できる場合、キー交換ではephemeralDiffie-Hellmanを使用しますが、クライアントまたはサーバーへの特権アクセスがあります。これがDHEのポイントの1つです。実際のキー交換では、クライアントもサーバーも独自のRAM以外の場所に格納しない、新しく生成されたDHキーペアを使用します。永続的なサーバーのキーのコピーがあっても、署名にのみ使用されるため、Wiresharkのパッシブ攻撃者として何も得られません。そのキーを使用してサーバーを偽装し、アクティブな 中間者攻撃 をマウントできます。
ただし、プリマスターシークレットにアクセスできる場合は、粗雑なパケットキャプチャに頼ることなく、クリアデータに直接アクセスできる必要があります。したがって、あなたの質問は奇妙です。
とにかく、後続のデータレコードは the standard (または thepreviousversions のいずれか)に従って復号化できます(該当する場合) )、これは興味深いプログラミング演習です。 ssldump のソースコードがそのタスクで再利用される可能性があります。