简介
SSLDUMP是SSLV3/TLS网络协议分析仪。它标识了TCP 所选网络接口上的连接并尝试解释它们作为SSLV3/TLS流量。当它标识SSLV3/TLS流量时解码记录并以文本形式显示以显示记录。如果 提供适当的键合材料,它也将解密连接并显示应用程序数据流量。也是如此包括JSON输出选项,支持 JA3 和IPv6。
SSLDUMP基于TCPDUMP,网络监视和数据采集工具。
安装
Kali Linux 默认已安装好 ssldump 工具了。也可以通过以下命令进行安装
sudo apt install ssldump
使用
必须以 root 权限去运行该工具。
1. -h
查看帮助文档
ssldump -h
2. 常规使用
ssldump -i eth0
3. -a
打印裸 TCP ACK(用于观察 Nagle 行为)。
ssldump -a
4. -A
打印所有记录字段(默认情况下,ssldump 会选择最有趣的字段)。
ssldump -A -i eth0
5. -d
显示应用程序数据流量。这通常意味着对其进行解密,但是当使用 -d 时,ssldump 还会在 SSL 会话启动之前解码应用程序数据流量。这允许您查看 HTTPS CONNECT 行为以及 SMTP STARTTLS。作为副作用,由于 ssldump 无法判断纯文本是 SSL 连接启动之前的流量还是只是常规 TCP 连接,因此您可以使用 ssldump 嗅探任何 TCP 连接。ssldump 将自动检测 ASCII 数据并将其直接显示在屏幕上。非 ASCII 数据显示为十六进制转储。另请参阅 -X。
ssldump -d -i eth0
6. -e
打印绝对时间戳而不是相对时间戳。
ssldump -e -i eth0
7. -F
指定执行连接池清理的数据包数量(以数据包为单位,默认值:100)。
ssldump -F 100 -i eth0
8. -H
打印完整的 SSL 数据包头。
ssldump -H -i eth0
9. -i interface
使用接口作为嗅探 SSL/TLS 流量的网络接口。
ssldump -i eth0
10. -j
将输出格式切换为 JSON。只有 stdout 受此切换影响。
ssldump -j -i eth0
11. -k keyfile
使用密钥文件作为 SSL 密钥文件的位置(OpenSSL 格式)以前版本的 ssldump 会自动查找 ./server.pem。现在您必须每次都指定密钥文件。
ssldump -i eth0 -k server.key
12. -l sslkeylogfile
使用 sslkeylogfile 作为 SSLKEYLOGFILE 的位置(https://developer.mozilla.org/en-
US/docs/Mozilla/Projects/NSS/Key_Log_Format)。
ssldump -i eth0 -l sslkey.log
13. -n
不要尝试从 IP 地址解析主机名。
ssldump -n -i eth0
14. -N
当 ASN.1 出现时尝试解析它,例如在证书和 DN 中。
ssldump -N -i eth0
15. -p password
使用 password 作为 SSL 密钥文件密码。
ssldump -i eth0 -k keyfile -p password
16. -P
不要将接口置于混杂模式。
ssldump -P -i eth0
17. -q
不要解码单个摘要行以外的任何记录字段。(安静模式)。
ssldump -q -i eth0
18. -r file
从文件而不是网络读取数据。旧的 -f 选项仍然有效,但已弃用,可能会在下一个版本中被删除。
ssldump -i eth0 -r file
19. -S [ crypto | d | ht | H ]
指定 ssldump 的 SSL 标志。这些标志包括:
crypto 打印加密信息。
d 打印已解码的字段。
ht 打印握手类型。
H 打印握手类型和突出显示。
ssldump -i eth0 -S crypto
ssldump -i eth0 -S d
ssldump -i eth0 -S ht
ssldump -i eth0 -S H
20. -t
指定连接池中引用的非活动连接的 TTL(以秒为单位,默认值:100)。
ssldump -t 100 -i eth0
21. -T
打印 TCP 标头。
ssldump -T -i eth0
22. -v
显示版本和版权信息。
ssldump -v
23. -w outputpcap
使用 outputpcap 作为解密数据包的目标
ssldump -i eth0 -w outputpcap
24. -x
以十六进制打印每个记录,并对其进行解码。
ssldump -x -i eth0
25. -X
使用 -d 选项时,二进制数据将自动打印在两列中,左侧为十六进制转储,右侧为可打印字符。-X 抑制可打印字符的显示,从而使十六进制数据更容易剪切和粘贴到其他程序中。
ssldump -X -i eth0
26. -y
使用 nroff/troff 装饰输出以进行处理。对于普通用户来说用处不大。
ssldump -y -i eth0
表达式
选择 ssldump 将检查哪些数据包。从技术上讲,ssldump 支持 PCAP 和 tcpdump 的完整表达式语法。实际上,此处的描述摘自 tcpdump 手册页。但是,由于 ssldump 需要检查完整的 TCP 流,因此大多数 tcpdump 表达式将选择 ssldump 将忽略的流量混合。这里仅列出不会导致不完整 TCP 流的表达式。
表达式由一个或多个原语组成。原语通常由一个 id(名称或数字)组成,前面是一个或多个限定符。有三种不同类型的限定符:
type 限定符说明 id 名称或数字指的是什么类型。可能的类型是主机、网络和端口。
例如,“host foo”、“net 128.3”、“port 20”。如果没有类型限定符,则假定为 host(主机)。
dir 限定符指定到 id 和/或从 id 的特定传输方向。可能的方向是 src、dst、src 或 dst 和 src 和 dst。例如,“src foo”、“dst net 128.3”、“src 或 dst port ftp-data”。如果没有目录限定符,则假定为 src 或 dst。对于“空”链接层(即点对点协议,如 slip),可以使用入站和出站限定符来指定所需的方向。
通过使用单词 and、or 和 not 来组合原语,可以构建更复杂的过滤器表达式。例如,“host foo and not port ftp and not port ftp-data”。为了节省输入,可以省略相同的限定符列表。例如,“tcp dst port ftp or ftp-data or domain”与“tcp dst port ftp or tcp dst port ftp-data or tcp dst port domain”完全相同。
允许的原语有:
dst host host
如果数据包的 IPv4/v6 目标字段为 host,则为 True,host 可以是地址或名称。
src host host
如果数据包的 IPv4/v6 源字段为 host,则为 True。
host host
如果数据包的 IPv4/v6 源或目标为 host,则为 True。上述任何 host 表达式都可以在前面加上关键字 ip、arp、rarp 或 ip6,例如:
ip host host
相当于:
ether proto \ip and host host
如果 host 是具有多个 IP 地址的名称,则将检查每个地址是否匹配。
ether dst ehost
如果以太网目标地址为 ehost,则为 True。
Ehost 可以是来自 /etc/ethers 的名称,也可以是数字(有关数字格式,请参阅 ethers(3N))。
ether src ehost
如果以太网源地址是 ehost,则为 True。
ether host ehost
如果以太网源或目标地址是 ehost,则为 True。
gateway host
如果数据包使用 host 作为网关,则为 True。即,以太网源或目标地址是 host,但 IP 源和 IP 目标都不是 host。
Host 必须是名称,并且必须在 /etc/hosts 和 /etc/ethers 中找到。(等效表达式是
ether host ehost and not host host
,可以与 host / ehost 的名称或数字一起使用。)此语法目前在启用 IPv6 的配置中不起作用。
dst net net
如果数据包的 IPv4/v6 目标地址具有 net 的网络号,则为 True。Net 可以是来自 /etc/networks 的名称,也可以是网络号(有关详细信息,请参阅 networks(4))。
src net net
如果数据包的 IPv4/v6 源地址具有网络号 net,则为 True。
net net
如果数据包的 IPv4/v6 源地址或目标地址的网络号为 net,则为 True。
net net mask mask
如果 IP 地址与特定网络掩码匹配,则为 True。可以使用 src 或 dst 进行限定。请注意,此语法对 IPv6 net 无效。
net net/len
如果 IPv4/v6 地址与网络掩码 len 位宽匹配,则为 True。可以使用 src 或 dst 进行限定。
dst port port
如果数据包为 ip/tcp、ip/udp、ip6/tcp 或 ip6/udp,并且目标端口值为 port,则为 True。port 可以是数字,也可以是 /etc/services 中使用的名称(请参阅 tcp(4P) 和 udp(4P))。如果使用名称,则将同时检查端口号和协议。如果使用数字或不明确的名称,则仅检查端口号(例如,dst port 513 将打印 tcp/login 流量和 udp/who 流量,port domain 将打印 tcp/domain 和 udp/domain 流量)。
src port port
如果数据包的源端口值为 port,则为 True。
port port
如果数据包的源端口或目标端口为 port,则为 True。上述任何端口表达式都可以在前面加上关键字 tcp 或 udp,例如:
tcp src port port
仅匹配源端口为 port 的 tcp 数据包。
可以使用以下方法组合原语:
一组带括号的原语和运算符
(括号是 Shell 特有的,必须转义)。
否定(“!”或“not”)。
连接(“&&”或“and”)。
交替(“||”或“or”)。
否定具有最高优先级。交替和连接具有同等优先级,并且从左到右关联。请注意,现在需要显式 and 标记(而不是并置)来进行连接。
如果给出的标识符没有关键字,则假定使用最新的关键字。例如,
not host vs and ace
是
not host vs and host ace
的缩写,不应与
not ( host vs or ace )
混淆。
表达式参数可以作为单个参数或多个参数传递给 ssldump,以更方便的为准。通常,如果表达式包含 Shell 元字符,则将其作为单个带引号的参数传递会更容易。多个参数在解析之前用空格连接起来。
综合使用
1. 要监听接口 eth0 端口 443 上的流量
ssldump -i eth0 port 443
2. 要监听端口 443 上到服务器 romeo 的流量
ssldump -i eth0 port 443 and host romeo
3. 要将输出格式切换为 JSON
ssldump -ANH -j -i eth0 port 443 and host romeo
4. 要解密到主机 romeo server.pem 和密码 foobar 的流量
ssldump -Ad -k ~/server.pem -p foobar -i eth0 host romeo
输出格式
所有输出都打印到标准输出。
ssldump 使用如下行打印每个新 TCP 连接的指示
New TCP connection #2: iromeo.rtfm.com(2302) <-> sr1.rtfm.com(4433)
发送第一个 SYN 的主机打印在左侧,响应的主机打印在右侧。通常,这意味着 SSL 客户端打印在左侧,SSL 服务器打印在右侧。在本例中,我们有一个从 iromeo.rtfm.com (端口 2303) 到 sr1.rtfm.com (端口 4433) 的连接。为了允许用户解开来自不同连接的流量,每个连接都进行了编号。这是连接 2。
每个 SSL 记录的打印输出都以记录行开头。此行包含连接和记录号、时间戳和记录类型,如下所示:
2 3 0.2001 (0.0749) S>C Handshake Certificate
这是连接 2 上的记录 3。第一个时间戳是自连接开始以来的时间。第二个是自上一条记录以来的时间。两者都以秒为单位。
记录行中的下一个字段是记录的去向。C>S 表示从客户端传输到服务器的记录,S>C 表示从服务器传输到客户端的记录。
ssldump 假设传输第一个 SYN 的主机是 SSL 客户端(这几乎总是正确的)。
下一个字段是记录类型,可以是 Handshake、IAlert、Change CipherSpec 或 application_data 之一。最后,ssldump 可能会在行的其余部分打印记录特定的数据。对于 Handshake (握手记录),它会打印握手消息。因此,此记录是 Certificate (证书)消息。
ssldump 选择某些记录类型进行进一步解码。这些记录类型已被证明对调试最有用:
ClientHello - 版本、提供的密码套件、会话 ID(如果提供)
ServerHello - 版本、session_id、所选密码套件、压缩方法
Alert - 类型和级别(如果可获得)
可以使用 -A 、 -d 、 -k 和 -p 标志对各种记录进行更全面的解码。
解密
如果满足以下两个条件,ssldump 可以解密两个主机之间的流量:
1. ssldump 拥有密钥。
2. 使用了静态 RSA。
在任何其他情况下,一旦加密开始,ssldump 将只能确定记录类型。考虑以下跟踪部分。
1 5 0.4129 (0.1983) C>S Handshake ClientKeyExchange
1 6 0.4129 (0.0000) C>S ChangeCipherSpec
1 7 0.4129 (0.0000) C>S Handshake
1 8 0.5585 (0.1456) S>C ChangeCipherSpec
1 9 0.6135 (0.0550) S>C Handshake
1 10 2.3121 (1.6986) C>S application_data
1 11 2.5336 (0.2214) C>S application_data
1 12 2.5545 (0.0209) S>C application_data
1 13 2.5592 (0.0046) S>C application_data
1 14 2.5592 (0.0000) S>C Alert
请注意,ClientKeyExchange 消息类型已打印,但其余的握手消息没有类型。这些是完成的消息,但由于它们是加密的,ssldump 只知道它们是握手类型。同样,如果记录 14 中的警报发生在握手期间,它的类型和级别也会被打印出来。但是,由于它是加密的,我们只能知道它是一个警报。
总结
ssldump 是一款强大的 SSL/TLS 流量分析工具,可用于解密和分析 HTTPS 连接。通过结合私钥或 SSLKEYLOGFILE,它能帮助安全研究人员深入了解 TLS 握手及加密通信,为网络安全测试提供有力支持。
在此特别强调,本教程仅在合法授权的情况下进行测试和研究,请勿用于其他用途。未经授权使用此类工具可能会侵犯他人隐私,触犯相关法律,任何因此引发的法律或利益纠纷与本人无关。
欢迎各位大佬,小白来找我交流。