原文链接:https://www.trickster.dev/post/decrypting-your-own-https-traffic-with-wireshark/
在后斯诺登时代,HTTP 消息通常不会以明文形式发送。相反,TLS 协议用于提供通信安全,防止基于 HTTP 协议的通信被篡改和监视。TLS 本身是相当复杂的协议,由几个子协议组成,但让我们将其视为 TCP 连接之上的加密和身份验证层,它还通过公钥加密进行一些服务器(以及可选的客户端)验证。
在这篇博客中,我们之前讨论过设置 mitmproxy 来拦截移动应用程序与其后端系统之间的 HTTPS 通信。但是,我们可能还想看看桌面应用程序在交流什么。此外,我们可能希望更深入地对 Web 应用程序的私有 API 进行逆向工程,并希望超越 Chrome DevTools 的限制。这就是我们求助于Wireshark的地方——一个用于数据包嗅探和分析的 GUI 工具。我们可以使用此工具深入了解应用程序在网络上的具体操作。
但是,如果我们在没有任何准备的情况下尝试嗅探 HTTPS,我们将无法走得更远,因为 TLS 协议正在做的工作是防止对手通过嗅探网络来读取通信内容。
但是,如果我们控制其中一个端点(即带有 Web 浏览器的桌面系统),我们可以将 SSLKEYLOGFILE
环境变量设置为我们可以访问的文本文件的路径。实现 TLS 的软件通常(尽管并非总是)会将密钥和其他 TLS 机密写入此文件。这适用于 curl、Chrome、Firefox 和许多使用 NSS/OpenSSL 库的桌面应用程序。如果配置正确,Wireshark 将能够读取此文件并解密截获的 TLS 数据包。这是会话密钥的客户端捕获。
我们究竟如何设置环境变量?这取决于操作系统以及我们是否要涵盖所有已安装的应用程序。在使用 Bash 的 Linux/Unix 上,我们可以简单地将以下行放入 ~/.bashrc 或 ~/.bash_profile 文件中:
1 |
export SSLKEYLOGFILE=~/.sslkeyfile |
但是,这仅涵盖直接从 shell 启动的程序。在 Linux 上,我们可以编辑 /etc/environment(或 /etc/profile)并重新启动以全局设置环境变量。
在 macOS 上,它有点复杂。首先,我们需要检查 ~/Library/LaunchAgents 目录是否存在,如果不存在,则在我们的普通用户下创建它。然后我们创建一个包含以下内容的属性列表文件(例如 tlskeylogger.plist):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Label</key> <string>sslkeylogger</string> <key>ProgramArguments</key> <array> <string>sh</string> <string>-c</string> <string> launchctl setenv SSLKEYLOGFILE ~/.sslkeyfile </string> </array> <key>RunAtLoad</key> <true/> </dict> </plist> |
要在下次重新启动时加载它,我们运行以下命令:
1 |
$ launchctl load ~/Library/LaunchAgents/tlskeylogger.plist |
在 Windows 上,您可以SSLKEYLOGFILE
通过 GUI 设置环境变量,方法是在 Windows 菜单中找到“Edit environment variables for your account”并为当前用户创建一个新的环境变量。
完成后,我们应该重新启动浏览器和/或其他通过 HTTPS 通信的软件。如果一切正常,文件应该开始填充类似于以下内容的行:
1 2 3 4 5 6 7 8 |
# SSL/TLS secrets log file, generated by NSS CLIENT_HANDSHAKE_TRAFFIC_SECRET 7f6e75485ed674e16c83481963f9d65a072c113069d3349639018cdebe5ec154 8cc7626c1516d379e7ba10334b7161b1b95ee2b4455513289ee031d78c007038 SERVER_HANDSHAKE_TRAFFIC_SECRET 7f6e75485ed674e16c83481963f9d65a072c113069d3349639018cdebe5ec154 9cfb00bc3004427de3bbfe005fb32d835cf56ff3c24c3299f5c817f8c8774f0f CLIENT_RANDOM bea906bf19bf67d0ef1ff7de604f470a73e4ad00a89f62c51adc903c78836342 aadd7d3defb78946d1a22992c9ede2b00a7a4f3add8ce2a3252000818c031887a044358e40665807d6ec813f2fb8d173 CLIENT_TRAFFIC_SECRET_0 7f6e75485ed674e16c83481963f9d65a072c113069d3349639018cdebe5ec154 da25a93b3167179088ebf35b8415bd4f48f0e558ee7db442ed83fba1e31693b9 SERVER_TRAFFIC_SECRET_0 7f6e75485ed674e16c83481963f9d65a072c113069d3349639018cdebe5ec154 4de128f1ab06148bb9faee99e3be590a1c9fd27261dc255de8ec7d59bfa2eccd EXPORTER_SECRET 7f6e75485ed674e16c83481963f9d65a072c113069d3349639018cdebe5ec154 b1f5242bfe9853f78c41358e602ab6417864ca7fb05f3f5715a641bf263102bd ... |
我们现在准备好配置 Wireshark。这相当简单。我们所要做的就是转到(编辑->)首选项-> 协议-> TLS 并将值SSLKEYLOGFILE
放入“(预)主秘密日志文件名”。您还应该勾选有关重新组装 TLS 记录和应用程序数据的复选框。
这是一种方式。另一种方法是开始嗅探,右键单击 TLS 数据包,然后选择“Protocol Preferences -> Transport Layer Security -> (Pre-)Master Secret Log filename”并单击它。Wireshark 将在顶部打开一个文本字段,让您输入需要读取以进行解密的文件的路径。
现在我们可以看到 HTTPS 消息被解密了。这包括谷歌浏览器在打电话回母舰时进行的一些 API 调用,以及桌面 Discord 客户端对 Discord 后端的请求。
这不仅为更深入地对 Web 应用程序私有 API 进行逆向工程提供了可能性,而且还可以对桌面应用程序进行相同类型的研究,以实现数据抓取、自动化、漏洞研究和隐私分析等目的。