在 Wireshark 中解密 SSL/TLS 流量

WiresharkWiresharkBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在这个实验中,你将学习如何使用知名的网络协议分析器 Wireshark 来解密 SSL/TLS 流量。SSL/TLS 加密通常用于保护互联网通信。然而,在某些情况下,如故障排除或安全分析,解密加密流量就变得至关重要。

本实验将引导你完成配置 Wireshark 以解密 SSL/TLS 流量的过程。它将让你在可控环境中获得实践经验。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL wireshark(("Wireshark")) -.-> wireshark/WiresharkGroup(["Wireshark"]) wireshark/WiresharkGroup -.-> wireshark/installation("Installation and Setup") wireshark/WiresharkGroup -.-> wireshark/interface("Interface Overview") wireshark/WiresharkGroup -.-> wireshark/packet_capture("Packet Capture") wireshark/WiresharkGroup -.-> wireshark/display_filters("Display Filters") wireshark/WiresharkGroup -.-> wireshark/follow_tcp_stream("Follow TCP Stream") wireshark/WiresharkGroup -.-> wireshark/decrypt_ssl_tls("Decrypting SSL/TLS") subgraph Lab Skills wireshark/installation -.-> lab-415943{{"在 Wireshark 中解密 SSL/TLS 流量"}} wireshark/interface -.-> lab-415943{{"在 Wireshark 中解密 SSL/TLS 流量"}} wireshark/packet_capture -.-> lab-415943{{"在 Wireshark 中解密 SSL/TLS 流量"}} wireshark/display_filters -.-> lab-415943{{"在 Wireshark 中解密 SSL/TLS 流量"}} wireshark/follow_tcp_stream -.-> lab-415943{{"在 Wireshark 中解密 SSL/TLS 流量"}} wireshark/decrypt_ssl_tls -.-> lab-415943{{"在 Wireshark 中解密 SSL/TLS 流量"}} end

在 Wireshark 中配置 SSL/TLS 解密

在这一步中,我们将配置 Wireshark 以解密 SSL/TLS 流量。但首先,让我们先了解一下我们要做的事情。SSL/TLS 是一种用于保护互联网通信安全的协议。当使用 SSL/TLS 通过互联网发送数据时,数据会被加密以保护其机密性。为了解密这些流量并查看实际数据,Wireshark 需要访问加密密钥。这些密钥存储在一个名为预主密钥日志文件(pre - master secret log file)的特殊文件中。我们现在就来创建这个文件。

Wireshark 需要访问加密密钥才能解密 TLS 流量。这些密钥存储在所谓的预主密钥日志文件中,我们现在就来创建这个文件。

  1. 打开一个终端。终端是一个基于文本的界面,你可以在其中输入命令与计算机的操作系统进行交互。终端打开后,我们将在 /home/labex/project/ 目录下创建一个名为 pre_master_secret.log 的新文件。这个文件将用于存储解密所需的 TLS 会话密钥。要创建该文件,请在终端中输入以下命令:

    touch /home/labex/project/pre_master_secret.log

    此命令会创建一个空文件,稍后将用于存储解密所需的 TLS 会话密钥。

  2. 现在我们已经准备好了日志文件,接下来需要配置 Wireshark 使用它。首先,在终端中输入以下命令打开 Wireshark:

    wireshark

    Wireshark 打开后,你会在顶部看到一个菜单栏。点击 Edit > Preferences。这将打开一个窗口,你可以在其中自定义 Wireshark 的各种设置。在“首选项”窗口中,查看左侧面板。有一个名为 Protocols 的部分。点击它,然后向下滚动,直到找到 TLS

    在 TLS 设置中,有一个名为 (Pre)-Master-Secret log filename 的字段。我们要在这里告诉 Wireshark 我们刚刚创建的预主密钥日志文件的位置。输入文件的完整路径:

    /home/labex/project/pre_master_secret.log

    窗口应该类似于这样:

    ![Wireshark TLS Preferences](https://file.labex.io/namespace/33fa8aba-d546-42e9-9692-64968aeaf0cc/cybersecurity/ws_decrypt_ssl_tls/lab-cipher-quest-tls-decrypting-guide/zh/../assets/lab - CipherQuestTLSDecryptingGuide - step1 - image1.png)

    输入路径后,点击 OK 保存更改。现在,Wireshark 已配置为使用此文件来解密 TLS 流量。这意味着当你捕获 SSL/TLS 流量时,Wireshark 将能够使用日志文件中的密钥来解密数据并向你显示实际内容。

捕获 SSL/TLS 流量

在这一步中,我们将使用 Wireshark 捕获 SSL/TLS 流量,并通过 Python 脚本生成安全流量。SSL/TLS 是一种用于在网络上提供安全通信的协议。捕获这些流量能让我们后续对其进行分析,这对于调试网络问题或检测安全威胁等任务非常重要。

  1. 让我们从捕获网络流量开始。在 Wireshark 中,网络接口是计算机发送和接收数据的连接通道。你需要选择合适的接口来捕获你感兴趣的流量。找到可用网络接口列表,点击 eth1 接口进行选择。我们要捕获的流量将通过这个接口传输。然后,点击工具栏中的 Start 按钮(蓝色的鲨鱼鳍图标)开始捕获数据包。

    此时,Wireshark 将捕获所选接口上的所有网络流量。在捕获过程中,你会看到数据包开始出现在主窗口中。每个数据包代表通过网络传输的一小段数据。

  2. 现在,我们需要生成一些可以分析的 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())

    这个脚本的功能如下:

    • 设置一个环境变量,指定保存 TLS 会话密钥的位置。这些密钥对于后续解密 SSL/TLS 流量至关重要。
    • 与 example.com 建立安全连接。使用 sslsocket 库来建立此连接。
    • 发送一个基本的 HTTP 请求。该请求向服务器请求 example.com 的主页。
    • 接收并显示服务器的响应。

    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: ...
    ...
  3. 现在我们已经生成了 TLS 流量,回到 Wireshark,点击工具栏中的红色 Stop 按钮停止捕获。停止捕获是为了保存捕获的流量。

    要保存捕获的流量以便进行分析,点击菜单栏中的 File,然后选择 Save As...。在保存对话框中,导航到 /home/labex/project/,将文件命名为 tls_traffic.pcapng,然后点击 Save.pcapng 文件格式是保存网络流量捕获的标准格式。

    Save Captured Traffic

    你捕获的流量现在已保存好,可用于下一步的分析。

分析解密后的 SSL/TLS 流量

在这一步中,我们将使用 Wireshark 的过滤和分析工具来分析解密后的 SSL/TLS 流量。这些工具对于从大量的网络流量数据中提取有意义的信息至关重要。

  1. 首先,我们来应用一个过滤器,聚焦于 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 内容。这些信息对于理解客户端和服务器之间的通信非常有价值,例如请求了哪些数据以及返回了哪些数据。

  2. 让我们保存这些解密后的数据,以便进一步分析。在“Follow TLS Stream”窗口中,点击 Save as... 按钮。保存数据可以让你稍后回顾、与他人分享或进行额外的分析。

    在保存对话框中,导航到 /home/labex/project/,将文件命名为 decrypted_data.txt,然后点击 Save

    Save Decrypted Data

    你现在已经成功捕获、解密并保存了用于分析的 TLS 流量。解密后的数据文件包含了最初使用 TLS 加密的完整 HTTP 通信内容。

    完成后,你可以关闭“Follow TLS Stream”窗口。如果你想进一步探索,可以尝试使用不同的 Wireshark 过滤器来检查捕获流量的其他方面。例如,过滤器 http 将仅显示解密后的 HTTP 流量。通过这种方式,你可以更深入地研究通过网络传输的特定类型的数据。

总结

在这个实验中,你学习了如何使用 Wireshark 解密 SSL/TLS 流量。你创建了一个预主密钥日志文件来存储 TLS 会话密钥,配置 Wireshark 使用该文件进行解密,并通过 Python 脚本生成了 SSL/TLS 流量。然后,你使用 Wireshark 的过滤和跟踪流功能分析了解密后的流量。

这些技能对于网络故障排除、安全分析以及理解安全通信至关重要。在可控环境中解密和分析 TLS 流量有助于你更好地理解网络协议,并发现加密通信中的问题。请记住,在现实场景中,解密 TLS 流量需要获得适当的授权,并且只能在授权的网络上进行,以避免违反隐私法律。