声明
本文作者:wendell 本文字数:1700
阅读时长:17分钟
附件/链接:点击查看原文下载
声明:请勿用作违法用途,否则后果自负
本文属于【狼组安全社区】原创奖励计划,未经许可禁止转载
前言
When TLS Hacks You出了一个利用tls进行ssrf的姿势,而且赵师傅在(https://www.zhaoj.in/read-6681.html)也做了一些新研究,很早之前就想学习一下这个,不过一直咕,趁现在空下来了,研究一下.
这个是一个ssrf的新姿势,如果可以利用的话,只要对方服务器可以利用https协议,就可以打内网服务.
但是打过去的payload会有一些垃圾字符,常见可以利用的是memcached,ftp和smtp,而redis据原作者所说,因为0字节会截断,不能攻击
一、前置知识
tls1.2握手和会话复用
上面这个图简单的描述了TLS握手过程,每个框都是一个记录,多个记录组成一个TCP包发送,在tcp握手之后,经过4个消息,就可以完成TLS握手过程
在ServerHello消息中,
会有一个sessionID字段,用于再次连接时的会话复用,
会话复用时,客户端发送发生首次连接时保存的来自服务器的会话id,找到后就直接用主密钥恢复会话状态,跳过证书验证和密钥交换阶段.
dns重绑定攻击
当dns的TTL(生存时间)是一个非常小的值的时候,DNS回复仅在短时间内有效,攻击者DNS首次回复了有效的IP的地址,第二次恢复恶意地址,就会造成DNS重绑定攻击
AAAA记录和A记录
AAAA记录是域名的ipv6地址,A记录是域名的ipv4地址,可能因为现在对ipv6的支持问题,
curl会优先请求AAAA记录的地址,如果无法连接,则会连接ipv4地址
二、
攻击原理
概述
如上图,在TSL首次握手时,session_id来自服务端,而后在一次新的连接时,在客户端会进行会话复用时,这时,session_id由客户端首先发给服务端.
原作者提出,在curl对会话复用的判断中,只判断了目标服务的域名、端口以及协议是否一致,没有判断ip
如果服务器是恶意攻击者控制的,session_id被设置成攻击者想发送的恶意payload,在客户端第二次请求时,将ip改成127.0.0.1, 既可利用恶意的session_id攻击客户端本地的服务,
恶意的TLS服务器,只要一个正常的TLS服务器把sessionid改掉就好,现在问题是如何把客户端在第二次请求时目的ip改掉.这里有两种姿势.
ip改变的方法
dns重绑定
一个很简单的想法就是利用dns重绑定,在第二次请求dns解析时改变ip,这个也是When TLS Hacks You那篇议题原作者提出的方法,赵师傅在文章中提到curl对dns做了缓存,导致第二次请求时没有进行dns查询,导致无法利用,但其实原作在中间还加了一些处理,恶意的TLS服务端永远只返回的301跳转,并且在返回前会sleep一段时间,curl在一次次的301跳转中耗尽dns缓存的时间,会重新进行dns查询.
这里有一个坑,按照原作者github搭出来的话,301跳转以后就会报一个unexpected message的错误,
导致无法一直301跳转进行利用,最终我利用赵师傅改的tlslite-ng,再次魔改,才完成复现.
可以看到这里跳转了5次,才改变了ip
AAAA和A记录
赵师傅提出了一个新的改ip的姿势,
因为curl对AAAA和A记录的特殊处理,我们只要设置AAAA记录返回一个服务器ipv6的ip,A记录返回127.0.0.1,,并且在服务器第二次访问时,服务端下线.
第一次服务器访问ipv6地址,在服务器第二次请求时访问ipv6的地址,发现无法无法访问,会转而请求ipv4地址,造成ip改变
具体操作可以参考赵师傅的文章.
三、
复现
(文末附源码下载)
配置域名的ns和a记录
代码语言:javascript复制dns.example.com A 300 <DNS_IP>
tlstest.example.com NS 300 dns.example.com
启动dns服务器
代码语言:javascript复制python3 alternate-dns.py tlstest.example.com,127.0.0.1 -b 0.0.0.0 -t tlsserverip
127.0.0.1是要进行ssrf攻击目标的ip,这里我为了方便抓包设置了118.*的ip
然后在tlslite-ng/tlslite目录,启动TLS服务,注意证书要自己配置,
代码语言:javascript复制python3 tls.py server --max-ver tls1.2 -k 2_tlstest111.wetolink.com.key -c 1_tlstest111.wetolink.com_bundle.crt 0.0.0.0:11212
这时受害者主机以http访问
代码语言:javascript复制curl -4 -kvL https://tlstest.example.com:11212
就会被攻击,
注意要允许301跳转,并且使用tls1.2.
可以看到在多次跳转之后,curl改变了访问ip
在恶意的session_id被成功发往服务端
四、
影响范围
原作者pdf的图就说的挺清楚的,下图是受影响的客户端,
下图是可以攻击的目标,因为会有一些垃圾字符的干扰,Memcached的利用是比较多的
五、
参考资料
https://www.blackhat.com/eu-20/briefings/schedule/index.html
https://i.blackhat.com/USA-20/Wednesday/us-20-Maddux-When-TLS-Hacks-You.pdf
https://cqureacademy.com/conference-summary/bhus2020-1-when-tls-hacks-you
https://github.com/jmdx/TLS-poison
https://www.zhaoj.in/read-6681.html#i-5
https://mp.weixin.qq.com/s/GT3Wlu_2-Ycf_nhWz_z9Vw
极客时间<透视HTTP协议>