利用HTTPS协议打内网 SSRF新姿势

2021-03-01 14:52:30 浏览数 (1)

声明

本文作者: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协议>

0 人点赞