web-dev-qa-db-ja.com

opensslコマンドラインツールを使用してSSLトラフィックを復号化する-続き

元の質問に対する回答を得ました ここ うまくいけば、別の質問を投稿してフォローアップの質問をしても大丈夫です。上記の元の質問から、秘密鍵を使用してクライアントのプレマスター秘密/鍵を復号化することができました。

openssl rsautl -in cpre.key -inkey key.pem -decrypt -out spre.key

これは非常に簡単に思え、48バイトのファイルを作成しました。私が行っていることは、私がこれに取り組んでいるhttpsトラフィックを小さなステップで実際に復号化または暗号化することにはならないことを理解しています。私の読書からの次のステップはマスターシークレット/キーを生成することです、そして私の前の投稿の答えから私はこれをするためにここで少し苦労しているopensslでもこれを行うことができるはずです。私はopenssldgstのバリエーションを思いついた

echo -n'value '| openssl dgst -sha256 -mac hmac -macopt hexkey:$(hexkey)

ここで、値は「マスターシークレット」+ client.random + server.randomで、hexkeyは前の手順で復号化したプリマスターシークレットです。私はこのステップを正しく行っていますか?私がRFCを理解する方法から、RFCは32バイトを生成し、RFCはそれが48バイトになると説明しているので。 RFCを解釈する方法は、その結果を取得して再度パススルーする必要があることです。これにより、追加の32バイトが生成され、最初の16バイトが取得され、最初の32バイトの最後に連結されて48バイトが取得されます。マスターシークレット/キー。復号化してサーバー側のプリマスターキーを取得した後、この次のステップを完全にオフにしますか?ありがとうDavidB

1
David B

事前に、あなたが実際にあなたが示したことをしなかったことを願っています。ラベルを除いて、TLSキー導出で使用されるすべてのデータはバイナリデータであり、シェルechoコマンドまたはその他のコマンドの引数として正確に指定することはできません。ただし、zshの組み込みバージョンを除きます。エスケープを無効にし、一重引用符を使用したリテラル引数に「入力」(切り取りと貼り付けも)できない場合。

実際にファイルにデータがある場合は、それらを使用できます。バイナリデータは、少なくともOpenSSLがサポートするプラットフォームでは、ファイルからの読み取りとファイルへの書き込みが可能です。ファイルがない(ただしパイプがある)場合は、データを16進数で渡すことでこれを回避できます。ただし、_-macopt hexkey:_のようなプログラムを使用して、すでに16進数を使用している_xxd -r_を除きます。または、16進数がエスケープに形成されたprintf、またはechoが非ポータブルエスケープに形成された16進数、またはGNU _sed s///e_、または、より一般的なプログラムawkまたはPerlで、16進数をバイナリに変換してopensslに入力します。必要に応じて、同様のハックでバイナリ出力を16進数に変換しますが、_dgst -mac hmac_は、blahblah=(sp)を前面から削除する限り、16進数で出力できます。

より実質的には、最初のHMAC出力をそれ自体で実行すると、「A」ブロックのみが得られ、次にHMACの別のレイヤーを実行して、実際の出力「P_hash」を取得します。 https://crypto.stackexchange.com/questions/46549/tls-1-2-prf-with-hmac-sha256 を参照してください。これは事実上 https://www.ietf.org/mail-archive/web/tls/current/msg03416.html で公開されているテストベクトルを使用した同じ質問私はJavaで答えました。同等のOpenSSLコマンドラインは次のとおりです。

_$ echo $key; echo $lbsd # start from hex
9bbe436ba940f017b17652849a71db35
74657374206c6162656c a0ba9f936cda311827a6f796ffd5198c
$ echo $lbsd | xxd -r -p >a0
$ openssl dgst -sha256 -mac hmac -macopt hexkey:$key <a0 -binary >a1
$ openssl dgst -sha256 -mac hmac -macopt hexkey:$key <a1 -binary >a2
$ openssl dgst -sha256 -mac hmac -macopt hexkey:$key <a2 -binary >a3
$ openssl dgst -sha256 -mac hmac -macopt hexkey:$key <a3 -binary >a4
$ cat a1 a0 | openssl dgst -sha256 -mac hmac -macopt hexkey:$key -binary >k1
$ cat a2 a0 | openssl dgst -sha256 -mac hmac -macopt hexkey:$key -binary >k2
$ cat a3 a0 | openssl dgst -sha256 -mac hmac -macopt hexkey:$key -binary >k3
$ cat a4 a0 | openssl dgst -sha256 -mac hmac -macopt hexkey:$key -binary >k4
$ cat k1 k2 k3 k4 | head -c100 | xxd
0000000: e3f2 29ba 727b e17b 8d12 2620 557c d453  ..).r{.{..& U|.S
0000010: c2aa b21d 07c3 d495 329b 52d4 e61e db5a  ........2.R....Z
0000020: 6b30 1791 e90d 35c9 c9a4 6b4e 14ba f9af  k0....5...kN....
0000030: 0fa0 22f7 077d ef17 abfd 3797 c056 4bab  .."..}....7..VK.
0000040: 4fbc 9166 6e9d ef9b 97fc e34f 7967 89ba  O..fn......Oyg..
0000050: a480 82d1 22ee 42c5 a72e 5a51 10ff f701  ....".B...ZQ....
0000060: 8734 7b66                                .4{f
_

コードでこれを複製できる場合は、実際のTLS1.2ハンドシェイクでも機能し、正しい長さに調整されます。マスターシークレットの場合は48、動作するキーの暗号スイートによって異なります。

1