简介
在这个实验中,你将学习如何使用知名的网络协议分析器 Wireshark 来解密 SSL/TLS 流量。SSL/TLS 加密通常用于保护互联网通信。然而,在某些情况下,如故障排除或安全分析,解密加密流量就变得至关重要。
本实验将引导你完成配置 Wireshark 以解密 SSL/TLS 流量的过程。它将让你在可控环境中获得实践经验。
在这个实验中,你将学习如何使用知名的网络协议分析器 Wireshark 来解密 SSL/TLS 流量。SSL/TLS 加密通常用于保护互联网通信。然而,在某些情况下,如故障排除或安全分析,解密加密流量就变得至关重要。
本实验将引导你完成配置 Wireshark 以解密 SSL/TLS 流量的过程。它将让你在可控环境中获得实践经验。
在这一步中,我们将配置 Wireshark 以解密 SSL/TLS 流量。但首先,让我们先了解一下我们要做的事情。SSL/TLS 是一种用于保护互联网通信安全的协议。当使用 SSL/TLS 通过互联网发送数据时,数据会被加密以保护其机密性。为了解密这些流量并查看实际数据,Wireshark 需要访问加密密钥。这些密钥存储在一个名为预主密钥日志文件(pre - master secret log file)的特殊文件中。我们现在就来创建这个文件。
Wireshark 需要访问加密密钥才能解密 TLS 流量。这些密钥存储在所谓的预主密钥日志文件中,我们现在就来创建这个文件。
打开一个终端。终端是一个基于文本的界面,你可以在其中输入命令与计算机的操作系统进行交互。终端打开后,我们将在 /home/labex/project/
目录下创建一个名为 pre_master_secret.log
的新文件。这个文件将用于存储解密所需的 TLS 会话密钥。要创建该文件,请在终端中输入以下命令:
touch /home/labex/project/pre_master_secret.log
此命令会创建一个空文件,稍后将用于存储解密所需的 TLS 会话密钥。
现在我们已经准备好了日志文件,接下来需要配置 Wireshark 使用它。首先,在终端中输入以下命令打开 Wireshark:
wireshark
Wireshark 打开后,你会在顶部看到一个菜单栏。点击 Edit > Preferences
。这将打开一个窗口,你可以在其中自定义 Wireshark 的各种设置。在“首选项”窗口中,查看左侧面板。有一个名为 Protocols
的部分。点击它,然后向下滚动,直到找到 TLS
。
在 TLS 设置中,有一个名为 (Pre)-Master-Secret log filename
的字段。我们要在这里告诉 Wireshark 我们刚刚创建的预主密钥日志文件的位置。输入文件的完整路径:
/home/labex/project/pre_master_secret.log
窗口应该类似于这样:

输入路径后,点击 OK
保存更改。现在,Wireshark 已配置为使用此文件来解密 TLS 流量。这意味着当你捕获 SSL/TLS 流量时,Wireshark 将能够使用日志文件中的密钥来解密数据并向你显示实际内容。
在这一步中,我们将使用 Wireshark 捕获 SSL/TLS 流量,并通过 Python 脚本生成安全流量。SSL/TLS 是一种用于在网络上提供安全通信的协议。捕获这些流量能让我们后续对其进行分析,这对于调试网络问题或检测安全威胁等任务非常重要。
让我们从捕获网络流量开始。在 Wireshark 中,网络接口是计算机发送和接收数据的连接通道。你需要选择合适的接口来捕获你感兴趣的流量。找到可用网络接口列表,点击 eth1
接口进行选择。我们要捕获的流量将通过这个接口传输。然后,点击工具栏中的 Start
按钮(蓝色的鲨鱼鳍图标)开始捕获数据包。
此时,Wireshark 将捕获所选接口上的所有网络流量。在捕获过程中,你会看到数据包开始出现在主窗口中。每个数据包代表通过网络传输的一小段数据。
现在,我们需要生成一些可以分析的 SSL/TLS 流量。打开一个新的终端窗口。终端是一个命令行界面,你可以在其中运行命令与计算机进行交互。使用以下命令导航到项目目录:
cd /home/labex/project/
此命令将当前工作目录更改为项目目录。我们将创建一个 Python 脚本,用于与一个网站建立安全连接。Python 是一种编程语言,我们可以用它编写脚本来执行各种任务。使用 nano 文本编辑器创建一个名为 tls_client.py
的新文件:
nano tls_client.py
nano 文本编辑器是终端中一个简单易用的文本编辑器。将以下 Python 代码复制并粘贴到编辑器中:
#!/usr/bin/env python3
import ssl
import socket
import os
HOST = "example.com"
PORT = 443
## Set the path for the pre-master secret log file
os.environ['SSLKEYLOGFILE'] = '/home/labex/project/pre_master_secret.log'
## Create an SSL/TLS context
context = ssl.create_default_context(ssl.Purpose.SERVER_AUTH)
## Create a socket and wrap it with SSL/TLS
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
with context.wrap_socket(sock, server_hostname=HOST) as ssock:
ssock.connect((HOST, PORT))
## Send a simple HTTP GET request
request = "GET / HTTP/1.1\r\nHost: example.com\r\n\r\n"
ssock.sendall(request.encode())
## Receive the response and print all the received data
data = ssock.recv(4096)
print(data.decode())
这个脚本的功能如下:
ssl
和 socket
库来建立此连接。按 Ctrl+O
保存文件,然后按 Enter
,再按 Ctrl+X
退出 nano。
现在运行脚本以生成 TLS 流量:
python3 tls_client.py
你应该会看到来自 example.com 的 HTTP 响应,这表明脚本已成功建立安全连接。脚本还将 TLS 会话密钥写入了我们的预主密钥日志文件,Wireshark 将使用该文件进行解密。
输出大致如下:
HTTP/1.1 200 OK
Age: 558804
Cache-Control: max-age=604800
Content-Type: text/html; charset=UTF-8
Date: ...
...
现在我们已经生成了 TLS 流量,回到 Wireshark,点击工具栏中的红色 Stop
按钮停止捕获。停止捕获是为了保存捕获的流量。
要保存捕获的流量以便进行分析,点击菜单栏中的 File
,然后选择 Save As...
。在保存对话框中,导航到 /home/labex/project/
,将文件命名为 tls_traffic.pcapng
,然后点击 Save
。.pcapng
文件格式是保存网络流量捕获的标准格式。
你捕获的流量现在已保存好,可用于下一步的分析。
在这一步中,我们将使用 Wireshark 的过滤和分析工具来分析解密后的 SSL/TLS 流量。这些工具对于从大量的网络流量数据中提取有意义的信息至关重要。
首先,我们来应用一个过滤器,聚焦于 TLS 握手的特定部分。TLS 握手是客户端与服务器之间建立安全连接的关键初始过程。在此过程中,客户端和服务器会交换信息,以商定加密算法、密钥和其他安全参数。
在过滤工具栏(Wireshark 窗口顶部的文本输入框)中输入以下表达式:
tls.handshake.type == 1
这个过滤表达式用于根据 TLS 握手的类型选择数据包。值 1
对应于 Client Hello
数据包。按 Enter
键应用过滤器。应用过滤器后,Wireshark 将只显示 Client Hello
数据包,这些是客户端为启动 TLS 握手而发送的初始数据包。
现在你应该只会看到符合此过滤器的数据包。通过缩小显示的数据包范围,你可以更轻松地聚焦于 TLS 连接的开始阶段,了解安全通信是如何启动的。
要查看解密后的内容,我们来跟踪 TLS 流。在过滤列表中的任何数据包上右键单击,然后从上下文菜单中选择 Follow
> TLS Stream
。此操作会告诉 Wireshark 根据所选数据包重建整个 TLS 会话,并显示解密后的数据。
一个新窗口将打开,显示解密后的数据。这些数据代表了通过安全连接传输的实际 HTTP 通信内容。由于我们的预主密钥日志文件中存储了 TLS 会话密钥,Wireshark 能够解密并显示这些通常是加密状态的数据。
解密后的数据将显示我们的 Python 脚本发送的 HTTP 请求以及服务器的 HTTP 响应。你可以看到头部信息、内容类型以及响应的实际 HTML 内容。这些信息对于理解客户端和服务器之间的通信非常有价值,例如请求了哪些数据以及返回了哪些数据。
让我们保存这些解密后的数据,以便进一步分析。在“Follow TLS Stream”窗口中,点击 Save as...
按钮。保存数据可以让你稍后回顾、与他人分享或进行额外的分析。
在保存对话框中,导航到 /home/labex/project/
,将文件命名为 decrypted_data.txt
,然后点击 Save
。
你现在已经成功捕获、解密并保存了用于分析的 TLS 流量。解密后的数据文件包含了最初使用 TLS 加密的完整 HTTP 通信内容。
完成后,你可以关闭“Follow TLS Stream”窗口。如果你想进一步探索,可以尝试使用不同的 Wireshark 过滤器来检查捕获流量的其他方面。例如,过滤器 http
将仅显示解密后的 HTTP 流量。通过这种方式,你可以更深入地研究通过网络传输的特定类型的数据。
在这个实验中,你学习了如何使用 Wireshark 解密 SSL/TLS 流量。你创建了一个预主密钥日志文件来存储 TLS 会话密钥,配置 Wireshark 使用该文件进行解密,并通过 Python 脚本生成了 SSL/TLS 流量。然后,你使用 Wireshark 的过滤和跟踪流功能分析了解密后的流量。
这些技能对于网络故障排除、安全分析以及理解安全通信至关重要。在可控环境中解密和分析 TLS 流量有助于你更好地理解网络协议,并发现加密通信中的问题。请记住,在现实场景中,解密 TLS 流量需要获得适当的授权,并且只能在授权的网络上进行,以避免违反隐私法律。