redis 未授权访问漏洞复现
一. 应用介绍
Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、 Key-Value 数据库。和 Memcached 类似,它支持存储的 value 类型相对更多,包括 string(字符串)、list ( 链表)、 set(集合)、zset(sorted set – 有序集合)和 hash(哈希类型)。这些数据类型都支持 push/pop 、 add/remove 及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上, redis 支持各种不同方式的排序。与 memcached 一样,为了保证效率,数据都是缓存在内存中。区别的是 redis 会周期性地把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了 master-slave ( 主从)同步。
二. 漏洞介绍
Redis 因配置不当可以导致未授权访问,被攻击者恶意利用。当前流行的针对 Redis 未授权访问的一种新型攻击方式,在特定条件下,如果 Redis 以 root 身份运行,黑客可以给 root 账户写入 SSH 公钥文件,直接通过 SSH 登录受害服务器,可导致服务器权限被获取和数据删除、泄露或加密勒索事件发生,严重危害业务正常服务。 部分服务器上的 Redis 绑定在 0.0.0.0:6379,并且没有开启认证(这是 Redis 的默认配置),以及该端口可以通过公网直接访问,如果没有采用相关的策略,比如添加防火墙规则避免其他非信任来源 ip 访问等,将会导致 Redis 服务直接暴露在公网上,可能造成其他用户可以直接在非授权情况下直接访问 Redis 服务并进行相关操作。目前比较主流的案例:yam2 minerd 挖矿程序,还有在多次应急事件中发现大量的 watch-smartd 挖矿木马。
三. 测试环境说明
测试对象环境
对应 IP
受害者(ubuntu 16.04)
192.168.5.135
攻击者(kali)
192.168.5.125
Redis 因配置不当可以未授权访问,攻击者无需认证访问到内部数据,可导致敏感信息泄露漏洞利用:核心就是进行写文件操作可以获取敏感信息,操作数据库,SSH 远程登录,写入 webshell 建议用 centos
四 .环境搭建
ubuntu16.04 安装 redis
markup
启动 redis
markup
如果是用 apt-get 或者 yum install 安装得 redis,可以直接通过下面的命令停止/启动/重启 redis
markup
如果是通过源码安装得 redis,则可以通过 redis 的客户端程序 redis-cli 的 shutdown 命令来重启 redis
1.redis 关闭
markup
① 200 多本网络安全系列电子书
② 网络安全标准题库资料
③ 项目源码
④ 网络安全基础入门、Linux、web 安全、攻防方面的视频
⑤ 网络安全学习路线图
👉 免费领取
2.redis 启动
markup
如果上述方式都没有成功停止 redis,则可以使用终极武器 kill -9
修改配置文件 redis.conf
markup
正常配置时,需要将 daemoize 设置为 yes(守护进程)
区别 yes:当 redis.conf 中选项 daemonize 设置成 yes 时,代表开启守护进程模式。在该模式下,redis 会在后台运行,并将进程 pid 号写入至 redis.conf 选项 pidfile 设置的文件中,此时 redis 将一直运行,除非手动 kill 该进程。no:当前界面将进入 redis 的命令行界面,exit 强制退出或者关闭连接工具(putty,xshell 等)都会导致 redis 进程退出。
redis 在开放往外网的情况下(默认配置是 bind 127.0.0.1,只允许本地访问,如果配置了其他网卡地址那么就可以网络访问),默认配置下是空口令,端口为 6379。这里需要将它注释掉。
版本较高的 redis 还需要将 protected-mode 设为 noredis3.2 版本后新增 protected-mode 配置,默认是 yes,即开启。设置外部网络连接 redis 服务,设置方式如下:1、关闭 protected-mode 模式,此时外部网络可以直接访问 2、开启 protected-mode 保护模式,需配置 bind ip 或者设置访问密码
此时我们的靶机环境已经搭建完毕,测试(默认无密码)
五 .攻击利用
Redis 默认使用 6379 端口,使用 nmap 对服务器进行扫描
markup
kali 安装 redis 下载
markup
解压
markup
会在当前目录下生成文件夹 redis-5.0.4
markup
编译完成,进入下级目录 src,启动 redis 客户端 远程连接靶机(默认无密码)
markup
!!!此时已经未授权访问到靶机的 redis 通过 info 查看信息
redis 数据库的一些基本操作
markup
写入一句话木马写入一句话木马需要我们知道网站的根目录相对于服务器的绝对路径。靶机在 /var/www/html/dedecms/uploads 这个目录下。执行下列命令
markup
由于我的靶机上没网站,所以这里就贴个别人的图片记录一下
然后用菜刀连接
可以看到,已经连接成功了!
1.写入 ssh 公钥,获取操作系统权限将 hacker 的公钥 追加 写入 redis 服务器的 /root/.ssh 文件夹下的 authotrized_keys 文件中,即 hacker 主机 直接登录 该服务器。"公钥登录" 原理很简单,就是用户将自己的公钥储存在远程主机上。登录的时候,远程主机会向用户发送一段随机字符串,用户用自己的私钥加密后,再发回来。远程主机用事先储存的公钥进行解密,如果成功,就证明用户是可信的,直接允许登录 shell,不再要求密码。这种方法要求用户必须提供自己的公钥。如果没有现成的,可以直接用 ssh-keygen 生成一个:首先在自己的电脑上生成 key:
markup
将公钥导入 key.txt 文件(前后用\n 换行,避免和 Redis 里其他缓存数据混合),再把 key.txt 文件内容写入目标主机的缓冲里:
markup
markup
这里设置目录时,可能存在(error) ERR Changing directory: No such file or directory 这是因为 root 从来没有登录过,在被攻击机执行 ssh localhost 即可(error) ERR Changing directory: Permission denied 说明 redis 并不是以 root 启动的
六.总结
go
2.centos 定时反弹 shell,(ubuntu 可能不行)我们可以将 linux 反弹 shell 的命令写入定时任务中,这样,我们就可以接收到 redis 服务器反弹过来的 shell 了
powershell
版权声明: 本文为 InfoQ 作者【喀拉峻】的原创文章。
原文链接:【http://xie.infoq.cn/article/bb410e751e69fe2c051272ddd】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论