DNS Rebinding 广泛用于绕过同源策略、SSRF过滤等。

背景

为什么需要SSRF过滤器?
• 由于一些业务的需要,他们就是需要让用户输入URL,然后进行跳转,如果过滤得好,这就是一个正常功能,如果过滤得不好,那么这里就存在SSRF漏洞。

SSRF过滤器设计

有漏洞的SSRF过滤器执行步骤如下:

  1. 获取输入的URL,从该URL中提取HOST,如果提取出来的是IP,那么直接跳到第三步;
  2. 对该HOST进行DNS解析,获取到解析的IP;
  3. 检测该IP是否是合法的,比如是否是私有IP等(是就直接终止流程);
  4. 如果IP检测为合法的,则进入CURL发包;

漏洞点:
我们从DNS解析的角度看,该检测方式一共有两次,第一次是步骤2中对该HOST进行DNS解析,第二次是使用CURL发包的时候进行解析。这两次DNS解析是有时间差的,我们可以使用这个时间差进行绕过

其实上面就已经讲清楚DNS Rebinding漏洞的原理了,只不过只有大致步骤,下面我们就通过具体实现来深入了解。

背景知识

了解DNS Rebinding漏洞的利用步骤前,了解一些这些背景知识还是很有必要的。

DNS TTL

TTL值全称是“生存时间(Time To Live)”,简单的说它表示DNS记录在DNS服务器上缓存时间,数值越小,修改记录各地生效时间越快。
当各地的DNS(LDNS)服务器接受到解析请求时,就会向域名指定的授权DNS服务器发出解析请求从而获得解析记录;该解析记录会在DNS(LDNS)服务器中保存一段时间,这段时间内如果再接到这个域名的解析请求,DNS服务器将不再向授权DNS服务器发出请求,而是直接返回刚才获得的记录;而这个记录在DNS服务器上保留的时间,就是TTL值。

常见的设置TTL值的场景:
• 增大TTL值,以节约域名解析时间
• 减小TTL值,减少更新域名记录时的不可访问时间

公网DNS服务器

比如大名鼎鼎的:
114.114.114.114
8.8.8.8
...

DNS重绑定

需要自己持有一个域名,然后将这个域名解析指向自己的DNS Server,在该域名写2个解析服务。

同样是test.exploitcat.xyz.域名,却写上了两个A记录。这样做的目的就是,写2个解析服务,这样每次请求的时候都能返回不同的解析结果。

• 第一次请求DNS查询,结果返回的是101.191.60.117,是一个合法的公网IP;
• 第二次请求时,变成了私有IP 10.36.5.215;
简单来说就是已知服务器会向DNS服务器发送两次解析请求,目的就是要让第一次解析出来是个外网ip,第二次解析出来是个内网ip。

同一个域名绑定两条A记录。这样解析是随机的。 (ps:同时绑定两条A记录,在请求解析的时候并不一定交替返回)

注意,这两条记录的ttl都是0,这是为了防止有DNS服务器对解析结果进行缓存。现在国内购买的域名大都无法直接将TTL设置为0,例如我的阿里云的域名,最小的TTL是10分钟。而某些国外的域名可以设置TTL=0。
记住:TTL数值越小,修改记录各地生效时间越快。

自建DNS服务器

上面说的DNS重绑定,有个不好的点,就是解析是随机的,需要多次访问才能得到自己想要的内网IP。但是如果使用自建DNS服务器,那么就可以稳定的控制返回结果。

常见的技术方案:搭建DNS服务器采用python的twisted库中的name模块。具体技术细节自行搜索吧。


利用步骤图解

有了上面的背景知识铺垫,下面就可以开始看利用步骤图了。

建议看看里面的流程图:https://www.freebuf.com/column/194861.html

步骤6解释,当你请求外部恶意http://www.a.com时,www.a.com就加载了一个JS脚本,这个脚本的作用就是等待你机器的DNS缓存时间一到,就立马重新自动访问www.a.com。

攻击流程如下:

  1. 准备阶段

    • 攻击者注册一个域名,例如 evil.com
    • 攻击者完全控制这个域名的DNS服务器,可以设置非常短的TTL(生存时间,例如1秒或0秒),以便快速更改解析记录。
    • 攻击者搭建一个恶意网站,放在 evil.com 上,其中包含用于攻击的JavaScript代码(例如,扫描内网、爆破路由器密码的脚本)。
  2. 诱骗访问

    • 攻击者通过钓鱼邮件、恶意广告等方式,诱使受害者访问 http://evil.com
  3. 第一次DNS解析

    • 受害者的浏览器访问 evil.com
    • 浏览器向DNS服务器查询 evil.com 的IP地址。
    • 此时,攻击者控制的DNS服务器返回一个合法的外部IP(例如攻击者自己的服务器IP 1.2.3.4)。
    • 浏览器成功加载恶意网页,其中的JavaScript代码开始在受害者浏览器中运行。此时,同源策略允许该JS与 evil.com:80 通信
  4. Rebinding(重绑定)—— 攻击的核心

    • 恶意JavaScript代码并不会立即行动。它会先休眠一段时间(例如几分钟),或者设置一个定时器。
    • 休眠结束后,JS代码开始尝试与“同源”的目标(仍然是 evil.com)进行通信,例如向 http://evil.com/api/secret 发起AJAX请求。
    • 此时,浏览器的同源检查仍然认为目标是 evil.com,允许发送请求。
    • 但在发送请求之前,浏览器需要再次解析域名 evil.com 的IP地址(因为之前的DNS记录TTL极短,已经过期了)。
  5. 第二次DNS解析

    • 浏览器再次查询 evil.com 的IP。
    • 这次,攻击者控制的DNS服务器返回一个内网IP地址(例如 192.168.1.1127.0.0.1)。
  6. 攻击发生

    • 浏览器不知道也不关心IP地址的变化,它只认域名。根据同源策略,它认为这个请求是发往“同源” evil.com 的,因此允许该请求发出,并读取响应
    • 于是,这个请求实际上被发送到了你内网的路由器 192.168.1.1 上。
    • 恶意JS可以扫描内网的其他设备、窃取路由器管理界面的信息、尝试默认密码登录,甚至直接下发命令。

危害

你可以把它想象成一个“特洛伊木马”:攻击者先诱骗你访问一个外部网站(木马进城),然后这个网站“变身”,直接攻击你内部网络里的设备(木马里的士兵开始行动)。

防御

重新设计SSRF过滤器,在第四步中:4.如果IP检测为合法的,则进入CURL发包。 执行到发包流程的时候,直接换成IP访问访问WEB服务,并且判断IP是否符合规则,不符合规则的IP直接结束流程。

参考

https://blog.csdn.net/u011721501/article/details/54667714
https://www.freebuf.com/column/194861.html
http://bendawang.site/2017/05/31/关于DNS-rebinding的总结/

posted on 2021-03-02 18:30  Mysticbinary  阅读(2248)  评论(0)    收藏  举报