memchache反射型ddos分析与复现

2018-09-10 3,946

前言

先简单说明一下反射型ddos,假设有很多服务器开着一个服务,服务内容与类型不管,如果用户每次发给服务器少量内容,服务器就会返回远大于请求的回复,则这个服务就达到了反射性ddos的要求。

因为tcp协议中发送方ip是可以伪造的,如果我们将源ip设置成希望进行攻击的目标ip,如8.8.8.8,再将伪造后的数据包发给服务方,服务方按照正常处理则会回复给8.8.8.8,从而达到ddos攻击的效果。


相比传统ddos攻击来说,反射ddos有两个显著优势:

1、不需要控制任何肉鸡,任何达到要求的服务器都能成为帮凶,更容易达到分布式的效果。

2、通过反射后数据量得到放大效果,成倍增加攻击流量。

近日,本文主角memcache则是帮助黑客们打出了阿里云世上最大的流量:758.6G每秒 [相关链接](https://mp.weixin.qq.com/s/ghPd_I6ynCh8W_orMxSdNg),下文我将简单介绍其攻击原理和方式


环境搭建

memcache环境搭建很简单,这里简单说一下:

docker

docker永远是搭环境最推荐的方式之一,dockerfile 如下:

b.png



保存为Dockerfile,然后执行

docker run --name my-memcache -p 11211:11211 -d memcached

就运行了一个memcache,容器11211端口映射到本机11211

测试memcache:

telnet 127.0.0.1 11211

可看到以下字样:

c.png

vm虚拟机

作者的mac在运行docker时遇到了一些bug,本机无法直接访问到容器,为了能顺利抓包只好在vm虚拟机里搭建了memcache

首先在http://memcached.org 下载相应版本文件,执行:

d.png


可能出现libevent不兼容问题,下载libevent-2.0.21后运行

安装完成后执行

 memcached -d -m 64M -u root -l 172.16.250.164 -p 11211 -c 256 -P /tmp/memcached.pid

-l参数为虚拟机ip,运行后即可在虚拟机的11211端口开启memcache。


攻击原理

memcache 的几个基础命令如下:

set命令用于将 value(数据值) 存储在指定的 key(键) 中:

    set key flags exptime bytes [noreply]

key:键值 key-value 结构中的 key,用于查找缓存值。

flags:可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息 。

exptime:在缓存中保存键值对的时间长度(以秒为单位,0 表示永远)

bytes:在缓存中存储的字节数

noreply(可选): 该参数告知服务器不需要返回数据

value:存储的值(始终位于第二行)(可直接理解为key-value结构中的value)

get命令则取出相应key值,组合使用效果如下:


image.png


可以设想,如果memecahe存储了一个值很长的key,当我们get的时候,memcache就会返回很长的数据包,这就达到了我们所需要的反射效果,虽然以上例子为tcp协议,memcache实际上也支持udp协议,而udp的无连接更适合用于做反射放大攻击。


攻击过程

攻击需要两个过程

1、存储到memcache。

2、获取相应值达到攻击效果

首先是存储攻击荷载的脚本,[参考自](http://blog.csdn.net/microzone/article/details/79262549?from=groupmessage&isappinstalled=0):

server.txt里存放memcache列表,我只存放了虚拟机172.16.250.164

memddos_pre.py,存放攻击荷载至memcache:

6a.png

7a.png

memddos.py 获取攻击荷载并伪造ip至目标ip:

29.png70.png60.png


伪造ip的过程中需要安装scapy库,在有些情况下安装可能不是很方便,linux下可使用[此方法](http://blog.csdn.net/alexzhang67/article/details/52084874)在python2.7下安装scapy

攻击过程中用wireshark检测流量包,首先运行:

memddos_pre.py server.txt 1 10000 10

向server.txt里的反射方列表存储10000字节大小的内容,超时时间10s,这里只设置了10000是方便后续抓包工作。

执行结果如下:

d6.png

wireshark抓包如下:

 ![1.png](1.png)

成功存储攻击荷载至memcache

第二步发动攻势,执行:

    sudo python memddos.py server.txt 1 1

这里必须sudo才有足够权限伪造ip,为了保证抓到的包不会太杂乱,线程和攻击次数都只设置了1次,执行结果如下:

f6a.png

返回wirdshark查看:

   ![2.png](2.png)

可看见172.16.250.164也就是memcache向攻击目标8.8.8.8发送了大量垃圾信息,攻击完全达到了效果。

在实战运用中,这种放大理想状态可达到5w倍,当然,实际情况要取决于发射方环境,不过通过上述实验可看出其恐怖的攻击性,不仅可以消耗memcache巨量资源,造成的的流量也是非常巨大。


解决方法

1、memcache的服务就不应该对所有人开放,至少在外网不应该监听0.0.0.0。

2、升级memcache并使用SASL设置密码来进行权限控制。

3、运营商uRPF的覆盖可有效解决ip伪造问题。


参考文章

http://blog.csdn.net/microzone/article/details/79262549?from=groupmessage&isappinstalled=0)




本文作者:小米SRC

本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/75322.html

Tags:
评论  (0)
快来写下你的想法吧!

小米SRC

文章数:38 积分: 56

安全问答社区

安全问答社区

脉搏官方公众号

脉搏公众号