0
雷锋网编者按:近日,国内外多家安全公司和机构接连发布了针对 Memcached 超级DRDoS(Distributed Reflection Denial of Service)攻击的预警,引发各方关注。雷锋网此前也曾就其对 GitHub 发起的攻击进行过报道,当时攻击的最大峰值流量达到了惊人的 1.35T。
要知道,在2月27号之前,Memcached的反射攻击事件流量范围不过几百兆到500G。只有短短几天,攻击峰值的历史纪录就迅速被翻倍刷新,并且攻击发生的频率从一天十几次到几百次,呈现爆发式增长。
目前,Memcached分布情况如何?黑客是如何发起攻击的?应该如何检查和预防?
以下为绿盟科技&电信云堤联合投稿,雷锋网编辑。
据监控数据显示,从本周一至周五(2月26日至3月2日 06:00)短短5天内,全球就发生了 79 起利用 Memcached 协议的反射放大攻击。日攻击总流量最高达到 419TBytes。
▲Memcached反射放大攻击日攻击次数
▲Memcached反射放大攻击日攻击总流量
其中,针对我国境内的 Memcached 反射放大攻击就有68次,江苏、浙江两省被攻击频繁。针对我国境内的攻击,单次攻击最高攻击峰值达 505Gbps。攻击持续时间最长的一次发生在3月1日,持续1.2小时,总攻击流量达103.8TBytes。
▲中国各省份地区Memcached反射放大攻击次数
从影响范围来看,所有互联网的业务都可能成为Memcached DRDoS的攻击对象。一方面带宽或业务遭受超大流量的攻击,导致出口带宽完全被占满,正常业务无法访问;另一方面企业内部的Memcached系统可能被不法分子利用成为攻击帮凶。
2.1 什么是Memcached?
Memcached是一个高性能的开源分布式内存对象缓存系统,主要用于提高Web应用的扩展性,能够有效解决大数据缓存的很多问题,在全球范围内都有广泛使用。Memcached基于内存的key-value存储小块数据,并使用该数据完成数据库调用、API调用或页面渲染等。攻击者正是利用 key-value 这项功能构造了大流量的Memcached反射攻击。
2.2 Memcached分布情况
最新统计显示,全球总共有3790个Memcached服务器被利用参与到这些Memcached反射放大攻击。这些被利用反射源遍布于全球96个国家或地区范围内。其中,美国就占了全球的1/4。
分布在中国地区的被利用的Memcached服务器位列第二位,占比12.7%。在中国各省份占比如下所示,广东、北京、浙江为TOP3。
据绿盟科技威胁情报中心(NSFOCUS Network Threat Intelligence,简称NTI)的统计结果显示,全球范围内存在被利用风险的Memcached服务器为104,506台。分布情况如下:
从地理分布来看,美国可被利用的Memcached服务器最多,其次是中国。
这些活跃的Memcached反射器为构造超级DRDoS攻击提供了有力的先决条件。如果不及时修复治理,预计基于Memcached反射攻击的攻击事件会继续增加,后果不敢想象。
2.3 Memcached如何形成DRDoS攻击?
Memcached反射攻击的构造过程分为如下3步;
1. 收集反射器IP
通过NTI/Shodan等情报引擎找到开放的Memcached系统,获取系统IP;
2. 配置反射器
利用开放的Memcached系统作为反射器,并修改key-value配置实现较大的存储容量,为构造反射放大攻击进行准备;
3. 发起反射攻击
攻击者将自身IP伪造成攻击的目标地址,并向Memcached反射器发送请求读取Memcached在key-value中存储的信息。Memcached在收到请求后向伪造的虚假源IP进行回复,从而形成反射。
▲Memcached反射攻击示意图
当大量Memcached被同时利用,并用同一个伪造源IP进行回复,就轻而易举地形成了针对这个伪造源(受害者)的大流量DRDoS攻击。
2.4 Memcached的攻击特征
DRDoS(Distributed Reflective Denial-of-Service)是DDoS攻击分类中的一种。
此前各类安全厂商监测到的DRDoS攻击主要是SSDP反射、DNS反射、NTP反射等。下表(引自US-Cert)详细列举了各类反射攻击的放大倍数。
仅从放大倍数来看,Memcached反射攻击的危害程度远远高于其他反射攻击类型,US-Cert提供的数据显示它能够实现51,000倍的放大效果。
与其他反射攻击相比,Memcached如何实现这么多倍的放大效果呢?其中的重要原因就是Memcached的key-value功能。前文提到key-value的作用是决定存储容量的大小,正常情况下key-value的值通常不超过几千字节。当Memcached被攻击者利用作为反射器时,key-value的值经过修改可以达到100万字节以上。
攻击过程:
第一步,通过命令修改Memcached上的key-value参数,以提升放大倍数。
send = "set t 0 900 1048501" + "\r\n" + ‘a’ * 1048501 + "\r\n"
socket.sendall(send)
经验证,key-value的最大值为1048501。
第二步通过get命令读取Memcached的存储信息,并反射到目标IP。
get="\x00\x00\x00\x00\x00\x01\x00\x00get t\r\n"
socket.sendto(get, (host, 11211))
形成的攻击报文如下:
触发Memcached反射攻击的请求报文最小为15字节,包含为8字节(RFC规定字段)+3字节 (get)+1(空格)+最小为1字节(键的名称 )+2字节 (\r\n),而返回的请求数据达到105万字节,理论上可放大到接近7万倍。如此强悍的放大攻击,与其他各类DRDoS攻击形成断崖式的差距对比。
3.1 Memcached系统自查建议
攻击的形成过程为我们提供了一个很好的预警思路,安全产品可针对Memcached的key-value配置进行检测,在Memcached系统被利用成为攻击源之前就进行拦截。检测流程如下:
(1)检测目的端口为11211的TCP或UDP报文(确保是Memcached服务器);
(2)检测报文是否为set命令(set命令格式参见附录),如果是则执行(3),否则结束检测;
(3)检测set命令后面的bytes字段值(如下图中标注的1048501),是否超过设定的阈值,如果是,则可以怀疑该报文存在异常;
(4)检测到该类异常控制报文后,可有如下两种处理方式:
a.告警并监控。为了防止被误杀,建议同时监控该Memcached服务器后面的流量变化来进一步判断该服务器是否被用做了反射器。
b. 直接丢弃。如果有足够的证据表明该记录是恶意添加的,直接丢弃可以保证服务器不被当做反射器。
自查举例:假设下图是公网的一台Memcached服务器上获取的数据。
通常情况下,多数value的大小都在64K以内,而最后一条的达到了将近1M,与其他记录有很明显的差别,基本上可以判断该记录存在问题,该服务器可能已经被利用。
3.2 Memcached攻击流量清洗
面对如此大规模、大范围的DDoS攻击威胁,所有网络安全节点都应该加强防范,从攻击防护和外发清洗两方面入手,充分保障基础设施和业务流量的安全。针对此攻击,我们提供如下防护建议:
·运营商。
运营商及IDC处于网络上游,拥有强大的带宽资源,是攻击最直接的受害者,也是防护的第一道屏障。运营商能够灵活控制路由策略和防护策略进行快速过滤。
1)在边界配置UDP访问控制规则,将源端口为11211的报文进行阻断或限速;
2)在边界配置BGP FlowSpec策略,对源端口为11211的UDP流量进行阻断或限速;
3)利用DDoS防护设备将源端口为11211的UDP流量进行阻断或限速。
·企业用户
企业用户通常贴近服务终端,熟悉掌握自身业务流量特点,策略配置更加明确,灵活性强。
1)大型企业客户可以采用和运营商相同的策略,在出口边界设备配置UDP访问控制规则或BGP FlowSpec策略对源端口为11211的UDP流量进行阻断或限速;
2)不具备出口路由配置权限的企业客户,可以在抗DDoS等设备上配置防护策略,对源端口为11211的UDP流量进行阻断或限速;
3)考虑企业出口带宽可能被打满的情况,企业客户可通过运营商或云清洗服务在上游执行清洗策略,策略内容同样是对源端口为11211的UDP流量进行阻断或限速。
3.3 Memcached系统防护加固
对于正在使用Memcached系统的用户,为了避免被攻击者利用,使Memcached成为攻击源,对外发起攻击流量,影响自身系统性能,我们提供如下几点建议。
1)在边界网络设备上配置URPF策略,过滤外发的虚假源IP报文;
2)在Memcached系统前进行深度检测,直接过滤报文特征中set key 0 900 64000的第三个字段过大的数据包,这样做可以在Memcached系统被修改利用成为攻击源前进行拦截;
3)对Memcached服务进行安全检查,查看Memcached服务是否监听UDP端口。查找Memcached进程,查看是否有-l参数,如果没有则默认为0.0.0.0。若Memcached服务不需要监听UDP,禁用UDP。详情参考Memcached官方文档:
https://github.com/memcached/memcached/wiki/ConfiguringServer#udp
set 命令的基本语法格式如下:
set key flags exptime bytes [noreply]
value
参数说明如下:
key:键值 key-value 结构中的 key,用于查找缓存值。
flags:包括键值对的整型参数,客户机使用它存储关于键值对的额外信息 。
exptime:在缓存中保存键值对的时间长度(以秒为单位,0 表示永远)
bytes:在缓存中存储的字节数
noreply(可选): 该参数告知服务器不需要返回数据
value:存储的值(始终位于第二行)(可直接理解为key-value结构中的value)
相关文章:GitHub 遭遇有史以来最严重DDoS攻击,黑客想玩票大的?
此文为绿盟科技&电信云堤联合投稿,雷锋网编辑。
雷峰网特约稿件,未经授权禁止转载。详情见转载须知。