【重磅!】Black Hat USA 2020议题When TLS Hacks You

2020年BlackHat大会上,Joshua Maddux介绍了一种针对SSRF的新颖利用思路,得到了广泛的关注。此类攻击是通过构造一个HTTPS Server,使TLS session中携带攻击载荷,攻击行为触发主要通过一个受限的SSRF漏洞(甚至一个钓鱼网页),结合TLS协议和DNS协议的特性,把攻击报文发到受害者内网的TCP服务中,达到SSRF漏洞攻击面扩大的效果。本文将针对此攻击进行较深入介绍和演示,供大家学习参考。
在演示该攻击方式之前,我们首先介绍以下关键知识:
SSRF
SSDNS Rebind
TLS session resumption
0x01 SSRFSSRF漏洞是一个常见的web安全漏洞,通过提交一段精心构造的请求信息,发送给服务器,欺骗服务器读取本地文件、探测内网信息、攻击内网其他服务器等。
攻击行为可以通过多种信息实现,取决于服务对协议的支持情况:
file://
dict://
TFTP://
https://
Gopher://
其中通过Gopher协议,我们可以构造的TCP上层报文,和大部分的TCP 服务器通信,比如MySQL、PostgreSQL、Redis、Memcached、SMTP,大大拓展了SSRF漏洞的攻击面。
DNS TTL 用来定义DNS解析数据在缓存中存放的时间,生存时间一到期,名称服务器就丢弃原有的缓存数据,并从权威名称服务器获取新的数据。假如一个域名的 TTL 为10s,当我们在这10s内,对该域名进行多次 DNS 请求,DNS 服务器,只会收到一次请求,其他的都是缓存。
详细的TTL设置参考RFC2181对DNS TTL的描述:
It ishereby specified that a TTL value is an unsigned number, with a minimum value of 0, and a maximum value of 2147483647. That is, a maximum of 2^31 - 1. When transmitted, this value shall be encoded in the less significant 31 bits of the 32 bit TTL field, with the most significant, or sign, bit set to zero.
在DNS应答报文中,TTL字段一共4个字节,其中低31位是有效位,数值范围为0到2^31 - 1,这里以百度域名解析应答为例,DNS应答报文设置了TTL值为249s(000000f9):
通常的SSRF防御措施是通过以下防御机制实现的:
这种SSRF防御思路上,通常会对目标url进行解析,“获取IP地址”然后进行ip判断,如果ip地址在正常范围内,则进入下一个逻辑,“服务端请求URL”。
因此,DNS Rebindind的攻击思路,是申请一个域名,构造一个DNS服务器,将域名解析到该DNS服务器,同时设置DNS服务器的应答包围TTL为0,在“获取ip地址”的逻辑中响应正常的ip地址,绕过了检测,与此同时由于TTL为0,因此在“服务端请求URL”步骤中,需要重新进行DNS解析,此时DNS服务器应答的ip地址为希望攻击的ip。
实验步骤如下:
设置域名解析的服务器为自定义的DNS服务器
启动自定义的DNS服务器
浏览器访问域名
在本地127.0.0.1地址启动http server
访问目标域名,结果响应结果为本地http服务