前言:
最近配置 openvas 的时候安装了 redis, 听说曾经曝出过一个未授权访问漏洞, 便找了一下相关资料想自己动手复现一下漏洞的利用过程, 当然所有的攻击性操作都是在虚拟机上完成的, 本文所有的操作是在 Fedora26 上进行的, 使用的虚拟机为 Oracle VM VirtualBox 过程中遇到了不少坑, 在此整理一下过程, 供像我一样怀有好奇心的小白们学习参考, 如有差错还请各位大牛们斧正
一漏洞简介以及危害:
1. 什么是 redis 未授权访问漏洞:
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 服务
2. 漏洞的危害:
(1)攻击者无需认证访问到内部数据, 可能导致敏感信息泄露, 黑客也可以恶意执行 flushall 来清空所有数据;
(2)攻击者可通过 EVAL 执行 lua 代码, 或通过数据备份功能往磁盘写入后门文件;
(3)最严重的情况, 如果 Redis 以 root 身份运行, 黑客可以给 root 账户写入 SSH 公钥文件, 直接通过 SSH 登录受害服务器
二漏洞的复现和利用:
1.SSH 免密登录原理简介:
在正式开始介绍复现过程前, 先说明一下我复现的是最严重的漏洞利用情况即以 root 身份登录 redis 服务写入 ssh 公钥实现使用 ssh 免密登录受害主机现在先说明一下 SSH 免密登录的原理(已经了解的童靴们可以直接跳过 hhh):
SSH 提供两种登录验证方式, 一种是口令验证也就是账号密码登录, 另一种是密钥验证也就是我们想要的免密登录了, 这里我只简单说一下密钥验证的原理
所谓密钥验证, 其实就是一种基于公钥密码的认证, 使用公钥加密私钥解密, 其中公钥是可以公开的, 放在服务器端, 你可以把同一个公钥放在所有你想 SSH 远程登录的服务器中, 而私钥是保密的只有你自己知道, 公钥加密的消息只有私钥才能解密, 大体过程如下:
(1)客户端生成私钥和公钥, 并把公钥拷贝给服务器端;
(2)客户端发起登录请求, 发送自己的相关信息;
(3)服务器端根据客户端发来的信息查找是否存有该客户端的公钥, 若没有拒绝登录, 若有则生成一段随机数使用该公钥加密后发送给客户端;
(4)客户端收到服务器发来的加密后的消息后使用私钥解密, 并把解密后的结果发给服务器用于验证;
(5)服务器收到客户端发来的解密结果, 与自己刚才生成的随机数比对, 若一样则允许登录, 不一样则拒绝登录
2. 漏洞环境搭建:
(一)安装 redis 服务:
(1)从官网下载源码的压缩包:
wget http://download.redis.io/releases/redis-3.2.11.tar.gz
(2)下载完成后, 解压压缩包:
tar xzf redis - 3.2.11.tar.gz;
(3)然后进入解压后的目录: cd redis-3.2.11, 输入 make 并执行;
(4)make 结束后, 进入 src 目录: cd src, 将 redis-server 和 redis-cli 拷贝到 / usr/bin 目录下(这样启动 redis-server 和 redis-cli 就不用每次都进入安装目录了):
(5)返回目录 redis-3.2.11, 将 redis.conf 拷贝到 / etc / 目录下:
(6)编辑 etc 中的 redis 配置文件 redis.conf, 如下图所示:
去掉 ip 绑定, 允许除本地外的主机远程登录 redis 服务:
关闭保护模式, 允许远程连接 redis 服务:
(7)使用 / etc / 目录下的 reids.conf 文件中的配置启动 redis 服务:
redis - server / etc / redis.conf
(二)安装 ssh 服务:
fedora26 安装有 ssh 服务, 但默认没有启动, 需使用 systemctl start sshd 命令启动 ssh 服务
(三)复制虚拟机, 一个作为靶机, 一个作为攻击端
至此漏洞环境便已经搭建完毕, 此时的 redis 服务是可以以 root 用户身份远程免密码登录的
3. 漏洞利用重现:
(1)我使用的虚拟机是 Oracle VM VirtualBox, 首先配置网络, 都设置为桥接网卡, 界面为环回适配器, 混杂模式为全部允许, 使两台虚拟机之间可以互相通信:
(2)使用 ifconfig 命令查看两台虚拟机的 ip:
如果 ip 一样, 则修改一台虚拟机 ip, 我修改了右侧虚拟机 ip 为 192.168.0.147:
ifconfig enp0s3 192.168.0.147 up
虚拟机 A(192.168.0.146)为靶机, 虚拟机 B(192.168.0.147)为攻击端;
(3)在 A 中开启 redis 服务: redis-server /etc/redis.conf ;
(4)在主机 A 中执行 mkdir /root/.ssh 命令, 创建 ssh 公钥存放目录(A 是作为 ssh 服务器使用的)
(5)在 B 中生成 ssh 公钥和私钥, 密码设置为空:
进入. ssh 目录: cd .ssh/, 将生成的公钥保存到 1.txt:
(6)ping 一下目标主机 ip 确定能通, 若不能则再运行一遍 ifconfig enp0s3 192.168.0.147 up 命令, 我的可以 ping 通:
(7)将 1.txt 写入 redis(使用 redis-cli -h ip 命令连接主机 A, 将文件写入):
(8)远程登录主机 A 的 redis 服务: redis-cli -h 192.168.0.146 并使用 CONFIG GET dir 命令得到 redis 备份的路径:
(9)更改 redis 备份路径为 ssh 公钥存放目录(一般默认为 / root/.ssh):
(10)设置上传公钥的备份文件名字为 authorized_keys:
(11)检查是否更改成功(查看有没有 authorized_keys 文件), 没有问题就保存然后退出, 至此成功写入 ssh 公钥到靶机:
(12)开启主机 A 和主机 B 的 ssh 服务(Fedor 默认 ssh 服务关闭), 命令为 systemctl start sshd.serveice:
(13)在主机 B 使用 ssh 免密登录主机 A:ssh -i id_rsa root@192.168.0.146, 成功登录:
至此, 我们就成功利用 redis 未授权访问漏洞实现了 ssh 免密登录目标服务器, 接下来就可以使用 ssh 服务来进行下一步的渗透工作啦
来源: http://www.tuicool.com/articles/E3mInmV