【网络协议安全】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过滤

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

查看握手过程使用的各参数
客户端随机数。ClientHello 帧 → 展开 Transport Layer Security → TLSv1.2 Record Layer: Handshake Protocol: Client Hello → Random

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

共享密钥key share


解密(失败)
设置sshlog
参考:
https://blog.csdn.net/m0_51744133/article/details/143649426
没解密导致Wireshark显示不全,看不到其他信息。全是encrypted data

创建一个log文件,然后在系统环境变量新建一个,命名为SSLKEYLOGFILE(这个名字好像,一定要对),加上log文件的路径,
在Wireshark中进行配置。编辑->首选项->协议Protocols->TLS(或者SSL),在(pre)-Master-Secret log filename一栏中添加刚才的log文件位置。

然后重新抓包
原理:
Firefox和Chrome浏览器等一些浏览器会在系统中名为
SSLKEYLOGFILE的环境变量已经设置的情况下,将每个 HTTPS 连接产生的客户端或服务端的随机数、preMasterSecret、MasterSecret 全部获取到并保存在这个环境变量指定的文件中,通过第二步设置让wireshark可以读取到这些参数,报文内加密的证书等信息就自然可以解密出来了
重新抓包还是没解密,查看log文件发现没内容,说明浏览器没关联到日志文件。(没解决
我又回来了,您猜怎么着,运行别的代码的时候发现了这报错。说明设环境变量值不小心带上了奇怪的字符,难怪不起效呢(好巧啊,才过了一天就发现问题了嘻嘻)

重新设置。删除之后新建,选择手打或者打开文件,比较保险。然后在cmd验证(如果已经打开了终端,更改之后记得重开一个)
1 | echo %SSLKEYLOGFILE% |
路径正确且没有现实奇怪字符才行:

再查看log文件,有东西了,说明没问题了。
禁止Diffile-Hellman
又去搜了,说是用DH的话不行。仔细看加密套件,有DHE(不对这里应该看服务端选择的算法)

参考这篇:https://www.cnblogs.com/jasy/p/16157388.html
在火狐设置搜dhe,全改成false(记一下待会改回来)

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

还是不行,我没招了
试试改用tls1.2 https://www.cnblogs.com/jackadam/p/16207642.html

结果抓到的还是1.3,服了
TLS1.2
抓包方案
最后采用了,openssl直连。我这用的是Ubuntu虚拟机里的,所以Wireshark改成抓对应虚拟网卡的包
1 | openssl s_client -connect www.baidu.com:443 -tls1_2 |

查看
Wireshark查看

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

客户端随机数。在Client Hello

服务端随机数。Server Hello

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

预主密钥。加密了,只能找到客户端公钥
ClientKeyExchange 帧 →Transport Layer Security → TLSv1.2 Record Layer: Handshake Protocol: Client Key Exchange → EC Diffie-Hellman Client Params → Pubkey

指定RSA
因为还是采用了DH,看不到预主密钥,试一下指定RSA
1 | openssl s_client -connect www.baidu.com:443 -tls1_2 -cipher 'RSA' |

前面就略过了

证书这块长这样

预主密钥

握手流程图(不保真)

