Article Learn

memchache反射型ddos分析与复现

Post by mapl0 at 2018-08-17 11:59:48


 前言 

    先简单说明一下反射型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 如下:


保存为Dockerfile,然后执行


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


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


测试memcache:


telnet 127.0.0.1 11211


可看到以下字样:



vm虚拟机



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

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




可能出现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值,组合使用效果如下:



可以设想,如果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:




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



伪造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是方便后续抓包工作。

执行结果如下:


wireshark抓包如下:


        ![1.png](1.png)


成功存储攻击荷载至memcache


第二步发动攻势,执行:


    sudo python memddos.py server.txt 1 1


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



返回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)


—   联系我们   —

新浪微博

公众号