大家好,我是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. 熔断监控Turbine

    step1:修改hosts的ip地址映射,创建eureka集群 可参考:https://www.cnblogs.com/noneplus/p/11374883.html step2:创建服务提供者 p ...

  2. Spring框架之JdbcTemplate

    Spring框架之JdbcTemplate 一.JdbcTemplate简介 Spring对数据库的操作在jdbc上面做了深层次的封装,使用spring的注入功能,可以把DataSource注册到Jd ...

  3. GC回收算法&&GC回收器

    GC回收算法 什么是垃圾? 类比日常生活中,如果一个东西经常没被使用,那么就可以说是垃圾. 同理,如果一个对象不可能再被引用,那么这个对象就是垃圾,应该被回收. 垃圾:不可能再被引用的对象. fina ...

  4. .netcore 分布式事务CAP2.6之控制台使用

    上一编讲了cap2.6的快速入门,这次我们来讲讲在控制台中如何使用cap2.6.因为cap2.6的内存模式目前已经可以使用了,相关组件已经更新,所以这次我们以简单的内存模式为例. 1:创建项目 创建一 ...

  5. pickle 序列化对象

    # 序列化对象 import pickle mylist=[[1,2,3,4,5,6,7],["abc","xyz","hello"],[1 ...

  6. 杭电多校 hdu6627 equation

    http://acm.hdu.edu.cn/showproblem.php?pid=6627 题意:解绝对值方程并统计解的个数. 解法:签到题,直接模拟小学数学学的零点分段法即可.(数据多直接cin, ...

  7. SSH项目,JSP项目,SSM项目源码附带环境安装指导视频教程

    基于java开发的一个局域网端口扫描程序下载地址:https://www.icodedock.com/article/6.html 用JAVA实现对JAVA代码的格式化下载地址:https://www ...

  8. AOE工程实践-银行卡OCR里的图像处理

    作者:杨科 近期我们开发了一个银行卡 OCR 项目.需求是用手机对着银行卡拍摄以后,通过推理,可以识别出卡片上的卡号. 工程开发过程中,我们发现手机拍摄以后的图像,并不能满足模型的输入要求.以 And ...

  9. 【Spring】编程式事务和声明式事务

    一.概述 二.准备工作 1. 创建表 2. 创建项目并引入Maven依赖 3. 编写实体类 4. 编写Dao层 5. 业务层 6. XML中的配置 7. 测试 三.编程式事务 1. 在业务层代码上使用 ...

  10. Golang 数组 切片 字典 基本知识点

    数组 数组的声明 var arrayName [arraySize]dataType eg: var array1 [5]int 在声明数组时,必须指定数组名,数组长度和数组元素的类型. 数组的初始化 ...