MENU

memcached反射放大的实现

当听到新反射方法出现时我是很兴奋的,尤其是知道了放大倍数可以上万倍,使得的更是兴奋,我从3.2日知道了memcached方法,从小伙伴那里得到了一个无法编译的源码之后便陷于寻找可用的memcached反射放大脚本,最后自己慢慢摸索参考其它反射源码自己制作了放大脚本和过滤脚本,这应该是我首个自己实现的反射放大脚本,通过它我也重新认识了一下反射放大的实现.

发包脚本的实现

在这之前除了自己实现过一个ovh的bypass从来没有自己做过其它任何脚本,这次同样也想直接拿到脚本,但是无奈几天过去只得到了一个gayhub上的nodejs实现和小伙伴给的无法编译的cpp源码(这份源码应该是c的,我不会c和c++可能是我看不出来它们的区别,但是可以确定里面很多地方和ntp反射源码一样),前天寻找脚本无果的时候便想自己实现,然后再去google搜了一下,看到一个博主写了一个博文,其中echo -en "\x00\x00\x00\x00\x00\x01\x00\x00stats\r\n" | nc -q1 -u 127.0.0.1 11211使我灵光一闪,这就是payload啊,然后便想着可以用其他反射脚本改一个出来,于是便去看ntp反射源码,然后将ntp的payload替换成memcached的,字节由8字节改为15字节,编译没有任何错误,于是一个发包脚本就完成了

扫描和过滤的实现

有了发包脚本,扫描仍然是个问题,前几天看了下zmap官方仓库并没有memcached的探针,然后便搜了一下pkt探针的制作,发现pkt就是raw数据,于是便制作了memcached的pkt开始扫描全球ipv4,在这期间fork一份zmap源码添加了memcached的pkt准备向官方提交合并时发现,有人早了一天制作探针提交了合并,于是我便放弃了.
过了6个小时,zmap扫完了全球的ipv4,得到了一份1M左右的列表,于是便拿这份列表尝试了反射,第一次实践发现虽然确实有效果,但是没有任何威力,需要过滤,于是便开始想办法过滤.
在很久之前拿到了一个ntpchecker的过滤脚本,这份脚本我这里没有源码,我看不懂c只能简单的改下payload和其字节和端口,于是我开始寻找别人帮忙,然而找了一圈没有人会c或者说没有人愿意帮助我,暂时陷入僵局.
第二天早上检查我硬盘里所有的脚本,发现我有保存的ssdp过滤脚本,这是个php脚本,我之前用过一次,过滤了1天,威力和chargen差不多,于是我基本就没用过几次ssdp,于是便忘记了我还有一个ssdp过滤脚本.
现在过滤解决了,于是便开始了过滤,过滤用了半个小时左右,过滤后迫不及待的进行第二次测试.

威力极小

第二次我选择了aliyun的机器作为测试目标,开始后发现,ping就跳高一下就变回了正常的ping值,于是我又用一个香港的没有防御机器做测试,香港的机器确实被打死,然后我用ntp测试了aliyun的机器,这时aliyun的机器ping超时,这证明了发包机是没有问题的.
看新闻报道memcached放大倍数最低也有2k倍,这是我就陷入沉思当中,稍后重新过滤了列表再尝试了一次,仍然是同样情况.
之前的列表发到了loc,当我发现威力小的时候问了下帖子里一位dalao是怎么过滤的,为什么我过滤之后威力这么小,接着我去找了几个报道,看了下其中几个报道里抓到的数据包,然后loc的dalao回复了我,这时我恍然大悟,自己尝试构造了一个payload,然后再去拿aliyun机器尝试,当我输入指令之后刚敲回车aliyun的机器便ping超时了,同时发现dstat显示的上传速度已经超过了机器本身的带宽,然后我与发包机断开连接了(有一次榨干了机器所有带宽).

最后测试

修改后的代码我只给了2位比较熟而且信任的小伙伴,脚本给了一位loc的dalao,dalao用流量墙测试了反射倍数,粗略计算了一下大概是2000~4000倍之间,然而这仍然没有达到报道中说明的倍数,然后我又继续找了几个报道,其中一个报道里说明了实现步骤,发现和我实现方法的方法不一样,这应该也是我倍数为何这么小的原因,这一部分我还没有开始实现,暂时不说方法.

一个用php实现memcached的udp请求示例

过滤用的请求示例,一个大早我就在找如何发送raw数据,当时想的是把探针文件发出去,最后看别人的参考代码时发现可以发送hex数据,于是拿来改了下.

<?php
function discover($host, $timeout = 1) {
    $data = "\x00\x00\x00\x00\x00\x01\x00\x00stats\r\n";
    $socket  = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
    socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array('sec' => $timeout, 'usec' => 0));
    socket_connect($socket, $host, 11211);
    socket_send($socket, $data, strLen($data), 0);
    $buf = "";
    $from = "";
    $port = 0;
    @socket_recvfrom($socket, $buf, 1000, 0, $from, $port);
    socket_close($socket);
    return $buf;
    }

memcached的pkt探针

github上的那个合并请求应该很快会通过并合并,但是我发现他的pkt并不是最简化的探针,这个是我自己构造的那个,具体用哪个好我也不知道.
下载链接:https://github.com/shirakun/zmap/blob/master/examples/udp-probes/memcached_11211.pkt

最后编辑于: 2018 年 03 月 11 日