TLS Poison - When TLS Hack you
0x00 前言
本次学习的是2020 Blackhat 的一篇文章When TLS Hacks you
,简单来说,作者提出了一种新的SSRF
攻击思路:利用DNS重绑定和TLS协议的会话恢复进行攻击。具体可参考:Blackhat - When TLS Hacks you
Lots of people try to attack the security of TLS. But, what if we use TLS to attack other things? It's a huge standard, and it turns out that features intended to make TLS fast have also made it useful as an attack vector. Among other things, these features provide a lot of flexibility for Server-Side Request Forgery (SSRF). While past work using HTTPS URLs in SSRF has relied upon platform-specific bugs such as SNI injection, we can go further. In this talk, I present a novel, cross-platform way of leveraging TLS to target internal services. By Joshua Maddux
0x01 前置知识
SSRF攻击
SSRF全称是服务器端请求伪造。在各种Web应用程序中,这是一个非常普遍的漏洞,攻击者可以在其中代表服务器伪造网络请求。假如,具有以下URL:https://example.com/?ping=www.xxx.com
我们可以从中得出什么?它像是一个ping
参数,可以通过某种方式与www.xxx.com
进行通信。也许它下载了文件,也许它向它发送了其他一些HTTP请求。看到这样的URL,攻击者可能会检查是否可以通过这种方式访问其他内部文件。
攻击者还将检查路径是否可以使用完整的主机名扩展,例如ping=http://127.0.0.1/
。这将导致服务器去连接本地IP地址,或者去连接外界无法进行访问的内网地址,这是由于攻击者代表Web服务器伪造了该请求。这种攻击可能导致各种危害:包括执行端口探测,内网主机探测,或在本地主机上与可用的服务进行交互。
如果没有任何防御措施,也可以使用file:///C:/windows/win.ini
语句访问本地文件。
TLS 会话恢复
当两个通信方发起TLS会话时,正在交换握手。在握手期间,双方会相互验证并建立加密算法以及会话密钥。完成后,加密的通信将继续。为了节省时间和资源(协商和创建会话密钥需要占用大量CPU资源),服务器会发送一个所谓的会话ID给客户。重新连接的客户端可以在ClientHello
消息过程中提供此会话ID,并重新使用以前建立的会话密钥。这被称为会话恢复,因为双方已经协商了要使用的算法和密钥,因此可以显着加快通信的速度。重要的一点是,在握手期间,客户端会显示服务器提供的会话ID值。
详情可参考之前的文章,TLS 1.3 与 TLS 1.2 的会话恢复
DNS重绑定攻击
整个攻击过程类似于之前讲过的DNS重绑定攻击,攻击内网设备。不同地方是在这里利用的是TLS的会话恢复。
详情可参考之前的文章,详解DNS 重绑定攻击
0x02 攻击原理
原理图:
攻击流程:
- 攻击者首先诱使受害者打开一个网站(钓鱼或者广告页面都可以实现),会向攻击者的TLS 服务器 https://ssltest.jmaddux.com:11211 请求页面。
- 受害者打开网站后,客户端发出DNS查询,查找 ssltest.jmaddux.com域名的IP地址,攻击者准备的DNS权威域名服务器接收到查询,进行响应。
- 此时,返回的DNS响应报文是TLS sever的真实IP地址,并且设置TTL 为0
- 受害者客户端发送Hello 消息尝试进行TLS握手(在这之前进行了TCP三次握手,这里省略没写,不是重点)
- TLS服务器端响应Hello消息,并将会话id设置为payload 发送给受害者
- 当TLS握手全部完成之后,进行HTTPS通信,TLS服务器通过301重定向状态码,重定向到https://ssltest.jmaddux.com:11211 (重新进行再次访问)
- 客户端重新加载https://ssltest.jmaddux.com:11211 页面。
- 由于之前设置的DNS缓存记录,TTL为0,在很短的时间内就失效,所以受害者客户端会再次向攻击者DNS服务器请求IP地址
- 此时,攻击者拥有的DNS服务器返回解析结果为127.0.0.1,TTL为0。(127.0.0.1代表本机)
- 客户端尝试去恢复会话,带着之前的payload 会话ID,与127.0.0.1:11211 进行会话恢复,于是payload 发送给了客户端本身。
- 此时会话重用失败,会返回一个TLS error,但攻击者的目的已经达成。
0x03 影响范围
借用作者的原图,下图是易受攻击的HTTPS客户端应用:
下图是可以攻击的目标,以及可利用的方式:
0x04 参考资料
Black Hat USA 2020 Highlights: When TLS Hacks You
TLS Poison - When TLS Hack you的更多相关文章
- 线程本地存储(动态TLS和静态TLS)
线程本地存储(TLS) 对于多线程应用程序,如果线程过于依赖全局变量和静态局部变量就会产生线程安全问题.也就是一个线程的使用全局变量可能会影响到其他也使用此全局变量的线程,有可能会造成一定的错误,这可 ...
- 静态TLS和动态TLS
静态TLS的使用方法: #include <Windows.h> #include <iostream> #include <iomanip> using name ...
- JavaMail: SSL vs TLS vs STARTTLS
SSL vs TLS vs STARTTLS There's often quite a bit of confusion around the different terms SSL, TLS an ...
- TLS 与 python thread local
TLS 先说TLS( Thread Local Storage),wiki上是这么解释的: Thread-local storage (TLS) is a computer programming m ...
- 线程本地存储TLS(Thread Local Storage)的原理和实现——分类和原理
原文链接地址:http://www.cppblog.com/Tim/archive/2012/07/04/181018.html 本文为线程本地存储TLS系列之分类和原理. 一.TLS简述和分类 我们 ...
- SSL、TLS协议格式、HTTPS通信过程、RDP SSL通信过程
相关学习资料 http://www.360doc.com/content/10/0602/08/1466362_30787868.shtml http://www.gxu.edu.cn/college ...
- [转载] TLS协议分析 与 现代加密通信协议设计
https://blog.helong.info/blog/2015/09/06/tls-protocol-analysis-and-crypto-protocol-design/?from=time ...
- Android网络编程系列 一 JavaSecurity之JSSE(SSL/TLS)
摘要: Java Security在Java存在已久了而且它是一个非常重要且独立的版块,包含了很多的知识点,常见的有MD5,DigitalSignature等,而Android在Java Se ...
- TLS学习总结
我们有知道 Immunity Debugger,OD 调试器,在调试程序时会设断在OEP(修改第一个字节0xcc).我在想,使用什么编程技术,代码可以在OEP前被执行.在网上找了些资料,在论坛上看到许 ...
随机推荐
- 如何使用irealtime.js实现一个基于websocket的同步画板
同步画板演示 同时打开2个tab,分别在画布上写下任意内容,观察演示结果,同时可设置画笔颜色及线条宽度.演示地址 初始化画布 <canvas id="drawBoard" w ...
- Guava-RateLimiter实现令牌桶控制接口限流方案
一.前言 对于一个应用系统来说,我们有时会遇到极限并发的情况,即有一个TPS/QPS阀值,如果超了阀值可能会导致服务器崩溃宕机,因此我们最好进行过载保护,防止大量请求涌入击垮系统.对服务接口进行限流可 ...
- CMD(命令提示符)的基本操作(文件)
打开CMD窗口,接下来将介绍如何使用CMD来创建.删除.修改.查看文件 1.1 使用CMD创建空文件(为了更好的演示,本文皆以D盘为当前路径),命令如下: copy nul xxx.xx(文件名) 命 ...
- EFCodeFirst Migrations数据库迁移
EFCodeFirst Migrations数据库迁移 数据库迁移 1.生成数据库 修改类文件PortalContext.cs的静态构造函数,取消当数据库模型发生改变时删除当前数据库重建新数据库的设置 ...
- molloc堆区的动态内存分配
[前言]前面有一篇文章介绍了堆区栈区的区别.栈区的核心主要集中在操作一个栈结构,一般由操作系统维护.堆区,主要是我们程序员来维护,核心就是动态内存分配. 这篇笔记结束就不在高新CSAPP的读书笔记了, ...
- if...else和switch...case
一.位运算 class Demo01 { public static void main(String[] args) { int a = 5; int b = 3; /* 0000 0101 |00 ...
- golang调用shell命令(实时输出, 终止等)
背景 是这样的,最近在研究一个定时任务系统的改造,可能有点像jenkins做到的那种吧. 可以输入shell命令,也可以执行py脚本等等,相比之前来说,也要能够及时停止! 但是遇到了这么个问题,gol ...
- MYSQL的replace into
replace into t(id, update_time) values(1, now()); 或 replace into t(id, update_time) select 1, now(); ...
- [省选联考 2020 A/B 卷] 冰火战士
一.题目 点此看题 二.解法 其实这道题也不是特别难吧 \(......\) 但树状数组上二分是我第一次见. 我们把冰人和火人都按温度排序,那么考虑一个分界线 \(x\) ,问题就是求冰数组 \(x\ ...
- 使用dcmtk库读取.dcm文件并获取信息+使用OpenCV显示图像
借助VS2013和OpenCV的绘图功能,在工程DICOMReader.sln中实现了对单张.dcm图像的读取与显示,以下是详细步骤. 前期准备工作 编译器:VS2013 库:dcmtk-3.6.0( ...