SSLマスターシークレットとキーをchromiumブラウザからファイルにエクスポート/書き込みしようとしています。誰かが私にこれを行う方法をアドバイスしてくれるとありがたいです。
プリマスターシークレットを書き込むには、環境にSSLKEYLOGFILE変数をエクスポートするだけです。プレマスターシークレットは、wiresharkがHTTPSセッションを復号化するために使用できます。
プリマスターシークレットは、マスターシークレットを計算するために使用されます。マスターシークレットは、6つのキー(CLIENT_WRITE_MAC CLIENT_IV CLIENT_WRITEおよびサーバー用にさらに3つ)を作成するために使用されます。
これらのキーをプリマスターシークレットではなくファイルに出力したい。
私はwiresharkコードを使用してそれを単純に出力できるかどうか考えましたが、これはより複雑で、wiresharkがSSLパケットを処理し、プリマスターシークレットを使用するためのコードはここにあると思います。 github.com/boundary/wireshark/blob/master/epan/dissectors/packet-ssl-utils.c
続行する別の方法は、Chromiumブラウザーに変更を加えてコンパイルすることです。ここで変更が必要だと思います。 https://code.google.com/p/chromium/codesearch#chromium/src/net/third_party/nss/ssl/derive.c&q=client_write_mac_secret&sq=package:chromium&type=cs&l=214
私はより多くのソースコードを調べていて、このファイルが関連していることがわかりました。
上記のコードを見ると、設定できる環境変数が他にもあることがわかります。 SSLDEBUG環境をSSLKEYLOG変数と同じ方法で設定できるかどうか誰かが知っていますか。これを行う他の方法やテクニックも役立ちます
これまでのところ、キーを正常にエクスポートできませんでした。
私はそれを考え出した。
これを行うには、Wiresharkソースコードの最新バージョンをダウンロードする必要があります。 Wireshark 2.0.1でテストを実行しました
Wiresharkソースフォルダーのファイル-epan/dissectors/packet-ssl-utils.cに変更を加える必要があります。
3179〜3194行目から変数をファイルに出力します。
クライアントの書き込みキー、サーバーの書き込みキー、クライアントのMACキー、サーバーのMACキー、クライアントIVおよびサーバーIVが表示されます)
Cでファイルに書き込むには、これを使用します
ファイル:_*fptr;
_ fptr = fopen("directory you want to open a file in", "a+");
fprintf("data"); // this will write data to the file
注-より客観的な方法で行うには、次の関数を変更して作成します
_void custom_ssl_print_data(const gchar* name, const guchar* data, size_t len){
//Write the following lines
File *ssl_debug_file;
ssl_debug_file=fopen("directory you want to open the file in","a+");
//Copy original functionality from line 4927
}
void custom_ssl_print_string(const gchar* name, const StringInfo* data){
//Copy original functionality from line 4953
}
_
これらの関数を使用して、キーをファイルにエクスポートします。
メインのWiresharkソースフォルダーに移動します。
実行:
_./autogen.sh
./configure
Sudo make
Sudo make install
_
ターミナルでWiresharkを実行します。 (SSLKEYLOGFILE環境変数をエクスポートして、プリマスターシークレットファイルをWiresharkにフィードする必要があります)
6つのキーは、マスターシークレット、クライアントランダム、およびサーバーランダムから導出されます。 SSLKEYLOGFILEからマスターシークレットとクライアントをランダムに取得できます。サーバーの鍵交換メッセージからWiresharkでサーバーをランダムに探知できると思います。
それらがある場合は、いくつかの ライブラリ関数 または script を呼び出して6つのキーを取得できます。
これが機能する方法は、HMACが乱数とマスターシークレットに対して計算され、結果が6つのシークレットを取得するために部分的にカットされることです。
キーマテリアルを生成するには、
key_block = PRF(SecurityParameters.master_secret, "key expansion", SecurityParameters.server_random + SecurityParameters.client_random);
十分な出力が生成されるまで。次に、key_blockは
次のように分割:client_write_MAC_key[SecurityParameters.mac_key_length] server_write_MAC_key[SecurityParameters.mac_key_length] client_write_key[SecurityParameters.enc_key_length] server_write_key[SecurityParameters.enc_key_length] client_write_IV[SecurityParameters.fixed_iv_length] server_write_IV[SecurityParameters.fixed_iv_length]
より詳しい情報: