使用 Wireshark 确定 SSL/TLS 版本

信息安全 加密 tls 线鲨 sql服务器
2021-08-30 22:41:49

使用 Wireshark,我试图确定 SSL/TLS 的版本,该版本与运行 SQL Server 的同一 LAN 上的客户端工作站和另一个工作站之间的数据加密一起使用。有关此主题的文档建议查看 ServerHello 和 ClientHello 消息,但我在 Wireshark 消息提要中看不到任何此类消息。我正在使用这个显示过滤器:

tcp.len>1 && tcp.port==1433

我可以确认正在发生数据加密,并且使用上述过滤器显示的数据包与我要检查的 SQL Server 数据传输有关。这是 Wireshark 消息提要的样子:

在此处输入图像描述

编辑:

这是调用数据库连接并选择 Follow-->TCP Stream 后第 4 个数据包的数据包详细信息窗格:

数据包详细信息窗格

这是我在使用 Microsoft 消息分析器进行分析时看到的。TLS 详细信息窗格用于 Client Hello 数据包。

Microsoft 消息分析器主窗格

Microsoft Message Analyzer TLS 详细信息窗格

3个回答

(添加一个应该确定的新答案,留下旧答案,因为它对我们如何到达这里很有用。在评论中指出实际答案的功劳归于@P4cK3tHuNt3R 和@dave_thompson_085)

使用 Wireshark,我试图确定 SSL/TLS 的版本,该版本与运行 SQL Server 的同一 LAN 上的客户端工作站和另一个工作站之间的数据加密一起使用。

您正在查看使用MS-TDS(“表格数据流协议”)的连接:

...the Tabular Data Stream Protocol, which facilitates interaction with
a database server and provides for authentication and channel encryption
negotiation; specification of requests in SQL (including Bulk Insert);
invocation of a stored procedure, also known as a Remote Procedure Call
(RPC); returning of data; and Transaction Manager Requests. It is an 
application layer request/response protocol.

如果您查看TDS 协议文档,它会指定 SSL 数据包封装在 TDS 包装器中:

A TLS/SSL negotiation packet is a PRELOGIN (0x12) packet header encapsulated
with TLS/SSL payload.

在您发布的 Microsoft 消息分析器屏幕截图中,我们可以看到 TDS 标头(以红色框起来,以 0x12 开头),几个字节后是 TLS CLIENT_HELLO 数据包(以蓝色框起来,以 0x16 0x03 0x03 开头):

TDS 和封装的 TLS 标头

  • 0x16 是 TLS“握手”标头指示符,
  • 0x03 0x03是 TLS 版本(TLS 1.2,根据RFC 5246):

    正在使用的协议版本。本文档描述了使用版本 {3, 3} 的 TLS 版本 1.2。版本值 3.3 是历史的,源自对 TLS 1.0 使用 {3, 1}。

因此,您的问题“确定 SSL/TLS 的版本”的简单答案是“TLS 1.2”。

现在,我看到了关于 Wireshark 是否可以正确解析带有编码 TLS 的 TDS 数据包的各种报告。我认为答案是你开始的 - 它会告诉你 TLS 在那里,但不会像使用原生 TLS 会话那样解析细节。

根据这个 StackOverflow question,微软网络监视器似乎能够解析两个封装级别。其中的一条评论指出,Microsoft Message Analyzer是该工具的更新版本。

我只是在 Wireshark 中使用这个过滤器来查找 TLS 1.0 流量:

ssl.handshake.version==0x0301

0x0302是 TLS 1.1 并且0x0303是 TLS 1.2。

(忽略这个答案,我要离开历史数据,并阅读我的另一个答案,它解释了实际发生的事情)

将示例数据包添加到问题后更新 -

您提供的数据包显然不是 TLS 数据包。查看您提供的十六进制,TCP 数据的前三个八位字节是12 01 00,但对于 TLS 数据包,前三个字节应该是16 03 0X,其中 0x16 表示 TLS“握手”记录类型,0x03 表示 SSLv3/TLSv1.*,和0x0X 表示 TLS 版本 - 0x01 表示 TLS 1.0,0x02 表示 TLS 1.1,0x03 表示 TLS 1.2。

此外,数据包中有一个明文“sqlexpress2012”字符串,如果这是一个 TLS 客户端 Hello,则不会存在该字符串。

提供的数据包的标记副本

(我如何确定12 01 00数据的开头?数据包的前 14 个字节是以太网标头。接下来的 20 个字节是 IP 标头。TCP 标头的第 13 个字节是 0x50,该字节的第一个半字节乘以 4 是 TCP 标头长度,所以 5*4 = 20。所以实际数据的第一个12 01 00 6c 00 00 ...字节从 54 字节开始

因此,如果 Wireshark 不会将其显示为 TLS,那是因为它不是。您应该重新访问您的服务器配置。


原答案:

因为这些数据包不在标准 TLS 端口(例如 443)上,所以您需要告诉 Wireshark 将它们解释为 TLS 数据包。默认情况下,端口 1433 不被解释为具有 TLS;TDS 的默认设置是未加密的。因此,Wireshark 本身不会将其解析为 TLS:

Wireshark 默认解码端口 1433

为了改变这一点,右键单击一个数据包并选择“解码为”。确保端口“值”设置为 1433,然后将“当前”设置为 SSL:

Wireshark“解码为”对话框

单击确定,当您返回数据包时,您会看到它们现在被更详细地解释:

开启 SSL 解码的数据包

最后,如果您查看其中一个数据包的详细信息窗格(我建议使用服务器 hello,而不是客户端 hello,以防协议被调整),您将非常清楚地看到 TLS 版本:

显示 TLS 版本的数据包详细信息