Chargen反射DDoS攻击检测
2014-08-21赵煜夏震杨望丁伟
文 /赵煜 夏震 杨望 丁伟
分布式拒绝服务(Distributed Denial of Service,DDoS)攻击是指在传统的拒绝服务(Denial of Service,DoS)攻击基础上产生的分布式大规模攻击方式。
UDP数据风暴(UDP Storm)是DDoS攻击手段的一种。攻击者通过向被攻击主机发送大量带有无用数据的UDP报文,使信道资源的利用率下降,从而达到拒绝服务的目的。UDP Storm攻击的实现手法可分为直接攻击和反射攻击。在直接攻击方式下,攻击者控制僵尸主机上通过后门等非法手段安装的僵尸进程向被攻击服务器发送UDP报文;而反射攻击则是攻击者通过伪造被攻击主机地址向大量有漏洞的主机发送某些基于UDP服务的特殊请求报文,这些请求的回复会被放大数倍后发送到被攻击主机从而达到攻击目的。反射式DDoS攻击不需要控制僵尸进程,实现起来更方便且不容易被追踪,因此它已经成了一种最近非常活跃的DDoS攻击手段。一些较常见的被用于反射攻击的服务有Chargen服务、NTP服务和DNS服务等。
Chargen反射DDoS攻击
Chargen字符发生器协议(Character Generator Protocol)是一种简单网络协议,设计的目的是用来调试TCP或UDP协议程序、测量连接的带宽或进行QoS的微调等。它的默认端口为19,分为基于TCP和UDP两种方式,TCP方式下建立连接后,服务器会不断传送任意字符到客户端,直到客户端关闭连接。UDP方式下每当服务器收到客户端的一个UDP数据包后向客户端返回一个数据包,长度为0~512字节之间随机值,数据包的负载可以是任意字符。
Chargen协议的设计初衷是为了网络测试,并没有严格的访问控制和流量控制机制,在UDP模式下任何人都可以向开放该服务的主机请求服务,这种简单的请求-回复模式便为DDoS攻击者提供了便利。图1给出了这个攻击的示意。图中攻击者的地址是IP A,三元组(src=0:S,dst=1:19,proto=UDP )表示A伪造被攻击对象地址IP 0和端口S,向被利用主机IP1的19端口发送的Chargen请求报文,对应被利用主机放大后的回复报文流向了被攻击主机IP 0。这个漏洞早在1996年就被发现(CVE-1999-0103),该漏洞被利用最主要的原因是实现过程没有设计必要的访问控制。
虽然RFC 864对Chargen协议标准作出了说明,但不同操作系统在实现上并不一致,许多系统的UDP回复报文超过了512字节的字符,这种机制恰恰满足DDoS攻击对于流量放大的需求。流量放大程度在不同的操作系统上有所不同,有些可以达到几十倍。为此我们进行了简单的实验,在Linux系统下,对于64字节的无负载UDP Chargen请求,系统回复一个1066字节的UDP应答报文,而在Windows系统下使用同样的请求,回复的UDP应答报文长度达3259字节,并产生了分片,流量被放大了50倍。
图1 Chargen反射攻击模式
基于流记录的检测方法
检测算法
由于Chargen不是常用协议,因此对于这类DDoS可以使用基于端口匹配的方法进行检测。这种检测方法适用于部署在网络边界,用于对网内主机参与Chargen攻击的情况进行监测,即只有当攻击流量穿越网络边界,即被攻击者位于网外时能被检测到,无法感知攻击和受害主机都在网络内部的情况。
算法实现
我们将上述Chargen攻击检测算法成功地实现在NBOS系统平台上,完成了对CERNET网内参与Chargen攻击的主机的检测。
NBOS(Network Behavior Observation System)是CERNET华东北地区网络中心在国家科技支撑计划课题“新一代可信任互联网安全和网络服务”支持下开发的用于监控和管理CERNET网络服务质量和网络安全状态的新型网络管理系统,它基于流记录工作,以不同的时空尺度提供网络的基础运行数据。2013年8月,NBOS完成了在CERNET全国38个主节点的部署,并稳定运行到现在。
在实现过程中,为了不影响NBOS的正常运行我们只选择检测了向国外主机发起Chargen攻击的流量,因为只需要检测到一次攻击行为就可以定位发起Chargen攻击主机,因此这个方法不会影响对事件主机的查准率。
检测结果
实际检测时算法使用的阀值是在一个5分钟的NBOS时间粒度中,UDP:19平均流量超过1Mbps。图2给出了检测结果的实例,从2个角度进行了展示。(a)给出了一个CERNET主节点所管理的网络在某个时间段参与过Chargen攻击的主机列表;(b)是某个主节点参与一次特定Chargen攻击的主机列表。
在CERNET的38个主节点中,NBOS目前可以获取完整分析源数据(流记录)的主节点有28个,还有2个主节点只能获得部分分析源数据。根据上述检测程序在这些主节点上的运行观测发现2013年这些主节点的被管网络中普遍存在着Chargen反射式UDP Storm攻击,大量校园网主机被用作攻击主机,到2014年的情况没有明显改善,仍有超过500台主机存在这个漏洞并有持续参与攻击的行为发生。有关结果在图3中给出,其中(a)为2014年3月10日~23日这14天中按天统计的全网Chargen攻击活跃主机情况,(b)为该时间段内CERNET各节点平均主机和事件数的分布情况,图中节点1-2为获取部分分析源数据的节点,3-30为28个获取全部分析源数据的节点。
图2 CERNET上的Chargen攻击检测结果
图3 (a)2014年3月中旬Chargen攻击活跃主机数
图3 (b) CERNET全网2014年Chargen攻击活跃主机数及事件数分布
图4 2014年1月12日14:03~14:13时段某攻击主机通信的流量
数据源缺陷分析
Chargen反射攻击理论上应该是纯净的19端口的UDP流量,然而在实际的检测结果中却发现攻击流量里伴随着大量固定高端端口流量,这个现象在所有主节点的检测结果中普遍存在。为此,我们在江苏省网边界与流记录同一接口位置上采集了面向有Chargen反射行为主机的全部原始报文与同一时间段获取的流记录进行对比分析,发现这是由于NBOS所使用的由某个品牌路由器提供的流记录未能正确处理UDP分片报文导致的,流记录将Chargen反射中的分片报文作为普通报文进行处理。
图4给出了一个具体的实例来说明这个问题。图中(a)是路由器给出的原始流记录数据,显示源IP为202.*.200.91的地址使用30070端口与185.*.104.70的30464端口通信,而在同一时间段采集的原始报文序列中没有发现任何202.*.200.91使用30070端口与185.*.104.70通信的报文,但报文序列中该地址发送过大量的UDP分片报文,这些分片报文是202.*.200.91的19端口回应Chargen请求产生的。进一步分析其中的一个分片报文的内容(图4(b))发现,若以普通UDP报文结构来解析,在UDP分片报文源端口号位置的数据是0x7576,而这个16进制数所对应的十进制值就是30070。用相似方法对其他分片报文进行解析可以获得另外几个端口。这个实验的结果说明为NBOS提供流记录的路由器,在流记录的输出过程中,把UDP分片报文错误地处理成了正常的UDP报文。
由于只有Windows系统的UDP Chargen回复会产生报文分片,因此利用数据源的这个缺陷,我们可以判定参与Chargen攻击主机的操作系统类型。
本文分析了一个在NBOS平台上实现的Chargen反射DDoS检测算法,并用其对CERNET中的Chargen攻击现象进行了观测和统计。从实际的观测结果来看,这类攻击在CERNET中相对多发。网络上的服务器对类似Chargen协议管理松懈是这个现象的主要原因。实际上,对这个攻击的防范还是比较简单的,只要关闭19端口就可以了。即使这个服务一定要开放,至少应该增加一个访问控制机制。
本文的另一个贡献是发现了某品牌路由器的流记录对UDP报文分片的处理存在缺陷。