日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
如何發(fā)現(xiàn)NTP放大攻擊漏洞

NTP漏洞相關(guān)的文章在Drops 已經(jīng)有過(guò)了,并且不止一篇,之所以又翻譯了這一片文章,是覺(jué)得文章的整體思路很不錯(cuò),希望對(duì)看這篇文章的你有所幫助。

創(chuàng)新互聯(lián)長(zhǎng)期為成百上千客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開(kāi)放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為劍河企業(yè)提供專業(yè)的網(wǎng)站設(shè)計(jì)制作、成都做網(wǎng)站,劍河網(wǎng)站改版等技術(shù)服務(wù)。擁有十多年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開(kāi)發(fā)。

0x00 簡(jiǎn)介

NTP放大攻擊其實(shí)就是DDoS的一種。通過(guò)NTP服務(wù)器,可以把很小的請(qǐng)求變成很大的響應(yīng),這些響應(yīng)可以直接指向到受害者的電腦。

NTP放大使用的是MONLIST 命令。MONLIST 命令會(huì)讓 NTP 服務(wù)器返回使用 NTP 服務(wù)的最后600 個(gè)客戶端IP。通過(guò)一個(gè)有偽造源地址的NTP請(qǐng)求,NTP 服務(wù)器會(huì)將響應(yīng)返回給那個(gè)偽造的 IP 地址。你可以想象,如果我們偽造受害者的 IP 對(duì)大量的NTP服務(wù)器發(fā)送MONLIST請(qǐng)求,這將形成DOS攻擊。

顯然我們不能容忍這樣做,但我比較有興趣的是去發(fā)現(xiàn)有多少 NTP 服務(wù)器能夠發(fā)大這種數(shù)據(jù)。他不是什么新的攻擊,所以你希望不會(huì)有太多的NTP服務(wù)器支持MONLIST命令。

0x01 如何去做

為了確定有多少NTP服務(wù)器響應(yīng)MONLIST請(qǐng)求,我會(huì)通過(guò)兩個(gè)獨(dú)立的部分去做。

第一部分

在第一部分,通過(guò)masscan工具,對(duì)UDP的123 端口進(jìn)行掃描,掃描結(jié)果保存到 ntp.xml 文件中,命令如下:

./masscan -pU:123 -oX ntp.xml --rate 160000 101.0.0.0-120.0.0.0

由于我的服務(wù)器帶寬比較小,如果選擇全網(wǎng)掃描,肯定會(huì)較慢,所以我隨機(jī)的選擇了一個(gè) IP 段:101.0.0.0-120.0.0.0。

掃描完成后,會(huì)把 UDP 123 端口開(kāi)放的設(shè)備保存在 XML 文件中。不知道什么原因,我的掃描結(jié)果 xml 文件中包含了許多重復(fù)的記錄,我寫(xiě)了一個(gè) python 腳本用于處理這些重復(fù)的記錄,去重后的結(jié)果會(huì)保存到 port123.txt 文件中。

代碼如下:

 
 
 
  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('port123.txt', 'a')  
  7. #Iterates through the masscan XML file.  
  8. for event, element in etree.iterparse('ntp.xml', tag="host"):  
  9.     for child in element:  
  10.         if child.tag == 'address':  
  11.             #Assigns the current iterations address to the address variable.  
  12.             address = child.attrib['addr']  
  13.         if child.tag == 'ports':  
  14.             for a in child:  
  15.                 #Assigns the current iterations port to the port variable.  
  16.                 port = a.attrib['portid']  
  17.         #is both port and IP address are present.  
  18.         if port > 1 and address > 1:  
  19.             #If the IP hasnt yet been added to the output file.  
  20.             if address not in parsedServers:  
  21.                 print address  
  22.                 #Write the IP address to the file.  
  23.                 outputFile.write(address + '\n')  
  24.                 #write the IP to the parsedServers list  
  25.                 parsedServers.append(address)  
  26.             port = None 
  27.             address = None 
  28.     element.clear()  
  29. outputFile.close()  
  30. print 'End' 

這個(gè)腳本運(yùn)行后,port123.txt 文件中包含開(kāi)放 UDP 123 端口并且去重后的所有 IP。

第二部分

在第二部分中我們主要來(lái)確定port123.txt 中的IP的123端口是否運(yùn)行NTP服務(wù),如果是NTP 服務(wù),是否響應(yīng)MONLIST請(qǐng)求。

我寫(xiě)了一個(gè) python 腳本來(lái)實(shí)現(xiàn)上面的需求,主要用到 scapy 庫(kù)。

首先我導(dǎo)入我腳本需要的所有庫(kù),并且定義一些變量:

 
 
 
  1. from scapy.all import *  
  2. import thread  

 

然后我構(gòu)造了發(fā)給 NTP 服務(wù)器的 MONLIST 請(qǐng)求的原始數(shù)據(jù)。在這個(gè)過(guò)程中我發(fā)現(xiàn)請(qǐng)求的數(shù)據(jù)必須達(dá)到一定的值服務(wù)器才會(huì)返回?cái)?shù)據(jù),具體原因不清楚。只要請(qǐng)求超過(guò) 60 字節(jié),服務(wù)器就會(huì)返回?cái)?shù)據(jù),因此我下面的代碼中有 61 個(gè)\x00 字符。

 
 
 
  1. rawData = "\x17\x00\x03\x2a" + "\x00" * 61 

在 python 腳本中我打開(kāi)了兩個(gè)文件:port123.txt 是 masscan 發(fā)現(xiàn)的開(kāi)放 UDP 123 端口的 IP 地址,monlistServers.txt 是用于保存支持 MONLIST 命令的 NTP 服務(wù)器。

 
 
 
  1. logfile = open('port123.txt', 'r')  
  2. outputFile = open('monlistServers.txt', 'a')  

然后我定義了一個(gè)叫 sniffer 的函數(shù),這個(gè)函數(shù)的作用主要就是監(jiān)聽(tīng)在 48769 端口上的 UDP 數(shù)據(jù),這個(gè)端口是發(fā)送 MONLIST 請(qǐng)求的源端口,只要任何 NTP 服務(wù)器響應(yīng) MONLIST 請(qǐng)求,都將響應(yīng)到這個(gè)端口上。目標(biāo)網(wǎng)絡(luò)地址是你的 IP 地址,NTP 服務(wù)器的響應(yīng)將返回到這個(gè) IP 上,在本文中,我講設(shè)置這個(gè) IP 為:99.99.99.99。

 
 
 
  1. def sniffer():  
  2. sniffedPacket = sniff(filter="udp port 48769 and dst net 99.99.99.99", store=0, prn=analyser)  
  3.  

任何符合 UDP 端口 48769 的數(shù)據(jù)包都會(huì)被捕獲到,并且會(huì)放到 analyser 函數(shù)中,稍后我講介紹 analyser 函數(shù)。

sniffer 定義好了,并且會(huì)在線程中執(zhí)行,同時(shí)會(huì)放到后臺(tái)運(yùn)行。

 
 
 
  1. thread.start_new_thread(sniffer, ()) 

接下來(lái),我遍歷 masscan 發(fā)現(xiàn)的所有 IP 地址。對(duì)于每個(gè) IP 地址我都會(huì)發(fā)送一個(gè)源端口為 48769,目的端口是 123 的 UDP 數(shù)據(jù)包,數(shù)據(jù)包就是我們前面構(gòu)造的 rawData。實(shí)際上這個(gè)就是對(duì)所有的 IP 發(fā)送 MONLIST 請(qǐng)求。

 
 
 
  1. for address in logfile:  
  2. send(IP(dst=address)/UDP(sport=48769, dport=123)/Raw(load=rawData)) 

只要有 NTP 服務(wù)器響應(yīng) MONLIST 請(qǐng)求,這個(gè)響應(yīng)數(shù)據(jù)將會(huì)被運(yùn)行在線程中 sniffer 抓取,sniffer 會(huì)把所有接收到的數(shù)據(jù)放到 analyser 函數(shù)中處理,而 analyser 函數(shù)會(huì)檢查捕獲到的數(shù)據(jù)包,并且確定包的大小超過(guò) 200 字節(jié)。在實(shí)際的測(cè)試中我發(fā)現(xiàn),如果 NTP 服務(wù)器不響應(yīng) MONLIST 請(qǐng)求,響應(yīng)包的大小通常在 60-90 字節(jié),或者不存在響應(yīng)包。如果 NTP 服務(wù)器響應(yīng) MONLIST 請(qǐng)求,響應(yīng)包就會(huì)比較大,一般包含多個(gè)響應(yīng)包,通常每個(gè)包為 480 字節(jié)。所以只要檢查到所接收的響應(yīng)包是大于 200 字節(jié)就表示該 NTP 服務(wù)器支持 MONLIST 請(qǐng)求。最后我們會(huì)把響應(yīng)包大約 200 字節(jié)的 IP 地址寫(xiě)入到 outputFile。

 
 
 
  1. if len(packet) > 200:  
  2. if packet.haslayer(IP):  
  3. outputFile.write(packet.getlayer(IP).src + '\n')  

通常如果 NTP 服務(wù)器支持 MONLIST 請(qǐng)求,那么它將會(huì)返回多個(gè)數(shù)據(jù)包用于包含使用 NTP 服務(wù)的 IP 地址。因?yàn)?sniffer 會(huì)捕捉所有符合條件的數(shù)據(jù)包,所以 outputFile 文件中將會(huì)有許多重復(fù)的數(shù)據(jù)。我通過(guò) sort 和 uniq 命令來(lái)對(duì) outputFile 文件進(jìn)行去重。

 
 
 
  1. sort monlistServers.txt | uniq 

這個(gè)結(jié)果文件中包含所有支持 MONLIST 命令的 NTP 服務(wù)器。

完整的 python 腳本如下:

 
 
 
  1. from scapy.all import *  
  2. import thread  
  3. #Raw packet data used to request Monlist from NTP server  
  4. rawData = "\x17\x00\x03\x2a" + "\x00" * 61 
  5. #File containing all IP addresses with NTP port open.  
  6. logfile = open('output.txt', 'r')  
  7. #Output file used to store all monlist enabled servers  
  8. outputFile = open('monlistServers.txt', 'a')  
  9. def sniffer():  
  10.     #Sniffs incomming network traffic on UDP port 48769, all packets meeting thease requirements run through the analyser function.  
  11.     sniffedPacket = sniff(filter="udp port 48769 and dst net 99.99.99.99", store=0, prn=analyser)  
  12.  
  13. def analyser(packet):  
  14.     #If the server responds to the GET_MONLIST command.  
  15.     if len(packet) > 200:  
  16.         if packet.haslayer(IP):  
  17.             print packet.getlayer(IP).src  
  18.             #Outputs the IP address to a log file.  
  19.             outputFile.write(packet.getlayer(IP).src + '\n')  
  20.  
  21. thread.start_new_thread(sniffer, ())  
  22.  
  23. for address in logfile:  
  24.     #Creates a UDP packet with NTP port 123 as the destination and the MON_GETLIST payload.  
  25.     send(IP(dst=address)/UDP(sport=48769, dport=123)/Raw(load=rawData))  
  26. print 'End' 

0x02 最后

正如我前面所提到的,我的帶寬實(shí)在是太小了,所以我只能夠選擇一個(gè) IP 段:101.0.0.0-120.0.0.0。如果我的數(shù)學(xué)不是體育老師教的話,那么我應(yīng)該不會(huì)算錯(cuò),這個(gè) IP 段內(nèi)包含 318,767,104 個(gè) IP 地址(19256256)。

masscan 發(fā)現(xiàn) 253,994 個(gè)設(shè)備開(kāi)放了 UDP 的 123 端口,占了掃描 IP 的 0.08%。

在 253,994 個(gè)設(shè)備中,支持 MONLIST 命令的設(shè)備有 7005 個(gè),占比為 2.76%。

如果按照這個(gè)比例進(jìn)行換算的話,那個(gè)整個(gè)互聯(lián)網(wǎng)上將有 91,000 臺(tái)開(kāi)啟 MONLIST 功能的 NTP 服務(wù)器。

原文地址:http://jamesdotcom.com/?p=578


分享標(biāo)題:如何發(fā)現(xiàn)NTP放大攻擊漏洞
網(wǎng)站網(wǎng)址:http://www.5511xx.com/article/dhgecpo.html