大家好,我是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;

SslSession session;

gboolean   has_early_data;

} SslDecryptSession;

2、packet-ssl-utils.c里面的几个重要的函数:

//HMAC消息摘要信息计算

ssl_hmac/md_init(SSL_HMAC* md, const void * key, gint len, gint algo)

ssl_hmac/md_update(SSL_HMAC* md, const void* data, gint len)

ssl_hmac/md_final(SSL_HMAC* md, guchar* data, guint* datalen)

ssl_hmac/md_cleanup(SSL_HMAC* md)

// sha/md5计算

ssl_sha/md5_init(SSL_SHA_CTX* md)

ssl_sha/md5_update(SSL_SHA_CTX* md, guchar* data, gint len)

ssl_sha/md5_final(guchar* buf, SSL_SHA_CTX* md)

ssl_sha/md5_cleanup(SSL_SHA_CTX* md)

//加载解密私钥和证书

ssl_private_decrypt(const guint len, guchar* data, gcry_sexp_t pk)

ssl_load_keyfile(const gchar *ssl_keylog_filename, FILE **keylog_file,

const ssl_master_key_map_t *mk_map)

//验证HMAC和计算伪随机数

tls_hash(StringInfo *secret, StringInfo *seed, gint md,

StringInfo *out, guint out_len)

tls12_prf(gint md, StringInfo* secret, const gchar* usage,

StringInfo* rnd1, StringInfo* rnd2, StringInfo* out, guint out_len)

//计算pre_master_secret

ssl_generate_pre_master_secret(SslDecryptSession *ssl_session,

guint32 length, tvbuff_t *tvb, guint32 offset,

const gchar *ssl_psk,

const ssl_master_key_map_t *mk_map)

//计算master_secret

ssl_generate_keyring_material(SslDecryptSession*ssl_session)

.........

3、解密核心入口函数,输入密文,输出明文

ssl_decrypt_record(SslDecryptSession *ssl, SslDecoder *decoder, guint8 ct, guint16 record_version,

gboolean ignore_mac_failed,

const guchar *in, guint16 inl, StringInfo *comp_str, StringInfo *out_str, guint *outl)

{

tls_decrypt_aead_record...

ssl_cipher_suite_dig...

ssl_cipher_decrypt...

tls_check_mac...

}
  代码很长,就不贴出来来,大家自行去下wireshark源码吧,全部的解密过程都在packet-ssl-utils.c这个文件中。

总体说来:旁路解密https涉及到密码学的很多东西,没这方面的基础,看不懂也很正常。好在有很多开源大神贡献了源码,我们只需要复制拷贝,掌握关键的函数入口,就可以成功抽丝剥茧,把核心的源码剥离出来了,有需要的可以访问https://github.com/qq4108863联系获取。

所以如果任意一方泄漏了密钥,HTTPS也是不安全的,并不能阻止被攻击。如果有网站,可以在github上下载一个SSL web应用防火墙,如hihttps是开源免费的。

hihttps教你在Wireshark中提取旁路https解密源码的更多相关文章

  1. 从.src.rpm包中提取出完整的源码的方法

    1 什么是完整的源码 就是说,最初始的源码加上打了所有的patch后的源码,即最新的源码. 2 过程 2.1 从.src.rpm中提取完整的rpm工程文件 2.1.1 rpm to cpio rpm2 ...

  2. Fabric2.2中的Raft共识模块源码分析

    引言 Hyperledger Fabric是当前比较流行的一种联盟链系统,它隶属于Linux基金会在2015年创建的超级账本项目且是这个项目最重要的一个子项目.目前,与Hyperledger的另外几个 ...

  3. eclipse中tomcat调试正确关联源码

    1.build path中jar包关联本地源码 2.tomcat中添加source关联工程lib下的jar包 以上两步即可. 可解决tomcat直接关联本地源码debug时无法计算表达式的情况. 错误 ...

  4. 动态语言切换(续)-designer中的retranslateUi(带源码)

    本站所有文章由本站和原作者保留一切权力,仅在保留本版权信息.原文链接.原文作者的情况下允许转载,转载请勿删改原文内容, 并不得用于商业用途. 谢谢合作.原文链接:动态语言切换(续)-designer中 ...

  5. RocketMQ中Broker的HA策略源码分析

    Broker的HA策略分为两部分①同步元数据②同步消息数据 同步元数据 在Slave启动时,会启动一个定时任务用来从master同步元数据 if (role == BrokerRole.SLAVE) ...

  6. Go中定时器实现原理及源码解析

    转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com 本文使用的go的源码15.7,需要注意的是由于timer是1.14版本进行改版,但是1. ...

  7. eclipse中导入jar文件的源码

    有时候想看看一个jar包的源码是怎么写的,想按Ctrl+鼠标左键点击来自动导航这时候就需要先把源码给导入到eclipse中,步骤如下:首先准备jar包和源文件包比如:

  8. Orchard CMS中如何打包不带源码的模块

    在Orchard CMS的官网已经提供了文档说明如何打包,但是如果使用它的打包方式,打好的nuget包是带源代码的.如果是为开源系统写模块,不需要关注源代码是否可见.但是如果是用Orchard CMS ...

  9. Twitter Storm中Bolt消息传递路径之源码解读

    本文初次发表于storm-cn的google groups中,现以blog的方式再次发表,表明本人徽沪一郎确实读过这些代码,:). Bolt作为task被executor执行,而executor是一个 ...

随机推荐

  1. Flac无损音频导入premiere

    安装Ogg Vorbis插件即可导入FLAC音频 项目地址:https://github.com/fnordware/AdobeOgg 下载地址:http://www.fnordware.com/do ...

  2. 手把手教你用深度学习做物体检测(五):YOLOv1介绍

    "之前写物体检测系列文章的时候说过,关于YOLO算法,会在后续的文章中介绍,然而,由于YOLO历经3个版本,其论文也有3篇,想全面的讲述清楚还是太难了,本周终于能够抽出时间写一些YOLO算法 ...

  3. 依赖倒置原则(DIP)、控制反转(IoC)、依赖注入(DI)(C#)

    理解: 依赖倒置原则(DIP)主程序要依赖于抽象接口,不要依赖于具体实现.高层模块不应该依赖底层模块,两个都应该以来抽象.抽象不应该依赖细节,细节应该依赖抽象.(具体看我上一篇贴子) 依赖倒置原则是六 ...

  4. JavaScript入门之AJAX:原生ajax

    背景 传统的Web应用允许用户端填写表单(form),当提交表单时就向网页服务器发送一个请求.服务器接收并处理传来的表单,然后送回一个新的网页,但这个做法浪费了许多带宽,因为在前后两个页面中的大部分H ...

  5. LuoGu-P2863牛的舞会The Cow Prom[tarjan 缩点模板]

    传送门:https://www.luogu.org/problemnew/show/P2863 思路:tarjan模板题,之前会的tarjan,一直想学缩点到底是什么操作,发现就是把同组的放在一个数组 ...

  6. HDU2896病毒入侵AC_自动机

    #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> ...

  7. Codeforces 889F Letters Removing(二分 + 线段树 || 树状数组)

    Letters Removing 题意:给你一个长度为n的字符串,然后进行m次删除操作,每次删除区间[l,r]内的某个字符,删除后并且将字符串往前补位,求删除完之后的字符串. 题解:先开80个set ...

  8. codeforces 465 C. No to Palindromes!(暴力+思维)

    题目链接:http://codeforces.com/contest/465/problem/C 题意:给出一个不存在2个或以上回文子串的字符串,全是由小写字母组成而且字母下表小于p,问刚好比这个字符 ...

  9. NOIP 2016 蚯蚓 题解

    一道有趣的题目,首先想到合并果子,然而发现会超时,我们可以发现首先拿出来的切掉后比后拿出来切掉后还是还长,即满足单调递增,故建立三个队列即可. 代码 #include<bits/stdc++.h ...

  10. MyBatis 传入List集合作为条件查询数据

    使用的是SSM框架,数据库是MySQL,做查询的时候传入List集合,使用SQL语句的in方式查询数据 主要有两点问题:我的List集合是利用的另外一个语句查询出来的,传入参数是int类型,返回值是i ...