Memcached

Memcached是一个自由开源的,高性能,分布式内存对象缓存系统。

本质上,它是一个简洁的key-value存储系统。

一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性

DRDos

DRDos全称为"istributed Reflection Denial of Service",即"分布式反射拒绝服务",该方式特殊之处在于,它是通过发送大量带有被害者IP地址的数据包给主机,然后攻击主机对IP地址源做出大量回应,形成拒绝服务攻击。

攻击流程

DRDos完成一次攻击,需要至少三个角色:

  1. 攻击者
  2. 反射服务器
  3. 受害者

首先,需要发送攻击的数据载荷至反射服务器上,随后使用受害者的IP地址去请求反射服务器,然后受害者服务器便会接收到大量的恶意攻击数据包。

恶意数据量度

我看的PPT是360 Kee Team的,其中提出了两种数值以供参考:

  1. PPS (Packets per second)
  2. BPS (Bits per second)

其中有几个增加BPS的小tips:

  1. 使用udp服务
  2. 服务器发送的数据载荷尽量增大
  3. 发送伪装IP的服务器尽可能多

第二条tips在Memcached中,因为Memcached系统支持最大键值单数据对1M存储,所以发送1M即可。

使用Memcached完成DRDos

首先看看Memcached本身的运行顺序,Memcached作为一个缓存系统,在浏览器首次访问时,会将数据进行缓存,在下次进行相同的查询时,会通过缓存数据库进行查询,从而达到减少数据库访问次数,以提高Web应用的速度。

将DRDos的攻击流程带入到Memcached这个具体的环境中来,首先需要将恶意的数据载荷放入反射服务器上,因此为了达到这个目的,需要Memcached开启11211端口,当然,这一点就显得比较鸡肋了。

第一步,使用set命令上传有效载荷。

set命令格式如下:

1
2
set key flags exptime bytes [noreply] 
value

参数说明如下:

  1. key:键值 key-value 结构中的key,用于查找缓存值。
  2. flags:可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息 。
  3. exptime:在缓存中保存键值对的时间长度(以秒为单位,0 表示永远)
  4. bytes:在缓存中存储的字节数
  5. noreply(可选): 该参数告知服务器不需要返回数据
  6. value:存储的值(始终位于第二行)(可直接理解为key-value结构中的value)

第二步,反射有效载荷

使用Memcached的get命令去查询上一次存储的数据,因为在DRDos中数据量极大,因此使用不需要三次握手的UDP进行反射。也因为不需要三次握手,因此IP源地址的验证也就无法完成。

其实这里也是依赖于Memcached本身就支持TCP与UDP两种方式,因为UDP的特点,如果用来发送数据,产生丢失实在很正常,因此在上传载荷时使用TCP,而在进行反射时使用UDP.

贴一个PPT中的示范:

1
python -c "print '\0\x01\0\0\0\x01\0\0gets a b c d e f g h j k l m n o p q r s t w v u x y a\r\n'" |nc -nvvu 10.105.16.119 11211 >/ tmp/null

总结

看到一位师傅的博客里面写到发送20字节的数据,返回了1M的数据,放大倍数达到了5w倍,一开始没想通是怎么测出的1M,后面想了下,正因为DRDos是反射拒绝服务攻击,因此循环请求反射服务器,而数据载荷是20字节的,但是在循环过程中,打出去的数据是1M。

当然,这个攻击方式也有几个缺陷:

  1. 需要开放11211端口
  2. 如果11211端口的UDP流量被封掉,那拒绝服务攻击也很难以继续完成
  3. 可持续利用性极低,基本被打过一次的厂商都会作出防御措施,也就是一把梭的事
  4. 如果反射服务器所处的网络环境部署了对于源地址攻击行为防范机制,那么反射攻击同样也无法完成

收获也挺大的,第一次知道Memcahced还能这么玩。