使用Wireshark解密Chrome和Curl的TLS包

2,139 阅读2分钟

1.原理

本文主要介绍如何解密Chrome浏览器或Curl的TLS请求。原理是:设置环境变量SSLKEYLOGFILE,Chrome(Curl)就会输出TLS握手过程中协商出来用于数据传输加密的密钥。Wireshark读取 这个密钥就可以对传输的数据进行解密了。

2. 准备

  1. 在Home目录创建一个文件,用于TLS握手中间过程输出的关键数据:touch sshkeylog.log

  2. export环境变量SSLKEYLOGFILE,这样浏览器的TLS握手信息才会输出:export SSLKEYLOGFILE=~/sshkeylog.log (注意⚠️:这个路径,当前的用户需要有读写权限,放置在用户Home目录即可)

  3. 配置Wireshark,【Preferences】-> 【Protocols】-> 【TLS】-> 【(Pre)-Master-Secret】

image.png

3. 抓Chrome的包

步骤如下:

(1) 关闭浏览器,然后重新打开:open -a 'Google Chrome' (启动前需要配置环境变量:export SSLKEYLOGFILE=/sshkeylog.log );或直接运行也可以:SSLKEYLOGFILE=/sshkeylog.log open -a 'Google Chrome'

演示抓知乎的数据包,首先这只捕获的参数:host www.zhihu.com

image-20201221213714543.png

(2) 过滤一下http2的流量出来,因为http2一定是使用TLS加密的。我们可以看到原始的数据内容了。注意,这里需要使用http2的filter,不能使用http,否则看不到报文内容。 image-20201221214048935.png

4. 抓Curl的包

  • 执行curl的时候,加上环境变量即可:SSLKEYLOGFILE=~/sshkeylog.log curl https://www.zhihu.com

为什么curl也支持这个环境变量呢,是因为:所有使用Libcurl构建的应用(curl也是基于这个库开发的),都可以设置环境变量SSLKEYLOGFILE来获取TLS握手协商出来的密钥,去解析TLS的包。所以,检查一下你的应用是否支持Libcurl。

curl --version curl 7.64.1 (x86_64-apple-darwin20.0) libcurl/7.64.1 (SecureTransport) LibreSSL/2.8.3 zlib/1.2.11 nghttp2/1.41.0 Release-Date: 2019-03-27 Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp Features: AsynchDNS GSS-API HTTP2 HTTPS-proxy IPv6 Kerberos Largefile libz MultiSSL NTLM NTLM_WB SPNEGO SSL UnixSockets