Wireshark对HTTPS数据的解密

本文来自网易云社区


之前有介绍《wireshark抓包分析——TCP/IP协议》,然后某天有人问我,示例里是HTTP的,如果是HTTPS,你可以抓包分析吗?基于好奇,我查阅了下相关资料,把一些浅见分享给大家。在讲HTTPS的解密之前先来看下HTTPS与HTTP的不同之处,HTTPS是在TCP/IP与HTTP之间,增加一个安全传输层协议,而这个安全传输层协议一般用SSL或TLS,类似于下图。即HTTPS=HTTP+SSL/TLS。

201808290938181d62c618-cc72-4f49-bab1-a6cb9e053652.png


SSL协议分为SSL记录协议层和SSL握手协议层。SSL握手协议建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。SSL记录协议将数据块进行拆分压缩,计算消息验证码,加密,封装记录头然后进行传输。如下图显示,这里不展开,有兴趣的童鞋可以继续深入了解。

应用层协议

SSL握手协议

SSL记录协议

TCP

IP

先回顾下Wireshark对HTTP请求分析,一般是通过选定数据右键鼠标,查看Follow TCP Stream。

201808290938423f942973-4ce6-4d30-a976-08d504671152.png

即可以看到请求的详细内容了。

201808290939157b5a6ab1-71f9-402d-836a-7c1ec117e9f1.png

下面来看看Wireshark对HTTPS请求数据是如何分析的。先抓包看下,以访问CSDN首页为例,可以看到抓取的数据包如下:

2018082909393203950623-82db-4c45-ac37-51fc84b07872.png

根据截图会发现2个略“神奇”的东东,(1)虽然过滤条件设置了SSL,但过滤结果满屏都是TLS的身影,随机找了其他一些网站进行抓包也都是TLS。查阅了下资料,发现TLS是以建立在SSL V3.0的基础上,两者的加密算法和MAC算法都不一样,而协议本身差异性不大。TLS协议也是由两层组成: TLS 记录协议(TLS Record)和 TLS 握手协议(TLS Handshake)。较低的层为 TLS 记录协议。忽略协议的差异性,后面就拿TLS来解密分析。现在来看另外1个满屏满眼的东东。(2)好多hello呀,Client Hello和Server Hello好多,这是什么呢?这是TLS的握手。整个握手阶段如下,可分为5步。

第一步,浏览器给出协议版本号、一个客户端生成的随机数,以及客户端支持的加密方法。

第二步,服务器确认双方使用的加密方法,使用的tls版本号和一个随机数。

第三部,并给出数字证书、以及一个服务器运行Diffie-Hellman算法生成的参数,比如pubkey。

第四部,浏览器获取服务器发来的pubkey,计算出另一个pubkey,发给服务器。

第五部,服务器发给浏览器一个session ticket。

20180829093947f2abcc95-21b9-4a4a-a028-7e234058ac91.png

具体握手过程可以通过Wireshark的抓包一步步验证,这里不再详述,还是专心来看看如何使用Wireshark来进行数据解密。我们现在获取到的Wireshark抓包数据在握手完成之后,还是各种TLSv1.2的东东,都是加密后的数据。

20180829093959e6d06c23-c7a4-43d8-9e17-755d02f96756.png

解密方式介绍我觉得最简单的,通过浏览器保存的TLS 会话中使用的对称密钥来进行数据解密。在浏览器接收到数据之后,会使用秘钥对数据进行解密,部分浏览器会在某个地方会存储这个密钥,我们只要获取浏览器中的会话密钥就能解密数据。以windows系统+Chrome浏览器为例,首先要导出浏览器存储的密钥,通过 计算机属性——高级系统设置——环境变量,新建一个变量名“SSLKEYLOGFILE”的变量,变量值是导出的密钥具体文件地址。

20180829094010049c4991-8024-4e61-bb48-393e534c21ac.png

设置后可以通过Chrome浏览器打开任意一个HTTPS网址,此时查看变量值对应路径,已经生成sslkey.log。

201808290940259bba1d6b-94ae-41b9-8432-a31234aa8e69.png

密钥成功导出到本地啦。现在可以将密钥应用到Wireshark了。具体路径如下:菜单栏Edit——Preferences——Protocols——SSL(注意,不论是SSL还是TLS这里都是SSL,没有单独的TLS选项),在(Pre)-Master-Secret log filename中选择刚才设置的变量值。

201808290940396393be93-6f33-442f-8b84-264e13109d62.png

配置完成,看下效果:

201808290940575ae0c61c-c311-4908-ab16-5456cd075b33.png

看到有HTTP了,之前都是TLSv1.2。同时,WireShark下面会有一个“Decrypted SSL data”即已解密的SSL Data的标签,点击之后你就可以如上图所示的看到已经解密的TLS数据包的信息了。

觉得这样太难看了?OK,也可以像HTTP一样,通过鼠标右键在菜单栏中选择“Follow SSL Stream”,查看完整的HTTPS解密之后的请求数据哦。

2018082909411432a4c26d-21e0-4cdf-9020-e6cbac6c15bb.png

2018082909412913b077ed-c893-4aff-9de7-659d81237490.png

除此之外,上面还有很多TLSv1.2的东东,比如:client_key_exchange、Session Ticket,这是最初提到过的TLS握手过程的第四步和第五步,并不是请求数据包的内容,因此看到其中像是没有解密的内容也不要奇怪哦。

2018082909414416a1caf9-a2e8-4be4-8b54-0b7c133a580a.png


 


网易云新用户大礼包:https://www.163yun.com/gift

本文来自网易实践者社区,经作者李莉授权发布。

 


相关文章:
【推荐】 3分钟掌握一个有数小技能:收入贡献分析

你可能感兴趣的:(Wireshark,网易云)