一背景介绍
1.Memcached 简介
Memcached是一款开源、高性能、分布式内存对象缓存系统,可应用各种需要缓存的场景,其主要目的是通过降低对Database的访问来加速web应用程序。它是一个基于内存的“键值对”存储,用于存储数据库调用、API调用或页面引用结果的直接数据,如字符串、对象等。
许多Web应用都将数据保存到RDBMS(关系型数据库管理系统)中,应用服务器从中读取数据并在浏览器中显示。 但随着数据量的增大、访问的集中,就会出现RDBMS的负担加重、数据库响应恶化、 网站显示延迟等重大影响。这时就该Memcached大显身手了。Memcached是高性能的分布式内存缓存服务器。 一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、 提高可扩展性。
2 DRDOS 简介
DRDOS(Distributed Reflection Denial of Service)
分布式反射拒绝服务攻击
对于分布式还有拒绝服务都很好理解,反射的意思简单来说就是借别人的手来攻击。
Memcache满足被借用的条件就可以借用Memcache的手来攻击其他主机。
二 原理介绍
2.1 实现攻击的条件
1 海量未认证的memcache主机
2 未使用URPF机制
通常情况下,路由器收到数据报文后,获取到数据包中的目的IP地址,针对目的IP地址查找本地路由转发表,如果有对应转发表项则转发数据报文;否则,将报文丢弃。由此看来,路由器转发报文时,并不关心数据包的源地址。这就给源地址欺骗攻击有了可乘之机。
源地址欺骗攻击为入侵者构造出一系列带有伪造源地址的报文,频繁访问目的地址所在设备或者主机;即使响应报文不能到达攻击者,也会对被攻击对象造成一定程度的破坏。
URPF(Unicast Reverse Path Forwarding,单播逆向路径转发)的主要功能是用于防止基于源地址欺骗的网络攻击行为。路由器接口一旦使能URPF功能,当该接口收到数据报文时,首先会对数据报文的源地址进行合法性检查,对于源地址合法性检查通过的报文,才会进一步查找去往目的地址的转发表项,进入报文转发流程;否则,将丢弃报文
2.2 攻击原理
因为Memcache 同时支持tcp和udp协议,这符合反射DRDOS的最佳情况,
关于tcp与udp协议的区别有很多,这里面主要介绍跟攻击有关的区别
1 TCP保证数据正确性,UDP可能丢包
2 UDP的协议, 没有握手过程, 攻击者可以轻易的伪造来源IP并发起请求
3. TCP 每次发包大小不受限制,udp每次最大发送64k,memcache最大存1m,所以直接用tcp存1m数据
基于上面两个协议的特点,我们对大量的受控Memcache主机发包
1 我们选择用tcp发包set指令,因为tcp可靠不丢包,同时每次发包不受大小限制,memcache最大存1m,所以直接存1m数据
2 用udp发包修改源ip(受害者ip)发送get指令,
如果源地址被伪造,基于 TCP 协议的通信将会被阻断。原因就是 TCP 通信时的三次握手。当服务器无法与客户端之间进行三次握手操作时,通信将不能继续进行下去。
基于 UDP 协议的网络通信中。即使伪造了源 IP 地址,接收端仍然可以接收到伪造之后的数据包。
3 Memcache接收到伪造后的数据请求后把大量数据响应给伪造后的受害者的主机造成拒绝服务
2.3 命令介绍
利用Memcached作为反射服务器需要用到memcached几个命令,set命令用来设置键值,get命令获取键值,为什么需要set命令?因为攻击者不知道key是什么,攻击者设置完成后,攻击者用get请求获取这个数据
Memcached set 命令用于将 value(数据值) 存储在指定的 key(键) 中。
如果set的key已经存在,该命令可以更新该key所对应的原来的数据,也就是实现更新的作用。
key → abc
flag → 0
exptime → 0 (以秒为单位,过期时间,0表示不永不过期)
bytes → 10 (数据存储的字节数)
value → abc(第二行)
Get命令获取key(键) 中的value(数据值)
Delete 删除
2.4 攻击方法
首先发送set命令,set命令用来提前设置好键值,以便用get命令反射时候自己知道键的名称,而用set命令设置键值时候并不需要伪造源ip,所以用tcp协议更好,数据可靠不丢包。
用get命令时候需要伪造源ip,伪造的ip为我们想攻击的目标,这时候需要用udp发包
这里简单写个一次攻击的poc,之后只要加循环多线程就可以实现多次攻击。
这里先用tcp发包测试一下,发送set指令设置键值,然后发送get指令看看能否获取到
伪造源ip,这里使用scapy,src本应该是我们自己的ip,但是这里我改成了我想攻击目标的ip,因为使用udp协议发包,在没有使用URPF机制的情况下,memcache响应的数据包会返回给我们攻击的目标完成了攻击。
2.5 攻击情况
首先是set,键值对,值里面通过tcp存1m数据,然后再用udp发送get请求,get请求只有20字节,但是响应的确是1m数据
因为发送的get命令指令数据很小,但是返回的数据是发送的5万倍,所以当在网络中找到
这种符合情况的memcache大量主机后就可以实现DRDOS攻击了。
三 防御策略
1. 设置访问控制规则和防火墙 例如,在Linux环境中运行命令iptables -A INPUT -p tcp -s 192.168.0.2 —dport 11211 -j ACCEPT,在iptables中添加此规则只允许192.168.0.2这个IP对11211端口进行访问。windows下在memcached服务器上配置防火墙策略,仅允许授权的业务IP地址访问memcached服务器,拦截非法的非法访问。
2. 绑定监听IP,如果Memcached没有在公网开放的必要,可在Memcached启动时指定绑定的IP地址为 127.0.0.1。例如,在Linux环境中运行以下命令:memcached -d -m 1024 -u memcached -l 127.0.0.1 -p 11211 -c 1024 -P /tmp/memcached.pid
3. 使用最小化权限账号运行Memcached服务,使用普通权限账号运行,指定Memcached用户。例如,在Linux环境中运行以下命令来运行Memcached:memcached -d -m 1024 -u memcached -l 127.0.0.1 -p 11211 -c 1024 -P /tmp/memcached.pid
4. 启用认证功能Memcached本身没有做验证访问模块,Memcached从1.4.3版本开始,能支持SASL认证。配置启用SASL认证等权限控制策略(在编译安装memcached程序时添加-enable-sasl选项,并且在启动memcached服务程序时添加-S参数,启用SASL认证机制以提升memcached的安全性)。
5. 修改默认11211监听端口为其他端口。在Linux环境中运行以下命令: memcached -d -m 1024 -u memcached -l 127.0.0.1 -p 11222 -c 1024 -P /tmp/memcached.pid
6. 升级到最新的memcached软件版本,Memcached 1.5.6 已发布,这是一个 bug 修复版本,该版本已默认禁用 UDP 协议。