Redis-RCE复现

  1. 前言
  2. 造成漏洞的原因
  3. 复现
  4. 分析
  5. 利用点
  6. 防御

前言

最近有点沉迷于B站….草了狗。还是学习吧

造成漏洞的原因

通过主从复制 GetShell
在介绍这种利用方式之前,首先我们需要介绍一下什么是主从复制和redis的模块。
Redis主从复制
Redis是一个使用ANSI C编写的开源、支持网络、基于内存、可选持久性的键值对存储数据库。但如果当把数据存储在单个Redis的实例中,当读写体量比较大的时候,服务端就很难承受。为了应对这种情况,Redis就提供了主从模式,主从模式就是指使用一个redis实例作为主机,其他实例都作为备份机,其中主机和从机数据相同,而从机只负责读,主机只负责写,通过读写分离可以大幅度减轻流量的压力,算是一种通过牺牲空间来换取效率的缓解方式。

复现

apt install redis-server

修改/etc/redis/redis.conf

bind 127.0.0.1 -> bind 0.0.0.0
protected-mode -yes -> protected-mode no

exp地址:

https://github.com/Ridter/redis-rce - 利用工具
https://github.com/n0b0dyCN/redis-rogue-server/blob/master/exp.so - exp.so

分析

那么实现shell的过程中实现了什么?先从py下手

1.读取exp.so
2.调用runserver函数处理  runserver(options.rhost, options.rport, options.lhost, options.lport) #目标IP、目标端口、attack IP、attack监听的端口(默认监听21000端口)
3.调用Remote.do() #发送Redis密码验证,并返回结果,如果返回invalid password代表密码错误
4.密码正确,redis登录成功后,发送info指令查看redis数据库详细信息
5.发送SLAVEOF指令,指令格式 SLAVEOF host port。作用通过执行 SLAVEOF host port 命令,可以将当前服务器转变为指定服务器的从属服务器(slave server),这里的host和port则指向attack的IP和端口
6.发送CONFIG SET dbfilename <name> 设置文件名称(根据exp.so的文件名来设置的文件名,比如exp.so。设置的dbfilename就是exp)
7.监听本机21000端口,等待redis回传的数据。根据返回的结果将exp转换成bytes,发送exp
8.MODULE LOAD指令加载exp.so
9.取消从属服务器
10.根据选择是进入shell或者执行其他指令
12.若是执行shell指令,则调用exp.so里面的system.exec函数后面跟上命令。system.exec <command>

总的来说是,设置从属服务器后。在设置dbfilename,之后发送shellcode。应该是被Redis-Server保存了。然后加载扩展,调用system.exec函数执行命令。

利用点

1.低权的时候,redis以root权限运行。通过RCE获得root权限
2.未授权直接利用

防御

1.设置本机才能访问
2.设置复杂性密码
3.Redis-server不以root权限运行


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。

文章标题:Redis-RCE复现

本文作者:九世

发布时间:2020-01-21, 16:24:51

最后更新:2020-01-21, 17:43:03

原始链接:http://422926799.github.io/posts/ac34060e.html

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录