公众号

帮群友远程排查问题,居然有意外收获!

大家好,我是轩辕。

昨天晚上,我的知识星球里有位小伙伴反映,我开发的EasyTshark分析离线数据包文件的时候有异常。

随后我让他把数据包文件发我,结果我电脑上是正常的。此刻,程序员那句经典语录冒了出来:我这里是正常的,一定是你环境有问题。

接着我打算远程连接他电脑看看是什么个情况。

经过初步的排查,我发现他的电脑里,用tshark分析文件的时候非常缓慢,导致我这边接口超时了,正常情况下不应该这么慢才对。

于是我给他发了排查问题的常用工具procmon,来看一下tshark到底在干啥这么慢。

这一看我就发现了,tshark大量在访问SSLKEYLOGFILE.log文件,看到这个文件名,懂行的朋友估计应该知道为啥tshark这么慢了。

SSLKEYLOGFILE

先给大家介绍一下这是个什么文件?这个东西跟解密流量有关系。

正常情况下,我们通过浏览器等软件上网产生的流量基本都是使用TLS/SSL加密了的,当你用Wireshark等工具抓包的时候,抓下来的都是加密后的报文,在抓包软件下面看到就是各种Application Data了。

比如这是我访问百度产生的TLS连接:

除了前面TCP三次握手和TLS握手阶段,后面传输的数据都是无法解析的加密数据。

那有没有办法可以对这个数据解密呢?

其实是有办法的,我之前对于HTTPS流量劫持、解密出过一些文章视频,大家可以去围观一下:

公司为啥能监控HTTPS流量:https://www.bilibili.com/video/BV167qhYpEMp/

那除了中间人安装根证书劫持的方式,还有一种办法就是通过这个SSLKEYLOGFILE机制。

SSLKEYLOGFILE是一种由部分TLS客户端支持的密钥日志记录机制,其核心功能是将会话密钥(Session Key)等关键参数写入指定文件。这些密钥信息与TLS握手过程中的随机数结合后,可推导出实际用于数据加密的对称密钥。通过将SSLKEYLOG文件提供给Wireshark等工具,即可实现离线解密已加密的TLS流量。

记录的关键参数:

  • CLIENT_RANDOM 客户端生成的随机数(Client Random),用于密钥交换过程。

  • CLIENT_EARLY_TRAFFIC_SECRET 早期数据传输阶段的主密钥(TLS 1.3+)。

  • SERVER_HANDSHAKE_TRAFFIC_SECRET 服务端握手阶段的主密钥(TLS 1.3+)。

  • EXPORTER_SECRET 会话导出密钥(用于会话恢复)。

那如何生成这个文件呢?

多数支持NSS库或OpenSSL的应用程序(如Chrome、Firefox、curl)可以通过设置环境变量启用这个功能:

复制
# Linux/macOS
export SSLKEYLOGFILE=/path/to/keylogfile.txt
# Windows(PowerShell)
$env:SSLKEYLOGFILE = "C:\path\to\keylogfile.txt"

添加环境变量之后,我们打开Wireshark来抓包,随后访问网站或者接口了,这个时候,浏览器或者curl这些软件就会把TLS/SSL握手过程中的关键信息记录到这个文件中了。

这之后我们只需要在Wireshark中,把SSLKEYLOGFILE文件给加载进来即可解密了:

可以看到,我访问百度的请求已经可以明文查看了:

不过这个过程还是有点太麻烦了,后期我打算迭代EasyTshark,让查看加密HTTPS流量的操作更加方便。

话说回来,这个为什么会导致tshark卡呢?

原来跟这位小伙伴沟通才知道,他之前用过这个功能,Wireshark里面配置了这个信息,记录到了Wireshark的配置文件中。而tshark作为它的组件,在分析数据包的过程中,也会去访问这个文件尝试解密,因此分析速度比正常慢了很多。

随后我打算删掉这个文件,让分析速度快一些,没想到出现了一幕想不到的事情:文件被某进程占用了:

ProcExp中查看了一下:

原来是某安全大厂的进程,话说它为啥要访问SSLKEYLOGFILE文件?