解密TLS协议全记录之利用wireshark解密

引言

  • 为什么会突然有使用wireshark学习TLS的想法,主要是为了一个抢票设计,结果一入TLS,无法自拔,最后发现路子好像走歪了,唯一的价值好像就是多了这么一篇博客,查阅了很多有根据,没根据的博客内容,总结出这篇自以为还算全面的文章。如有问题,欢迎讨论交流。
  • 学习网络协议之前,必须先找对最基本的协议学习网站,
    rfc协议官网 https://www.rfc-editor.org
    ietf协议官网 https://www.ietf.org/ ,其实这个网站,我经常搜索不出比较理想的文件,标题不直观,杂七杂八的会议记录文件一大堆夹杂在规范文件之中。
  • 通过上面的网站,我们可以获取到tls的几个协议说明链接.
    TLS1.0: https://www.rfc-editor.org/rfc/rfc2246.html
    TLS1.2: https://www.rfc-editor.org/rfc/rfc5246.html https://tools.ietf.org/html/rfc5246

1. 写在解密前

  • 这个分析TLS报文的环节中引出很多问题,一步步被引入深坑。
  • 学习的时候,被不少没有实践的博客坑得浪费了不少时间,之前参考过下面的内容:

1.1 安装wireshark

1.2 有用的知识

1.2.1 易混淆点
  • SSLv2/SSLv3不安全,因此,发展出了使用TLS来代替,利用传输层的TCP协议来传输报文,端口号 443, 将应用层(HTTP)封装在tls的加密密文中。
  • X.509 认证证书有时候也叫 SSL 证书。
  • 由于一些历史原因, 诸多的软件中(包括wireshark)提到 SSL 或者 SSL/TLS ,指的都是 目前大家都在使用的TLS协议,比如 wireshark早些版本就叫SSL,现在都统一成TLS
  • 典型地, TLS使用TCP 作为他的传输层协议, 这几年也逐步发展出了DTLS(Datagram TLS), 也就是基于UDP传输的TLS报文协议。 UDP传输协议(英语:User Datagram Protocol,用户数据包协议),网络编程的时候,经常通过SOCK_DGRAM参数来配置socket。
  • 自从wireshark 3.0之后, TLS解析工具就从SSL改成了TLS, 如果使用SSL的话,软件将会发出警告。
1.2.2 wireshark 使用技巧
  • 配置过滤选项为: tcp.port = 443 ,便可以过滤TLS报文
  • 当我们想追踪某一次数据通信的相关报文的时候, 可以右键该报文,然后选择追踪流, 追踪TLS 协议,便可以将相关的TLS报文 都筛选出来, 也有其他选项,比如追踪 TCP报文之类的,我们就可以很清晰观察到报文的一些 握手, 挥手信息, TLS的交换密钥的报文信息。
  • 配置过滤的时候, 同样可以右键报文的ip地址 ,选择作为过滤器使用,然后可以组合各种过滤的逻辑语法, 之后会作用到 Current Filte中
  • 在Current Filter中, 如果不小心删除之前使用的逻辑判断语句,如ip.addr=192.168.1.1可以 点击右侧的 ▼(倒三角符号), 状态栏便会下拉出 历史使用的过滤选项。
1.2.3 学习TLS协议内容

2. 通过wireshark 解密TLS报文的两种途径

进行wireshark报文解密的话, 可以直接抓取现成网页服务器的数据, 也可以自己动手通过nginx搭建HTTPS Server进行学习。

Wireshak 主要支持以下两种方法进行解密:

  • 在RSA密钥交换算法中,客户端会临时生成预主密钥(随机数),这个数在会被生成主密钥之后就会被马上删除, 那么此时只能通过服务端的私钥,才能够解开加密密钥进而解密报文,但是这大多数情况下,不现实。
  • 而例如chrome,firefox, curl 等应用, 当设置了SSLKEYLOGFILE的环境变量, 就能够获取到每次对话产生的key log文件。利用每次对话中,存储下来的key log来解密报文是一种非常普遍的手段,即使是使用DH密钥交换算法, 而RSA私钥解密就比较有局限性,它只能应用于以下几种环境:
  1. 服务器加密套件使用的不是(EC)DHE.
  2. 协议版本是SSLv3, TLS1.0-1.2, 因为TLS1.3 已经不再支持RSA密钥交换算法了, 可查看我的博客: TLS协议剖析.
  3. RSA私钥需要和服务器证书匹配,正常通信中,服务器肯定会下发证书, 这时候证书中公钥就会被用来加密预主密钥,如果能够拿到证书对应的私钥,便可以解密被加密的报文内容。(结合非对称加密理解。不能搞混,不是客户端的证书也不是CA证书。
  4. 对话窗不能是通过恢复协议而恢复的窗口, 报文中一定要包含有 ClientKeyExchange的握手消息, 这个地方我吃过亏,先前实践的过程中,一直十分郁闷为何有的报文有被解密,有的没有解密
  5. RSA私钥唯一的优点就在于,只要导入一次服务器的私钥文件就可以实现内容解密。

疑问: wireshark 有时候无法解密是不是就是因为报文通信的密钥使用的是之前商议好的密钥?
A: 确实如此,如果是使用RSA密钥交换算法,那么报文中一定要包含ClientKeyExchange的消息, 这样wireshark 才能拿到客户端产生的随机数(预主密钥),才能把密钥和报文匹配起来, 而恢复会话就很难确定之前的密钥是什么值了。

2.0 首先,配置测试网络:

  • 网络拓扑图:
TLS Requset
TLS Response
Client 192.168.1.196
Https Server 192.168.1.105
  • 配置wiresshark 过滤出tls的报文:
    在这里插入图片描述
    或者
    配置 tcp.port == 443.🤣

2.1 使用服务器端的RSA 私钥进行解密

  1. 配置服务器使用RSA的加密套件:

#HTTPS server
server {
listen 443 ssl;
server_name localhost;
ssl_certificate /usr/local/nginx/tls_file/cert_2.crt;
ssl_certificate_key /usr/local/nginx/tls_file/cert.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers AES256-GCM-SHA384;
#ssl_ciphers ECDHE-RSA-CHACHA20-POLY1305;
#ssl_ciphers HIGH:!aNULL:!MD5;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
location / {
root html;
index index.html index.htm;
}
}

  1. 访问页面之后,可以抓到典型的RSA密钥交换算法的报文,也就是只有client这一侧进行key exchange,通过公钥加密了随机数,然后上传给服务器。
    在这里插入图片描述3 通过编辑—> 首选项—>RSA密钥:
    在这里插入图片描述
    导入服务器上的私钥文件,类似以下文件内容

-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDReQzlKVeAK8b5
TRcRBhSi9IYwHX8Nqc8K4HeDRvN7HiBQQP3bhUkVekdoXpRLYVuc7A8h1BLr93Qw

KOi8FZl+jhG+p8vtpK5ZAIyp
-----END PRIVATE KEY-----

这样即可解密,解密后的报文如下:
在这里插入图片描述
则可以在wireshark 上查看到http的明文报文。
需要注意的是RSA算法,一定要让wireshark 抓到 Client Key Exchange的包,因为预主密钥 在这个报文里面,否则结果会像下面这样, 无法看到明文。
在这里插入图片描述

2.2 使用(Pre)-Master-Secret的keylog 文件,配置TLS_debug 文件

  • 这个是利用wireshark 解密报文较为普遍的一种方式。
  • 通过TLS debug file (tls.debug_logfile)文件, 我们可以知道为什么解密失败,这其中将会记录wireshark解密过程的相关log信息。
  1. 创建文件 tls_key.txt (用来记录 环境变量 SSLKEYLOGFILE的值,chrome 和firefox 都会将值记录到这个变量上)
  2. 创建文件tls_debug.log (用来保存wireshark 解析报文时的log记录)
  3. 打开wireshark,打开Edit–> Preferences -> Protocols -> TLS,将上述文件按如下导入:
    在这里插入图片描述
  4. 配置 SSLKEYLOGFILE的环境变量
# windows下,该方法作用范围只局限于当前的CMD窗口。
C:\Program Files (x86)\Google\Chrome\Application>set SSLKEYLOGFILE=C:\Users\chupa\Desktop\tls_key.txt
C:\Program Files (x86)\Google\Chrome\Application>chrome.exe
# linux下
$ export SSLKEYLOGFILE=~/path/to/sslkeylog.log
# You can also add this to the last line of your
~/.bashrc
  1. 配置nginx服务器,然后访问网页,可以看到解析的报文如下,可以看到application 报文变成http明文。
    下图为ECDHE密钥交换算法的报文:
    在这里插入图片描述
    下图为ECDHE算法中 相关参数 key值的文件内容:
    在这里插入图片描述
    下图为RSA密钥交换算法的报文解析:
    在这里插入图片描述
    下图为RSA算法中,客户端产生的随机值(预主密钥):
    在这里插入图片描述
    以下是访问 nike 官网的报文截图:
    可以看到nike官网开始支持http2了,
    在这里插入图片描述
    但是, 会发现一个问题,就是部分报文无法解密: 比如 #2025
    在这里插入图片描述
    查看wireshark 记录的tls_debug.log发现:

tls_decrypt_aead_record seq 624
nonce[12]:
| 3d 3d 4a 3f 66 01 6a 69 65 af bd 3e |==J?f.jie…> |
AAD[5]:
| 17 03 03 04 11 |… |
tls_decrypt_aead_record auth tag mismatch
auth_tag(expect)[16]:
| 62 d4 44 5f 34 02 87 73 72 b4 80 0a ba 1f b9 1d |b.D_4…sr…|
auth_tag(actual)[16]:
| 1a 3e ac 27 0b 1a 6a 9a a1 28 1b 89 0e 73 77 42 |.>.’…j…(…swB|

Google搜索发现,已经有人报了相关bug 给wireshark , bug 链接: https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=15537
目前我也报了bug给wireshark,bug链接: https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=16713, 等待回复中…

  1. 当然,wireshark解密TLS 报文还是有一定的局限性,我们可以通过搭建代理服务器, 或者 fiddler来解密, 也可以直接通过 chrome 浏览器也可以直接解析,fiddler 其实就是模拟的代理服务器,网上教程很多,不再赘述。
  • 20
    点赞
  • 122
    收藏
    觉得还不错? 一键收藏
  • 19
    评论
众所周知,人工智能是当前最热门的话题之一, 计算机技术与互联网技术的快速发展更是将对人工智能的研究推向一个新的高潮。 人工智能是研究模拟和扩展人类智能的理论与方法及其应用的一门新兴技术科学。 作为人工智能核心研究领域之一的机器学习, 其研究动机是为了使计算机系统具有人的学习能力以实现人工智能。 那么, 什么是机器学习呢? 机器学习 (Machine Learning) 是对研究问题进行模型假设,利用计算机从训练数据中学习得到模型参数,并最终对数据进行预测和分析的一门学科。 机器学习的用途 机器学习是一种通用的数据处理技术,其包含了大量的学习算法。不同的学习算法在不同的行业及应用中能够表现出不同的性能和优势。目前,机器学习已成功地应用于下列领域: 互联网领域----语音识别、搜索引擎、语言翻译、垃圾邮件过滤、自然语言处理等 生物领域----基因序列分析、DNA 序列预测、蛋白质结构预测等 自动化领域----人脸识别、无人驾驶技术、图像处理、信号处理等 金融领域----证券市场分析、信用卡欺诈检测等 医学领域----疾病鉴别/诊断、流行病爆发预测等 刑侦领域----潜在犯罪识别与预测、模拟人工智能侦探等 新闻领域----新闻推荐系统等 游戏领域----游戏战略规划等 从上述所列举的应用可知,机器学习正在成为各行各业都会经常使用到的分析工具,尤其是在各领域数据量爆炸的今天,各行业都希望通过数据处理与分析手段,得到数据中有价值的信息,以便明确客户的需求和指引企业的发展。
Wireshark解密TLS报文的过程相对较为复杂,但操作起来并不困难。首先,需要配置Chrome浏览器的TLS握手日志环境变量,以便将TLS握手信息导出到文件中。接下来,可以使用Wireshark来解析这些TLS握手日志文件。 然而,需要注意的是,Wireshark解密TLS报文存在一定的局限性。有时候,Wireshark无法解密的原因可能是因为报文通信所使用的密钥是之前商议好的,而Wireshark无法获取到相应的密钥信息。如果使用RSA密钥交换算法,需要在报文中包含ClientKeyExchange的消息,以便Wireshark可以获取到客户端产生的随机数(预主密钥),从而将密钥与报文进行匹配。如果无法获取到之前的密钥值,恢复会话就会变得困难。 另外,除了使用Wireshark解密TLS报文,还可以通过搭建代理服务器或使用Fiddler来解密。在使用Chrome浏览器时,也可以直接进行解析。Fiddler实际上是一个模拟的代理服务器,有很多网上教程可供参考。 综上所述,Wireshark解密TLS报文的过程需要配置TLS握手日志环境变量,并确保报文中包含必要的消息以获取密钥信息。同时,还可以考虑使用代理服务器或Fiddler来解密TLS报文。请注意,这些方法都有其限制和局限性,具体的操作步骤可以根据实际情况进行调整和实施。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Wireshark 解密 TLS报文](https://blog.csdn.net/s2603898260/article/details/122571160)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [解密TLS协议全记录利用wireshark解密](https://blog.csdn.net/walleva96/article/details/106844033)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值