反射型 DDoS 攻击的原理和防范措施
随着僵尸网络的兴起,同时由于攻击方法简单、影响较大、难以追查等特点,分布式拒绝服务攻击(DDoS,Distributed Denial of Service)得到快速壮大和日益泛滥。
成千上万主机组成的僵尸网络为 DDoS 攻击提供了所需的带宽和主机,形成了规模巨大的攻击和网络流量,对被攻击网络造成了极大的危害。更加可怕的是 DDoS 并没有彻底的解决办法,只能依靠各种手段和各个层次的防护进行缓解。
1 背景
2015 年 12 月,国内一家云厂商声称部署在其云平台上的一家知名游戏公司遭遇了峰值流量达到每秒 453.8Gbps 的 DDoS 攻击。
2016 年 9 月,为全世界范围内提供网站托管服务的法国公司 OVH 的创始人兼 CTO 在 Twitter 上发出了一张截图,图中显示了 OVH 的多个服务器同时遭到了峰值接近 1Tbps 的 DDoS 攻击。如下图所示,可以发现这次 DDoS 攻击中单一攻击的吞吐量最高就可达每秒 9300 万个包,即 799Gbps。
2016 年 10 月,黑客通过互联网控制了美国大量的网络摄像头和相关的 DVR 录像机,然后操纵这些肉鸡攻击了美国多个知名网站,包括 Twitter、Paypal、Spotify 在内的网站*中断服务,此次攻击影响了大半个美国互联网。
由此可见,DDoS 攻击正变得越来越严重,动辄上百 Gbps 的攻击都十分常见,并且,这样的攻击只会越来越大型。而且,随着网络安全界和黑帽子掌握越来越多的互联网资源,攻击复杂性也一直在增加,相应的,业务和应用所面临的网络 DDoS 挑战也不断增多。
因此,我们必须在 DDoS 威胁、影响关键业务和应用之前,对流量进行检测并加以清洗,确保网络正常稳定的运行以及业务的正常开展。
2 反射攻击
一般而言,我们会根据针对的协议类型和攻击方式的不同,把 DDoS 分成 SYN Flood、ACK Flood、UDP Flood、NTP Flood、SSDP Flood、DNS Flood、HTTP Flood、ICMP Flood、CC 等各类攻击类型。
每一种攻击类型都有其特点,而反射型的 DDoS 攻击是一种新的变种。攻击者并不直接攻击目标服务 IP,而是利用互联网的某些特殊服务开放的服务器,通过伪造被攻击者的 IP 地址、向有开放服务的服务器发送构造的请求报文,该服务器会将数倍于请求报文的回复数据发送到被攻击 IP,从而对后者间接形成 DDoS 攻击。
如下图所示,这里的攻击者(Attacker,实际情况中更多的会利用傀儡机进行攻击)不直接把攻击包发给受害者,而是冒充受害者给放大器(Amplifiers)发包,然后通过放大器再反射给受害者。
在反射型攻击中,攻击者利用了网络协议的缺陷或者漏洞进行 IP 欺骗,主要是因为很多协议(例如 ICMP,UDP 等)对源 IP 不进行认证。同时,要达到更好的攻击效果,黑客一般会选择具有放大效果的协议服务进行攻击。总结一下就是利用 IP 欺骗进行反射和放大,从而达到四两拨千斤的效果。
3 Smurf 攻击
Smurf 攻击是经典的 DDoS 攻击,Smurf 攻击是以最初发动这种攻击的程序名 Smurf 来命名。这种攻击方法结合使用了 IP 欺骗和 ICMP 回复方法使大量网络传输充斥目标系统,引起目标系统拒绝为正常系统进行服务。
攻击的过程大致是这样的:Attacker 向一个具有大量主机和因特网连接的网络广播地址发送一个欺骗性 Ping 包,而欺骗性 Ping 分组的源地址就是 Victim(9.9.9.9)希望攻击的目标。路由器接收到这个发送给 IP 广播地址(1.1.1.255)的分组后,由于 ICMP 并不会进行握手而验证源 IP 地址,路由器认为这就是广播分组,进而会对本地网段中的所有主机(1.1.1.2,1.1.1.3,1.1.1.4,1.1.1.5,1.1.1.6) 进行广播。网段中的所有主机都会向欺骗性分组的 IP 地址发送 echo 响应信息。如果这是一个很大的以太网段,可能会有上百台主机对收到的 echo 请求进行回复,这些目标系统很快就会被大量的 echo 信息吞没,这样就能轻而易举地阻止该系统处理其它任何网络传输,从而达到拒绝为正常系统服务的结果。
这种攻击不仅影响目标系统,还影响目标公司的因特网连接。那么如何防止这种类型的攻击?
a. 阻塞 Smurf 攻击的源头。Smurf 攻击依靠攻击者的力量使用欺骗性源地址发送 echo 请求,用户可以使用路由器的访问控制来保证内部网络中发出的所有传输信息都具有合法的源地址,以防止这种攻击。
b. 阻塞 Smurf 的反弹站点。用户可以有两种选择以阻塞 Smurf 攻击的反弹站点。第一种方法可以通过 ACL 阻止所有入站 echo 请求,这样可以防止这些分组到达自己的网络。如果不能阻塞所有入站 echo 请求,用户就需要让自己的路由器把网络广播地址映射成为 LAN 广播地址。
4 DNS 反射攻击
DNS 服务是整个互联网的基础服务,在我们链接互联网的时候,需要通过 DNS 解析将域名转化成对应的 IP 地址。理论上来说 ISP 的 DNS 服务器只响应来自它自己客户 IP 的 DNS Query 响应,但事实上互联网上大量 DNS 服务的默认配置缺失,导致了会响应所有 IP 的 DNS Query 请求。
同时,DNS 大部分使用 UDP 协议,UDP 协议没有握手过程让其去验证请求的源 IP。如下图所示,攻击者(实际上是攻击者控制的傀儡机)发送大量伪造了 Victim IP 的请求给 DNS 服务器,DNS 服务器成为放大器将 DNS 响应回复给受害者。
下面再来看一下 DNS 如何将请求数据包进行放大,输入(x.x.x.x为 DNS 服务器 IP):
dig ANY @x.x.x.x
返回结果,这里为了节约篇幅,我们省略了大部分的响应内容。我们可以看到,响应的内容远远大于请求的数据包内容,这里就产生了放大的效果。
; <<>> DiG 9.7.3 <<>> ANY @x.x.x.x
;; global options: +cmd
;; Got answer:
………………………………….此处省略具体请求内容…………………………………………
isc.org. 484 IN RRSIG A 5 2 7200 20121125230752 20121026230752 4442 isc.org. ViS+qg95DibkkZ5kbL8vCBpRUqI2/M9UwthPVCXl8ciglLftiMC9WUzq Ul3FBbri5CKD/YNXqyvjxyvmZfkQLDUmffjDB+ZGqBxSpG8j1fDwK6n1 hWbKf7QSe4LuJZyEgXFEkP16CmVyZCTITUh2TNDmRgsoxrvrOqOePWhp 8+E=
不幸的是,目前互联网上存在大量的 DNS 服务器可以被利用,黑客使用网络扫描器工具可以很容易的发现这些 DNS 服务器并加以利用。这需要:
a. 如果您是 DNS 的管理员,需要加固 DNS 服务器,可以按照下面的配置关闭递归功能和限制可查询的 IP 地址。
options { recursion no;};
options { allow-query {192.168.1.0/24;};};
b. 如果是受害者,首先可以通过网络层的 ACL 规则来防御, 或者使用抗 DDoS 系统进行流量清洗,目前大部分的云服务商都有这类功能。
5 NTP 反射攻击
NTP 是网络时间协议(Network Time Protocol)的简称,是用来使计算机时间同步化的网络协议。NTP 包含一个 monlist 功能,也被称为 MON_GETLIST,主要用于监控 NTP 服务器,NTP 服务器响应 monlist 后就会返回与 NTP 服务器进行过时间同步的最后 600 个客户端的 IP,响应包按照每 6 个 IP 进行分割,最多有 100 个响应包。我们可以通过 ntpdc 命令向一个 NTP 服务器发送 monlist 以及结合抓包来看下实际的效果。
ntpdc -n -c monlist x.x.x.x | wc -l
602
在上面的命令行中我们可以看到一次含有 monlist 的请求收到了 602 行数据,除去头两行是无效数据外,正好是 600 个客户端 IP 列表,并且从上图中的 wireshark 中我们也可看到显示有 101 个 NTP 协议的包,除去一个请求包,正好是 100 个响应包。
a. 如果作为 NTP 管理员,需要加固 NTP 服务,NTP 服务器升级到 4.2.7p26 或者更高的版本。关闭现在 NTP 服务的 monlist 功能,在ntp.conf 配置文件中增加选项
disable monitor
b. 如果是受害者,如何防御 NTP 反射和放大攻击?首先可以通过网络层的 ACL 规则来防御, 或者使用抗 DDoS 系统进行流量清洗,目前大部分的云服务商都有这类功能。
6 SSDP 反射攻击
互联网上家用路由器、网络摄像头、打印机、智能家电等智能设备普遍采用 UPnP(即插即用)协议作为网络通讯协议, 而 UPnP 设备的发现是通过源端口为 1900 的 SSDP(简单服务发现协议)进行相互感知。
利用 SSDP 协议进行反射攻击的原理与利用 DNS 服务、NTP 服务类似,都是伪造成被攻击者的 IP 地址向互联网上大量的智能设备发起 SSDP 请求,接收到请求的智能设备根据源 IP 地址将响应数据包返回给受害者。随着物联网和智能设备的快速发展和普及,利用智能设备展开 DDoS 攻击会越来越普遍。SSDP 的请求报文示例如下:
M-SEARCH * HTTP/1.1
HOST: 1.2.2.3:1900
MAN: “ssdp:discover”
MX: 1
ST: urn:dial-multiscreen-org:service:dial:1
返回的报文如下:
HTTP/1.1 200 OK
CACHE-CONTROL: max-age = 60
EXT:
LOCATION:
SERVER: Network Printer Server UPnP/1.0 OS 1.29.00.44 06-17-2009
ST: upnp:rootdevice
USN: uuid:Samsung-Printer-1_0-mrgutenberg::upnp:rootdevice
那么该如何防护 SSDP 攻击呢?
a. 对于不需要即插即用服务的设备,关闭即插即用服务。
b. 在被 SSDP DDoS 攻击的时候,通过网络设备的 ACL 规则过滤 SSDP 指纹过滤。或者引入 DDoS 防护系统。
7 BT 反射攻击
BT下载过程
- 用户先到web服务器下载torrent种子文件(HTTP或HTTPS协议)。
- Bt客户端(peer)打开下载的torrent文件,解析出tracker等信息。
- Bt客户端(peer)到tracker服务器请求种子信息(可以从谁那里下载所需要的文件,给出一份下载地址列表);同时把自己的IP、端口等信息上传到tracker服务器中(方便其它的peer找到你,从你这里下载他需要的文件片段,此时你这个peer充当的是服务器的角色);
- Bt客户端(peer)获取到种子信息之后,开始向其它的peer请求对应的文件信息,如下图所示:
结合上面的图(该图片引自网络),举个例子说明这个过程:
- 我的bt客户端,向tracker服务器发送请求,想要获取piece 1的内容;
- Tracker服务器告诉我的bt客户端:peer1和peer4有你想要的文件片段,你去他那里下载吧;
- 你的bt客户端就会主动连接这两个peer去获取你想要的文件。
- 完成之后,你就保存了0-4所有的片段。
再举个例子:
- 假设在你获取完0-4所有片段之后,此时peer3想要请求片段3,他会首先向tracker服务器请求:谁有piece 3,告诉我;
- Tracker服务器收到请求之后,告诉peer3:peer1、peer2、peer_nsfocus(假设你的peer就叫peer_nsfocus)有piece3;
- Peer3收到之后,会向这三个peer请求piece3;
注: 如果你再下载完成之后,立刻关闭了你的bt客户端,那么peer3就只能去peer1和peer2去请求piece3了。如果大家都在下载完成之后就立刻关闭自己的客户端,那么种子数量就会非常少,整个下载速度就会很慢。所以BT社区建议的使用方式是,在自己下载完成之后,开着自己的bt客户端,方便其它peer从你这里获取文件,加快下载速度。
P2P文件传输过程
两个peer之间传输文件的过程中有两种方式:基于TCP和基于UTP的。
基于TCP传输
- 两个peer之间先建立三次握手连接;
- 发送bittorrent的handshake消息;
- 之后传输数据。
基于UTP传输
UTP协议:Micro Transport Protocol 或者µTP协议是一个基于UDP协议的开放式BT点对点文件共享协议。它的目的是减轻延迟,并且解决传统的基于TCP的BT协议所遇到的拥塞控制问题,提供可靠的有序的传送。
正常情况下,整个交互过程是这样的:
- 客户端(此处也就是YOU)发送一个ST_SYN请求给服务器(此处也就是PEER1);
- 服务端收到之后回复一个ST_STATE,表示连接已经建立好了;
- 之后就是两端的握手消息(88 Byte);
- 之后就是交互数据。
但由于从peer1返回的包(上面的虚线过程)并没有被校验,就成为被攻击者利用的环节。
反射放大攻击分析
反射原理如下图:
- 由于UTP只需要两次握手就可以建立连接,使得攻击者可以很容易伪造源IP完成连接的建立。
- **由于**** peer1 *\*并没有检查第**** 2 *\*个包(**** ST_STATE *\*)是否被**** attacke *\*收到,而是直接相信该源**** IP ****是真实的,** 所以当attacker再次伪造源IP发送handshake包的时候,peer1会立刻回应handshake包,而且超时之后还会重传,增大了放大倍数。
由于重现攻击过程,需要更新时间戳等信息,比较复杂,同时也考虑到安全性问题,这里就不做展开讨论了。
业界评价BT放大式攻击
BitTorrent的发言人表示,公司已经”采取措施增强了这些协议以减轻该研究论文中列出的漏洞所带来的影响。”然而,TorrentFreak网站表示,”uTorrent仍然不安全。”Adamsky表明,包括uTorrent在内的最流行的BitTorrent客户端最易受到攻击。
BitTorrent承认,鉴于基于UDP的协议的运行方式,这些攻击将可能一直存在,并表明将很快完全防护这些漏洞,但具体方法尚未确定。Tenable Network Security的战略分析师表示,利用BitTorrent反射DDoS攻击的做法并非第一次了,但Adamsky研究的独特之处在于揭示了研究人员在攻击测试过程中所实现的流量放大倍数。
我们向Cris Thomas了解此类攻击在现实世界到底会造成多大的影响。他表示,”目前并未大规模发现此类攻击,因此不必太过担忧。然而,如果攻击者也看到了这篇论文,可能很快就会执行攻击。”Malwarebytes的高级情报分析师也表示了担忧,预言那些脚本小子必将利用论文中描述的技术在某一时刻攻击网络,并指出当该论文的研究付诸实践时,DDoS攻击将大量出现。”有效防御这些攻击极具挑战性,”他们告诉SCMagazineUK。反射技术不仅放大了拒绝服务,同时也有效屏蔽了攻击者的IP地址,使得攻击源难以定位。虽然BitTorrent流量检测和丢弃方案有助于缓解DRDoS攻击,但会产生很大负载,因此并非理想方案。
在接受SCMagazineUK采访时,OPSWAT软件工程经理煞费苦心地指出,我们不应该认为分布式机制的本质是坏的或在安全性方面就一定比非分布式机制差。他说,”我讨厌制造’反P2P’的恐慌情绪。虽然分布式架构可能会存在特定的安全问题,但非分布式架构也同样如此。”Arbor Networks技术专家也表示,BitTorrent只是这类攻击可利用的协议之一,DNS、NTP、SSDP、CHARGEN、SNMP以及Portmap都可用于发动此类攻击。但利用BitTorrent的优势在于,放大的反射型攻击流量的源端口是动态的。
有人建议,BitTorrent可考虑改用三次握手协议如TCP,代替当前使用的二次握手协议。这可能会导致性能降低,但三次握手协议可检测到伪造的源IP地址,因为这些地址无法回复第一条握手消息。他说,”这会降低攻击过程中的流量放大倍数。”众所周知,这正是BitTorrent目前在漏洞防护过程中通过增强协议要实现的目标。
BT放大式攻击防护
如同上面所说,攻击者基于BT的放射式放大攻击不同于传统的反射攻击,因为它的端口是不固定的,所以封端口的策略不可行,只能靠识别应用层的特征来过滤攻击。防护方式建议从两个方面进行:
- 对于bittorrent客户端,可以考虑改用原来的tcp方式,杜绝虚假源导致的放大攻击。
- 防护设备对utp报文的payload做识别,utp前两个字节是有特征的,第1个字节代表版本号和类型,对于放大的报文,该字段为0x01;第2个字节 代表utp的扩展字段,有3种取值:0x00、0x01、0x02,一般情况下该字段为0x00. 可以根据这些特征做限速等策略。
附录:文中术语
- Torrent文件:保存了相应的种子信息、tracker服务器信息等;
- Web服务器:用来存放 .torrent文件,共用户去下载的。
- Peer:代表每个bt客户端(实际上每个peer既是服务器又是客户端)。
- Tracker服务器:记录每个peer的信息(IP、端口、已经下载的对应的段等信息),用于帮助每个peer发现彼此;
- Piece: 一个文件通常会被分割成很多片段,这样下载的时候可以同时向多个服务端请求数据,加快下载速度。
8 memcached 反射攻击
Memcached
Memcached是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。
Memcached通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性:
基于UDP协议的反射型DDOS攻击
分布式拒绝服务(DDoS:Distributed Denial of Service)攻击指借助于客户/服务器技术,将多个计算机联合起来作为攻击平台,对一个或多个目标发动拒绝服务攻击,从而成倍地提高拒绝服务攻击的威力。
而本次事件中基于UDP协议的DDOS反射攻击靠的是发送大量带有被害者IP地址的UDP数据包给放大器主机(Memcached),最后放大器主机对伪造的IP地址源做出大量回应,形成分布式拒绝服务攻击。这样就巧妙的利用了无需交互认证的服务(UDP)将DDOS攻击数据“放大”并“反射”到受害者主机IP上。而黑客往往会选择那些响应包远大于请求包的UDP服务,这样只需要极小的攻击流量就可以造成上百Gbps的攻击效果。
下图引用了CLOUDFLARE对UDP协议的DDOS反射攻击图例来说明攻击过程:
基于Memcached的反射型攻击技术分析
利用Memcache的反射型攻击最初由360信息安全部0kee Team在2017年6月发现,并于当年11月在 PoC 2017 会议上做了公开报告,详细报告可参见参考链接[6]。
要完成一次UDP反射放大攻击,需要满足以下几个基本条件:
-
作为攻击者,需要能伪造IP,并发送海量伪造来源的请求。
-
作为反射服务器,上面需要运行着容易放大反射攻击的服务,而运行了设计不当的UDP协议的服务是最佳的选择。
-
反射服务器的响应包最好远远大于请求包,这样才能使用较小的攻击流量进行高流量的DDOS攻击。
-
反射服务器对应的协议或服务在互联网上有一定的使用量,比如本次攻击中的Memcached。
而Memcached提供的基于UDP协议的服务正好满足上诉的UDP反射放大攻击的各种条件:
-
从协议看,Memcached支持UDP。
-
Memcached大部分是作为企业应用的组件,往往具有很高的上传带宽。
-
Memcached不需要认证就可以随意交互。
-
很多用户编译安装时,错误的监听了0.0.0.0,且未设置iptables或云安全组,这使得攻击者可以*访问这些服务,从而进行UDP反射攻击。
攻击流程
完成一次针对Memcached的UDP反射放大攻击,基本攻击流程如下:
-
扫描端口和服务,抓取协议指纹,获取未认证的Memcached。
-
过滤出可以反射的UDP Memcached,再获取可以成功放大的Memcached主机IP地址。
-
向可以放大UDP返回数据的Memcached主机IP发送伪造成被攻击主机IP的UDP包。
-
Memcached主机IP将放大了上万倍的UDP数据发送给被攻击主机IP,造成DDOS攻击。
放大倍数
测试了多个Memcached Server,反射放大系数是有上限的,放大倍数最高可以在6W倍左右,使用tcpdump分析请求响应的报文:
攻击机器A:
测试指令:
python -c "print 'gets a b c d e '" |nc -nvvu 94.**.251.*** 11211 |less
被攻击机器B:
测试指令:
tcpdump -ni eth0 port 11211 -t
可以看到,一个15字节的UDP请求触发了分片后总量达到近百个,单个1400字节长度的响应,重复数百次,DDOS攻击的放大倍数达到了近万倍。
利用条件
-
Memcached服务必须开了UDP 11211端口。
-
可被利用的Memcached存在Authentication Disable缺陷,即无需认证。
-
Memcached服务存在的节点有比较充足的带宽资源。
以上3个条件必须同时满足时,才可以打出放大倍数比较大的反射流量。
影响面
国内影响面统计,国内受影响Memcached服务器数量在20000+
全球影响面统计,全球受影响Memcached服务器数量在10万左右
可行缓解措施
非常时期,建议采取快速有效防御措施:
针对于国内存在风险的机器:
云厂商、运营商、IDC限流UDP 11211双向流量;若有强业务需求最好单独申请点对点白名单,然后启用放行机制。
针对于国外存在风险的机器:
在国际出口限制UDP源端口为11211的回包流量,封堵利用国外机器打国内的情况。
9 小结
这里我们引入一个学术名词,带宽放大因子(BAF, Bandwidth Amplification Factor),它表示的是请求报文与响应报文的比例。对于各种协议的反射放大攻击,由于其不同版本的实现机制各不相同,加上对请求数据支持的多样性,同一服务的 BAF 值也会存有一定的差异,我们通过实验对比了各种协议的实验 BAF,可以让大家直观感受各种反射攻击的威力,了解攻击放大的倍数。
反射 DDoS 攻击由于难以追踪、且不需要大量的肉鸡等特点,越来越流行,势必会对业务造成很大的威胁。除了需要各方通力合作对互联网上的设备和服务进行安全管理和安全配置消除反射站点之外,还需要在服务端做好防御准备,比如增加 ACL 过滤规则和 DDoS 清洗服务。目前大量的云厂商都提供 DDoS 流量的清洗服务,可以直接使用。