使用 tcpdump 仅捕获 ssl 握手
Capture only ssl handshake with tcpdump
我有一台服务器,许多客户端使用 SSL 连接到该服务器。最近我在服务器日志中观察到 SSL 握手错误(例如 SSL MAC 错误)。错误本身并不重要,但我想看看为什么有些客户端可以连接而有些客户端连接失败,并且还需要确定哪些客户端连接失败。
为了调试这个问题,我想捕获服务器上发生的所有 SSL 握手,因为我不知道有问题的客户端何时连接,所以我不想在发生这种情况之前捕获所有流量。我只想捕获所有 SSL 握手,然后使用 Wireshark 对其进行分析。假设我只能访问 tcpdump 而没有其他捕获工具。
我不知道你所说的握手到底是什么,但我建议这个命令可能会捕获你想要的 95% 以上的内容:
tcpdump -ni eth0 "tcp port 443 and (tcp[((tcp[12] & 0xf0) >> 2)] = 0x16)"
现在它做了什么:
- eth0: 是我的网络接口,有需要就改
- tcp 端口 443: 我想这是你的服务器监听的端口,如果你需要改变它
- tcp[((tcp[12] & 0xf0) >> 2)] = 0x16:有点棘手,让我们在下面详细说明
tcp[12]
表示抓取tcp包的第13个字节,对应前半部分为offset,后半部分为reserved。
偏移量乘以 4 得到 TCP 的字节数 header,意思是 ((tcp[12] & 0xf0) >> 2)
提供 TCP 的大小 header.
TLS 数据包的第一个字节定义了内容类型。值 22(十六进制的 0x16)已被定义为 "Handshake" 内容。
因此,tcp[((tcp[12] & 0xf0) >> 2)] = 0x16
捕获在 TCP header 设置为 0x16
后第一个字节的每个数据包。
可以执行更多过滤,但这严格回答了您的问题。
我认为接受的答案是使用脆弱解决方案的过早优化。
建立连接后立即进行 SSL 握手。
简单的方法:在客户端连接到远程主机之前开始捕获,并捕获第一个完整的 N 个数据包。
例如,对于 300 个数据包:
/usr/sbin/tcpdump -i eth0 -p -s 65535 -c 300 "tcp and host 1.2.3.4 and port 443"
通过这种方式,wireshark 拥有 SSL 握手的完整有效载荷,可以对其进行解码并向您显示所有位。
如果你也想抢SQL Server encryption那么你还需要看+8.
tcp[((tcp[12] & 0xf0) >> 2)] = 0x16 or (tcp port 1433 and tcp[((tcp[12] & 0xf0) >> 2) + 8] = 0x16)
我有一台服务器,许多客户端使用 SSL 连接到该服务器。最近我在服务器日志中观察到 SSL 握手错误(例如 SSL MAC 错误)。错误本身并不重要,但我想看看为什么有些客户端可以连接而有些客户端连接失败,并且还需要确定哪些客户端连接失败。
为了调试这个问题,我想捕获服务器上发生的所有 SSL 握手,因为我不知道有问题的客户端何时连接,所以我不想在发生这种情况之前捕获所有流量。我只想捕获所有 SSL 握手,然后使用 Wireshark 对其进行分析。假设我只能访问 tcpdump 而没有其他捕获工具。
我不知道你所说的握手到底是什么,但我建议这个命令可能会捕获你想要的 95% 以上的内容:
tcpdump -ni eth0 "tcp port 443 and (tcp[((tcp[12] & 0xf0) >> 2)] = 0x16)"
现在它做了什么:
- eth0: 是我的网络接口,有需要就改
- tcp 端口 443: 我想这是你的服务器监听的端口,如果你需要改变它
- tcp[((tcp[12] & 0xf0) >> 2)] = 0x16:有点棘手,让我们在下面详细说明
tcp[12]
表示抓取tcp包的第13个字节,对应前半部分为offset,后半部分为reserved。
偏移量乘以 4 得到 TCP 的字节数 header,意思是 ((tcp[12] & 0xf0) >> 2)
提供 TCP 的大小 header.
TLS 数据包的第一个字节定义了内容类型。值 22(十六进制的 0x16)已被定义为 "Handshake" 内容。
因此,tcp[((tcp[12] & 0xf0) >> 2)] = 0x16
捕获在 TCP header 设置为 0x16
后第一个字节的每个数据包。
可以执行更多过滤,但这严格回答了您的问题。
我认为接受的答案是使用脆弱解决方案的过早优化。
建立连接后立即进行 SSL 握手。
简单的方法:在客户端连接到远程主机之前开始捕获,并捕获第一个完整的 N 个数据包。
例如,对于 300 个数据包:
/usr/sbin/tcpdump -i eth0 -p -s 65535 -c 300 "tcp and host 1.2.3.4 and port 443"
通过这种方式,wireshark 拥有 SSL 握手的完整有效载荷,可以对其进行解码并向您显示所有位。
如果你也想抢SQL Server encryption那么你还需要看+8.
tcp[((tcp[12] & 0xf0) >> 2)] = 0x16 or (tcp port 1433 and tcp[((tcp[12] & 0xf0) >> 2) + 8] = 0x16)