【网络协议安全】Wireshark抓包和解密TLS

嗯…好混乱

Intro

目标:

1.了解 TLS/SSL协议过程
2.通过抓包验证 TLS/SSL协议的实现

工具:

Wireshark

简介:

SSL(Socket Secure Layer)是TLS(Transport Layer Security)的前身,TLS 1.0在SSL 3.0的基础上提出,即TLS是 SSL的后续版本。TLS和SSL的原理相同,但加密方法有所不同,目前常用的是 TLS1.2。SSL/TLS协议是使用最广泛的密码通信方法,它应用了密码学中的对称密码,消息认证码,公钥密码,数字签名,伪随机数生成器等机制,属于传输层安全协议。基于SSL/TLS 的HTTP,就叫HTTPoverSSL或HTTP over TLS,也就是常说的 HTTPS(HTTPSecure)。

TLS1.3

抓包方案

使用浏览器(火狐和Edge)产生流量,Wireshark在本地环回网卡抓包。输入tls过滤

image-20251210192537213

查看

查看加密套件Cipher Suite。这是客户端可用的

image-20251210192643885

查看握手过程使用的各参数

客户端随机数。ClientHello 帧 → 展开 Transport Layer Security → TLSv1.2 Record Layer: Handshake Protocol: Client Hello → Random

image-20251210193035665

服务端随机数。ServerHello 帧 ,Server Hello → Random

image-20251210193125700

共享密钥key share

image-20251210194120321

image-20251210193921602

解密(失败)

设置sshlog

参考:

https://blog.csdn.net/m0_51744133/article/details/143649426

没解密导致Wireshark显示不全,看不到其他信息。全是encrypted data

image-20251210200419301

创建一个log文件,然后在系统环境变量新建一个,命名为SSLKEYLOGFILE(这个名字好像,一定要对),加上log文件的路径,

在Wireshark中进行配置。编辑->首选项->协议Protocols->TLS(或者SSL),在(pre)-Master-Secret log filename一栏中添加刚才的log文件位置。

image-20251210195146008

然后重新抓包

原理:

Firefox和Chrome浏览器等一些浏览器会在系统中名为 SSLKEYLOGFILE 的环境变量已经设置的情况下,将每个 HTTPS 连接产生的客户端或服务端的随机数、preMasterSecret、MasterSecret 全部获取到并保存在这个环境变量指定的文件中,通过第二步设置让wireshark可以读取到这些参数,报文内加密的证书等信息就自然可以解密出来了

重新抓包还是没解密,查看log文件发现没内容,说明浏览器没关联到日志文件。(没解决

我又回来了,您猜怎么着,运行别的代码的时候发现了这报错。说明设环境变量值不小心带上了奇怪的字符,难怪不起效呢(好巧啊,才过了一天就发现问题了嘻嘻)

image-20251211094040141

重新设置。删除之后新建,选择手打或者打开文件,比较保险。然后在cmd验证(如果已经打开了终端,更改之后记得重开一个)

1
echo %SSLKEYLOGFILE%

路径正确且没有现实奇怪字符才行:

image-20251211094917806

再查看log文件,有东西了,说明没问题了。

禁止Diffile-Hellman

又去搜了,说是用DH的话不行。仔细看加密套件,有DHE(不对这里应该看服务端选择的算法)

image-20251210211435074

参考这篇:https://www.cnblogs.com/jasy/p/16157388.html

在火狐设置搜dhe,全改成false(记一下待会改回来)

image-20251210211858482

然后重启火狐(哎哟笑死我了)

image-20251210211957143

还是不行,我没招了

试试改用tls1.2 https://www.cnblogs.com/jackadam/p/16207642.html

image-20251210214246838

结果抓到的还是1.3,服了

TLS1.2

抓包方案

最后采用了,openssl直连。我这用的是Ubuntu虚拟机里的,所以Wireshark改成抓对应虚拟网卡的包

1
openssl s_client -connect www.baidu.com:443 -tls1_2

image-20251210215411792

查看

Wireshark查看

image-20251210215439712

加密套件。服务端选择了Cipher Suite:TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (0xc02f)

image-20251210215655254

客户端随机数。在Client Hello

image-20251210220135922

服务端随机数。Server Hello

image-20251210220149994

服务器密钥。在 ServerKeyExchange 包里(Certificate 帧后面):
Transport Layer Security → TLSv1.2 Record Layer: Handshake Protocol: Server Key Exchange → EC Diffie-Hellman Server Params → Pubkey

1
047d1c66aa8bbf43937342cfe86622a500f9a969899074a4f2cf662c030540b4f3968ff4195982aa5a9c911fb4e3efedb5e16c7d4c0bd0e14bbb8c480ff15cbeb2

image-20251210215957341

预主密钥。加密了,只能找到客户端公钥

ClientKeyExchange 帧 →
Transport Layer Security → TLSv1.2 Record Layer: Handshake Protocol: Client Key Exchange → EC Diffie-Hellman Client Params → Pubkey

image-20251210220652504

指定RSA

因为还是采用了DH,看不到预主密钥,试一下指定RSA

1
openssl s_client -connect www.baidu.com:443 -tls1_2 -cipher 'RSA'

image-20251210221340095

前面就略过了

image-20251210221453194

证书这块长这样

image-20251210221606735

预主密钥

image-20251210221649450

握手流程图(不保真)

image-20251210222846850

image-20260106223924043