DNS域传送漏洞

本文将对dns域传送漏洞进行分析与总结,如有错误,欢迎指出。谢谢!

0x00 基础

DNS: 网域名称系统(英文:Domain Name System,缩写:DNS)是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。DNS使用TCP和UDP端口53。当前,对于每一级域名长度的限制是63个字符,域名总长度则不能超过253个字符。

1
2
3
4
5
6
7
8
常用DNS记录:
主机记录(A记录): A记录是用于名称解析的重要记录,它将特定的主机名映射到对应主机的IP地址上。
IPv6主机记录(AAAA记录): 与A记录对应,用于将特定的主机名映射到一个主机的IPv6地址。
别名(CNAME记录): CNAME记录用于将某个别名指向到某个A记录上,这样就不需要再为某个新名字另外创建一条新的A记录。
电子邮件交换记录(MX记录): 记录一个邮件域名对应的IP地址
域名服务器记录 (NS记录): 记录该域名由哪台域名服务器解析
反向记录(PTR记录): 也即从IP地址到域名的一条记录
TXT记录: 记录域名的相关文本信息

DNS区域传送: DNS服务器分为主服务器、备份服务器和缓存服务器。而域传送指的是一台备用服务器使用来自主服务器的数据更新自己的域(zone)数据库。这为运行中的DNS服务提供了一定的冗余度,其目的是为了防止主的域名服务器因意外故障变得不可用时影响到整个域名的解析。
DNS域传送漏洞: 一般DNS区域传送操作只在网络里真的有备用域名DNS服务器时才有必要用到,但许多DNS服务器却被错误地配置成只要有client发出请求,就会向对方提供一个zone数据库的详细信息,即允许不受信任的因特网用户执行DNS区域传送操作。
危害: 便于快速判断出某个特定区域的所有主机,获取域信息,如网络拓扑结构、服务器ip地址,为攻击者的入侵提供大量敏感信息。
nslookup
nslookup是一个网络管理命令行工具,可用于许多计算机操作系统查询域名系统(DNS)以获取域名或IP地址映射或任何其他特定的DNS记录。
使用方式
非交互式:
icon
交互式:
icon
dig
dig是Linux默认自带的DNS拨测工具传送门

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
root@sunu11:~# dig -h
Usage: dig [@global-server] [domain] [q-type] [q-class] {q-opt}
{global-d-opt} host [@local-server] {local-d-opt}
[ host [@local-server] {local-d-opt} [...]]
Where: domain is in the Domain Name System
q-class is one of (in,hs,ch,...) [default: in]
q-type is one of (a,any,mx,ns,soa,hinfo,axfr,txt,...) [default:a]
(Use ixfr=version for type ixfr)
q-opt is one of:
-x dot-notation (shortcut for reverse lookups)
-t type (specify query type)
d-opt is of the form +keyword[=value], where keyword is:
+[no]cmd (Control display of command line)
+[no]comments (Control display of comment lines)
+[no]question (Control display of question)
+[no]answer (Control display of answer)
+[no]authority (Control display of authority)
+[no]additional (Control display of additional)
+[no]stats (Control display of statistics)
+[no]short (Disable everything except short
form of answer)
+[no]all (Set or clear all display flags)
global d-opts and servers (before host name) affect all queries.
local d-opts and servers (after host name) affect only that lookup.
-h (print help and exit)
-v (print version and exit)

0x01 实施

一、收集dns服务器信息

1、手工使用nslookup命令、whois查询等手段进行对某个域名的dns服务器信息的收集
icon
icon
2、利用网络空间搜索引擎收集域名服务器信息。如(shadon、zoomeye、fofa等)
icon
3、使用MASSCAN 进行端口扫描后,获取开放53号端口的dns服务器地址;请参考使用指南
4、网上存在一些dns社工裤,也可以从中获取所需要的dns服务器信息。

二、检测DNS域传送漏洞

1、使用nmap扫描

使用如下命令:

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

icon
其中dns-zone-transfer.domain参数为指定要查询的域;dns.xxx 为指定的查询域名服务器

2、使用dig命令

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

3、nslookup命令
交互式:
1
2
3
4
1) 输入nslookup命令进入交互式shell界面;
2) server 命令参数设定查询将要使用的DNS服务器;针对某个域名可先输入域名获取dns信息。
3) ls命令列出某个域中的所有域名;如果太长不适合查看可定向保存至文件夹中。
4) exit命令退出

icon

非交互式方法

为了避免和nslookup交换,可以编写一个ls.bat。echo ls %1 | nslookup – %2通过执行ls.bat xxx.edu.cn dns.xxx.edu.cn进行测试。

0x02 拓展

单个查询:

【使用dztester.py [domain]即可】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#!/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!\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!'

批量查询脚本:

脚本同一目录下应有dns-zone-transfer目录;dns-zone-transfer目录下有‘dns’子目录;要检测的域名列表存放在dns-zone-transfer\domain.txt中,一行一个。结果存储在dns-zone-transfer\dns目录和dns-zone-transfer\vulnerable_hosts.txt文件中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# 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\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”

0x03 总结

linux系统和windows系统都可以检测出使用的DNS是否存在域传送漏洞,如果存在该漏洞,通过执行命令我们可以清楚的看到整个域下的域名解析信息。
解决方案:区域传送是DNS常用的功能,严格限制允许区域传送的主机是解决dns域传送漏洞的有效手段。最后感谢前辈们的文章与辛勤奉献! 本文作技术研究使用,切勿用本文中的方法违法犯罪!
参考链接:
李劼杰DNS域传送漏洞系列博客 http://www.lijiejie.com/?s=DNS%E5%9F%9F%E4%BC%A0%E9%80%81%E6%BC%8F%E6%B4%9E&submit=Search
DNS域传送漏洞的收集、检测与利用 http://blog.csdn.net/c465869935/article/details/53444117
DNS域传送漏洞利用 https://www.waitalone.cn/dns-domain-transfer-exploits.html
lijiejie/edu-dns-zone-transfer https://github.com/lijiejie/edu-dns-zone-transfer/blob/master/vulnerable_hosts.txt

~~

-------------本文结束感谢您的阅读-------------
  • Post author: SuNu11
  • Post link: http://sunu11.com/2017/03/16/8/
  • Copyright Notice: All articles in this blog are licensed under BY-NC-SA unless stating additionally.