LoginSignup
7
6

curlコマンドのTLS通信をWiresharkで復号する

Last updated at Posted at 2023-07-22

はじめに

 HTTPS通信はTLSで暗号化されるので,パケットキャプチャしても暗号化前の通信は解読できません。ただ,HTTPS通信の中身をやっぱり見てみたくなることがあります。このような場合,共通鍵(セッション鍵)をcurlの機能で記録し,Wiresharkに共通鍵を認識させることで,TLS通信の内容を解読できます。

テスト環境

キャプチャ取得環境

  • ubuntu22.04
  • curl 7.81.0 (x86_64-pc-linux-gnu) libcurl/7.81.0 OpenSSL/3.0.2 zlib/1.2.11 brotli/1.0.9 zstd/1.4.8 libidn2/2.3.2 libpsl/0.21.0 (+libidn2/2.3.2) libssh/0.9.6/openssl/zlib nghttp2/1.43.0 librtmp/2.3 OpenLDAP/2.5.14
  • Wireshark 3.6.2 (Git v3.6.2 packaged as 3.6.2-2)

キャプチャ解析環境

  • wireshark(Windows版4.0.7)

curlコマンド実行

  • あらかじめ裏でWiresharkやtcpdumpを起動し,パケットキャプチャを開始します。
  • SSLKEYLOGFILE環境変数に,共通鍵を保管するファイル名を設定してcurlコマンドを実行します。
$ SSLKEYLOGFILE=/path/to/key.log curl https://example.jp/
  • パケットキャプチャを停止し,pcapng/pcapファイルとして保存します。
  • SSLKEYLOGFILEで指定したパスに,key.logファイルが保存されたことを確認します。

WiresharkでTLSを復号

  • pcapng/pcapファイルをWiresharkで開きます。この時点では,TLSで暗号化された通信は「Application Data」の状態で,内容は分かりません。
    image.png
  • SSLKEYLOGFILEファイル(key.log)を読み込ませます。「編集」→「設定」→左メニューの「Protcol」で「TLS」を選択。"(Pre)-Master-Secret log filename"の「参照」をクリックし,key.logを指定して「OK」します。
    image.png
    image.png
  • Wiresharkの表示が,復号された状態に変わります。さきほどのNo15のパケットが,「TLSv1.3 Application Data」から「HTTP GET / HTTP/1.1」に変わり,通信内容を確認できるようになりました。
    image.png

SSLKEYLOGFILEとは

 SSLKEYLOGFILEとは,TLSで使用される秘密情報をロギングする機能とログフォーマットです。RFCにドラフト提出されていますが,残念ながらexpiredでした。ただ,Expiredにはなったもののcurl,chrome,Firefoxなどに実装されています。

注意事項

  • 通常の利用でSSLKEYLOGFILE環境変数を有効にするのは危険なので避けてください。通信経路を盗聴される,かつ保存したファイルが漏えいすると,TLSでの暗号化通信が解読されてしまうからです。

参考文献

curl公式
The SSLKEYLOGFILE Format for TLS
Reading sniffed SSL/TLS traffic from curl with Wireshark
TLSの復号に用いる SSLKEYLOGFILE のフォーマット提案仕様
【Wireshark/Tshark】ブラウザのTLS通信をキャプチャ

7
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
6