首页
社区
课程
招聘
[原创]hihttps教你在Wireshark中提取旁路https解密源码
发表于: 2019-11-11 10:13 1198

[原创]hihttps教你在Wireshark中提取旁路https解密源码

2019-11-11 10:13
1198

大家好,我是hihttps,专注SSL web安全研究,今天本文就是教大家怎样从wireshark源码中,提取旁路https解密的源码,非常值得学习和商业应用。

一、旁路https解密条件

众所周知,都知道wireshark中设置一定的条件,可以解密出https的通信成明文。

https是加密传输的,旁路一般情况是无法解密的,但为什么服务器和客户端可以解密成明文呢,那就是双方都有密钥。所以旁路https解密的条件是:

1、知道服务端的私钥。(如RSA静态密钥配置)

2、知道客户端浏览器的密钥。(如chrome的开发者模式会把密钥存到文件)

如何知道和设置密钥,请大家在百度搜索相关文章。如https://blog.csdn.net/wangyiyungw/article/details/82178339

二、wireshark对SSL解密密钥计算流程

1、通过抓包Client端Hello和Server端Hello报文得到两边随机数client_random和server_random。

2、客户端将permaster 通过Sever端证书公钥密钥加密后,发送给服务器,Server用私钥的解密得到解密后的permaster。

3、Client端和Server端分别根据client_random、server_random和permaster_secret生成master secret就是能解密正常报文。

三、代码查找 

首先在wireshark官网下载源码,解压到本地硬盘,进入...\epan\dissectors目录,搜索带有“ssl”关键字的.c文件,找到packet-ssl-utils.c和packet-ssl.c,核心的解密算法全部在packet-ssl-utils.c这个文件里面。哈哈,加密解密虽然复杂,但wireshark用了libgcrypt这个库,事半功倍,我们来欣赏一下核心函数。

1、packet-ssl-utils.h几个重要的结构体,用来存储SSL会话相关解密信息。

/* SSL 对话信息结构体 */

typedef struct _SslDecryptSession {

    guchar _master_secret[SSL_MASTER_SECRET_LENGTH]; //非常重要的解密密钥

    guchar _session_id[256]; //sesstion id

    guchar _client_random[32]; //客户端随机数

    guchar _server_random[32];//服务端随机数

    StringInfo session_id;//session id 用于ssl/tls 快速握手,不必每次计算密钥

    StringInfo session_ticket;//session ticket,用于ssl/tls 快速握手,不必每次计算密钥

    StringInfo server_random;//服务端随机数

    StringInfo client_random;//客户端及随机数

    StringInfo master_secret;//主解密密钥

    StringInfo handshake_data;//握手报文

    /* the data store for this StringInfo must be allocated explicitly with a capture lifetime scope */

    StringInfo pre_master_secret;//pre_master_secret

    guchar _server_data_for_iv[24];//服务端解密向量

    StringInfo server_data_for_iv;

    guchar _client_data_for_iv[24];//可客户端解密向量

    StringInfo client_data_for_iv;

    gint state;//状态

    const SslCipherSuite *cipher_suite;//加密套件

    SslDecoder *server;//服务端解密结构体指针

    SslDecoder *client;//肯定解密结构体指针

    SslDecoder *server_new;

    SslDecoder *client_new;

#if defined(HAVE_LIBGNUTLS)

    gcry_sexp_t private_key;

#endif

    StringInfo psk;

    StringInfo app_data_segment;


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 1
支持
分享
最新回复 (3)
雪    币: 6
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ASG
2
很好的文章,学到了,也解答了心中很久的问题。支持楼主并消灭零回复。
2019-11-18 11:39
0
雪    币: 178
活跃值: (400)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
楼主理解有问题,不是任意一方的密钥。一般https验证服务端,一般不大可能泄漏服务端密钥。wireshark没有服务器密钥是不大可能解密的。
最后于 2019-12-4 07:59 被蓝色之冰编辑 ,原因:
2019-12-4 07:40
0
雪    币: 11
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
理论上, 有浏览器器一侧的密码,可以解出会话密钥,就可以解密会话内容了
2019-12-5 15:07
0
游客
登录 | 注册 方可回帖
返回
//