公司新闻

面试经典 Redis未授权漏洞与组合拳

作者:admin 日期:2023-09-06 浏览:

面试经典 Redis未授权漏洞与组合拳

  Redis 全称 Remote Dictionary Server(即远程字典服务),它是一个基于内存(当然也可以把其存储至硬盘上,这也是写shell的必要条件之一)实现的键值型非关系(NoSQL)数据库。Redis 免费开源,其最新稳定版本是 6.2.x(2022/11/10),版本更新参见常用版本包括。自 Redis 诞生以来,它以其超高的性能、完美的文档和简洁易懂的源码广受好评,国内外很多大型互联网公司都在使用 Redis,比如腾讯、阿里、Twitter、Github 等等。

  一般的,redis.conf文件路径

  Redis默认配置过程中无需设置密码,可能造成空口令风险。这种情况下只要连接的Redis服务器的host和port正确,且攻击机安装redis客户端就可以成功连接,存在类似风险的数据库服务器还有。Redis安装默认情况下,会绑定在,如果没有限制来源IP并且没有设置密码(所以这也是两种修复手段),就会导致攻击者非法访问,读取Redis的数据,利用自身config命令进行写入操作。Redis 是常见内网服务。其他的常见内网服务还有如 Structs2 和 Elastic。

  未授权 Redis 拿 shell 的 3 种方式

  nmap扫描端口发现redis服务无密码未授权实现直接访问,然后可以执行redis命令操作

  查看reids服务端信息利用条件

  Redis 未授权访问漏洞

  服务器对外开启了 ssh 服务

  Redis 服务器运行在 root 用户下(否则还要猜测用户用以修改authorized_keys的保存目录)

  所以在实际渗透过程中,该服务器「端口扫描」结果至少要满足:

  Redis 服务 open(默认 6379 端口)

  ssh 服务 open(默认 22 端口)[没开 ssh 都是扯淡]具体步骤

  1. 生成一个 ssh-key:

  2. 防止其他数据干扰给公钥加点换行:

  3. 把公钥写入到一个 key 里面,这个例子中是写入了 may 这个 key。

  4. 设置 rdb 文件存放的路径:

  5. 设置 rdb 文件的文件名

  6. 搞定保存。

  7. ssh尝试登陆:

  这样我们就获得了一台服务器的 shell。可以到此服务器上查看,发现目录下已经有了 authorized_keys:

  cat /root/.ssh/authorized_keys

  一些心得现状:

  首先此方式肯定是无法适用于 Windows 主机的。(判断是 Windows 机器还是 Linux 机器可以通过下图所示的命令根据路径判断,下图为Linux下)另外随着运维人员对此漏洞认识的深入,现在越来越少运维会直接以 root 起 Redis 的。这样就无法直接往目录下写公钥。当然写入的目录不限于下的,也可以写入用户目录。那么要多一个猜用户的步骤。相较之下,直接写 webshell 和写计划任务这两种方式用的更多。

  关于什么时候要flushall

  一般写authorized-key时注意多写两个换行就行,这里我找了很多垃圾数据放在authorized-key文件里,依然能正常免密登录,主要是在写webshell时需要注意。redis在生产环境里面数据量经常是十分庞大的,save到php文件里会超过php的允许文件大小,导致无法解析,而且save也不支持仅写入某个数据库,而是只能保存整个redis的实例,所以select到某个空数据库来写入shell也是无法试验的

  解决办法

  直接flushall全删掉即可。或者先备份再删,之后再进行恢复。实战就算碰见了也慎用,师傅们保命重要利用条件:

  知道网站根目录绝对路径(所以实际渗透过程中,这个方法通常需要搭配 phpinfo() 等信息使用。)

  无需是 root 起的 Redis

  可适用于 Windows(非 ssh 连接)

  一般无需 flushall 清空数据库(一定情况下也需要)

  理解了落地ssh公钥原理,利用redis写webshell就十分简单,主要还是四个步骤具体步骤:

  1. 设置保存路径

  2. 修改保存文件名

  3. 将键值写入文件

  4. 保存

  虽然写入的是二进制文件,但是网页端访问依然能够解析可能遇见的错误

  下面是一种典型的报错,说明运行redis的用户对网站根目录没用写入权限,这里redis服务属于redis用户利用条件:

  通过写 crontab 的方式 getshell 是一种很绿色的方式:

  无需 flushall 清空数据

  注意,这里并不是因为写计划任务本身无需 flushall,而是因为这样的语法可以控制第一条记录,就能保证你的内容始终保持在最前面。就是一个标准用法,因为百分号比的优先级更高。

  需要是 root 起的 Redis。

  归根到底还是要 root 运行 redis,毕竟要写到/var/spool/cron/crontabs/root下,主要优势是适用一些 ssh 不能被直接访问的场景。

  不适用于 Windows 服务器

  Windows 场景下没有计划任务,可以尝试一下写入启动项。理论上可以尝试写文件到用户启动项,但是现实是 Windows 普通用户没有计划任务权限。Windows 下 Redis 拿 shell,后面会单独成文讨论。具体步骤

  1. 计划任务默认存储路径,设置写 crontabs 的文件夹路径

  2. 修改保存文件名

  3. 对写入「反弹 shell」的计划任务

  4. 保存

  5. 监听公网机器指定端口,接收反弹回来的 shell

  未授权或弱密码造成的可登入是必要条件,可公网访问是充分条件。如果公网不能访问,还可以通过 socks 隧道、SSRF 等方式内网漫游。

  前面说过,redis是基于内存的,当场景需要大量访问Redis中的数据,服务端难免会难以承受。Redis就提供了主从模式,主从模式就是指使用一个redis实例作为主机,其他实例都作为备份机,其中主机和从机数据相同,而从机只负责读,主机只负责写,通过读写分离可以大幅度减轻流量的压力,算是一种通过牺牲空间来换取效率的缓解方式。问题就出现在了数据同步这一步,主机如果有恶意数据的话从机也会不分黑白跟着同步。

  该漏洞的触发条件依然是未授权或者弱口令连接

  利用redis-rogue-server工具

  该工具的原理就是首先创建一个恶意的Redis服务器作为Redis主机(master),该Redis主机能够回应其他连接它的Redis从机的响应。有了恶意的Redis主机之后,就会远程连接目标Redis服务器,通过slaveof命令将目标Redis服务器设置为我们恶意Redis的Redis从机(slaver)。然后将恶意Redis主机上的exp同步到Reids从机上,并将dbfilename设置为exp.so。最后再控制Redis从机(slaver)加载模块执行系统命令即可。

  进行主从关系绑定的恶意代码

  审过Exp之后我们可以发现,在写入so文件时和另一个开源项目十分相似,两个项目在这里都进行了类似模块污染的操作。这里想起了之前做过的一道题目:[天翼杯 2021]easy_eval当时在做这道题目的时候,通过redis进行提权。当时思路是:

  造成redis沙盒逃逸漏洞的原因主要是由于redis lua,redis嵌入了lua编程语言作为其脚本引擎,可通过eval命令使用lua,lua引擎是沙盒化的,不能在运行redis的服务器上执行任意代码。但在Debian以及ubuntu发行版上,由于打包问题,在lua沙箱中遗留了一个对象package,攻击者可以利用这个对象package逃逸redis lua沙盒,在运行redis的服务器上执行任意命令。

  利用的前提依然是未授权或者弱口令连接,并且它只影响 Debian 系的 Linux 发行版系统(Debian、Ubuntu 等)上的 Redis 服务,其他系统上的 Redis 服务不受影响。

  2.2 <= redis < 5.0.13

  2.2 <= redis < 6.0.15

  2.2 <= redis < 6.2.5

  连接redis-server

  eval执行lua代码

  1 . 开启密码验证并设置高强度密码,redis的查询速度是非常快的,外部用户一秒内可以尝试多达150K个密码;所以密码要尽量长

  2 . 在redis.conf文件中绑定内网ip,最好是本地ip,并且禁止公网访问

  3 . 在redis.conf文件中修改redis默认端口

  4 . 低权限运行redis服务(非root用户)5 . 禁用高危命令,其实就是换个难猜的名字

  http://snowming.me/2021/08/

  https://www.leavesongs.com/PENETRATION/write-webshell-via-redis-server.html

  本文原作者:may1as

  转载来自FreeBuf.COM

  电话咨询