DNS重绑定漏洞-简单理解

/ 0评 / 0

什么是DNS

域名系统(Domain Name System,DNS)是Internet上解决网上机器命名的一种系统。就像拜访朋友要先知道别人家怎么走一样,Internet上当一台主机要访问另外一台主机时,必须首先获知其地址,TCP/IP中的IP地址是由四段以“.”分开的数字组成(此处以IPv4的地址为例,IPv6的地址同理),记起来总是不如名字那么方便,所以,就采用了域名系统来管理名字和IP对应关系。

DNS TTL

TTL(Time To Live),简单的说它表示DNS记录在DNS服务器上缓存时间,数值越小,修改记录各地生效时间越快。

当各地的DNS(LDNS)服务器接受到解析请求时,就会向域名指定的授权DNS服务器发出解析请求从而获得解析记录;该解析记录会在DNS(LDNS)服务器中保存一段时间,这段时间内如果再接到这个域名的解析请求,DNS服务器将不再向授权DNS服务器发出请求,而是直接返回刚才获得的记录;而这个记录在DNS服务器上保留的时间,就是TTL值。

增大TTL,以节约域名解析时间

减小TLL,减少更新域名记录时不可访问的时间

DNS Rebingding

在网页浏览过程中,用户在地址栏中输入包含域名的网址。浏览器通过DNS服务器将域名解析为IP地址,然后向对应的IP地址请求资源,最后展现给用户。而对于域名所有者,他可以设置域名所对应的IP地址。当用户第一次访问,解析域名获取一个IP地址;然后,域名持有者修改对应的IP地址;用户再次请求该域名,就会获取一个新的IP地址。对于浏览器来说,整个过程访问的都是同一域名,所以认为是安全的。这就造成了DNS Rebinding攻击。

具体步骤

1、攻击者控制恶意的DNS服务器来回复域的查询,如rebind.network

2、攻击者通过一些方式诱导受害者加载rebing.network

3、用户打开链接,浏览器就会发出DNS请求查找rebind.network的IP地址

4、恶意DNS服务器收到受害者的请求,并使用真实IP地址进行响应,并将TTL值设置为1秒,让受害者的机器缓存很快失效

5、从rebind.network加载的网页包含恶意的js代码,构造恶意的请求到rebind.network/index,而受害者的浏览器便在执行恶意请求

6、一开始的恶意请求当然是发到了攻击者的服务器上,但是随着TTL时间结束,攻击者就可以让rebind.network绑定到别的IP,如果能捕获受害者的一些放在内网的应用IP地址,就可以针对这个内网应用构造出对应的恶意请求,然后浏览器执行的恶意请求就发送到了内网应用,达到了攻击的效果

示例

SECCON 2019 Web: Option-Cmd-U

<?php
if (isset($_GET['url'])){
    $url = filter_input(INPUT_GET, 'url');
    $parsed_url = parse_url($url);                        
    if($parsed_url["scheme"] !== "http"){
        // only http: should be allowed. 
        echo 'URL should start with http!';
    } else if (gethostbyname(idn_to_ascii($parsed_url["host"], 0, INTL_IDNA_VARIANT_UTS46)) === gethostbyname("nginx")) {
    // local access to nginx from php-fpm should be blocked.
        echo 'Oops, are you a robot or an attacker?';
    } else {
    // file_get_contents needs idn_to_ascii(): https://stackoverflow.com/questions/40663425/
        highlight_string(file_get_contents(idn_to_ascii($url, 0, INTL_IDNA_VARIANT_UTS46),
               false,
               stream_context_create(array(
                   'http' => array(
                       'follow_location' => false,
                       'timeout' => 2
                   )
    ))));
    }
}

这是一个测试dns重绑定漏洞的网站,可以让一个域名随机的绑定两个IP

lock.cmpxchg8b.com/rebi

通过简单fuzz我们知道自己的ip被绑定为172.25.0.1,通过上面的链接我们构造域名,一个填172.25.0.1,另一个填写随意。多试几次就可以出来了

同样有另外解法

http://nginx:80/flag.php
http://@nginx/flag.php
http://nginx/flag.php

参考链接

http://www.ruanyifeng.com/blog/2016/06/dns.html

https://zhuanlan.zhihu.com/p/89426041

发表评论

邮箱地址不会被公开。