DNS Rebinding

这是最近学习的一个操作,CUIT校赛的时候遇到了ssrf的题目,有对输入的域名进行解析,然后对内网地址进行过滤,一般的绕过方式如下:

绕过ip限制

八进制
十六进制
IP地址的省略法

请求地址的奇怪方法:
http://1.1.1.1@真实地址
http://真实地址#2.2.2.2
http://真实地址?1.1.1.1
http:真实地址
Orange大佬的blackhat议题

请求的看起来不是内网ip,却是内网ip:
http://127.0.0.1.xip.io/ 请求的是127.0.0.1
http://www.127.0.0.1.xip.io/ 也是一样的

这些都是从正则层面进行的绕过,而DNS Rebinding则是在逻辑层面进行绕过的

下面是绕过原理和绕过需要的环境搭建方法

DNS Rebinding 绕过原理

一般的过滤IP地址的绕过逻辑是这样的

这种设计本来是没有问题的,但是注意这个地方:

请求的时候又用DNS服务器对url进行了一次解析,那么就可以这么操作一下,输入一个自己的域名,用自己的DNS服务器进行解析,在第一次解析的时候返回正常的IP,在第二次解析的时候返回目标IP,这样就可以实现绕过了。

PS:DNS Rebinding与TTL字段相关,比如1秒,目的就是请求该域名后,如果要再请求该域名的话就需要重新发起dns request而不是从本地的dns cache中去读取,这样才能读取到第二次修改了IP地址。

绕过实现

首先你需要一个自己的域名,还有一台服务器,然后这台服务器需要绑定一个域名。

然后在服务器上部署一个脚本,我用的是FakeDNS,在GitHub上能找到。这个脚本有很多功能,花式改解析,使用方法也很简单。

git clone https://github.com/Crypt0s/FakeDns 在/etc/FakeDns/有个dns.conf.example ,里面是
设置的示例,比如我要t-t.win第一次解析的时候解析为公网IP,第二次解析的时候解析为 127.0.0.1 就这么设置:

A t-t.win 120.25.80.195,127.0.0.1
将以上语句放倒/etc/FakeDns/的dns.conf中(需要自己创建)

开启脚本:

python fakedns.py -c /etc/FakeDns/dns.conf
然后DNS服务器端就配置好了,现在就需要使域名指定这个DNS服务器来解析:

比如我的服务器是阿里云的,绑定了farron.win。t-t.win是要用来DNS Rebinding的,那就在t-t.win的域名控制台这么设置:

这里服务器要写两个,第二个随便写就行了。

再添加A标签。

A标签的记录值写成自己配好的DNS服务器的IP地址。

这里有点坑,修改A标签会有一段时间的缓存时间,这时候自己测试是不成功的,请多等待一段时间。

然后就可以请求了,完成效果如下:

可以看到第一次解析成了120.24.98.110,第二次就变成了127.0.0.1,这样就可以绕过过滤了。



# CTF