memcached 反射放大的实现

  • A+
所属分类:应用运维

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 数据, 于是拿来改了下.

memcached 的 pkt 探针

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

历史上的今天:

weinxin
我的微信公众号
我的微信公众号扫一扫

发表评论

:?::razz::sad::evil::!::smile::oops::grin::eek::shock::???::cool::lol::mad::twisted::roll::wink::idea::arrow::neutral::cry::mrgreen:

本页共执行40次查询操作耗时0.552秒 使用内存1.11MB

×
订阅图标按钮
//360收录