漏洞成因
redis默认绑定在 0.0.0.0:6379,且防火墙未配置不信任IP禁止访问策略,redis直接暴露在公网
redis没有设置密码认证(一般为空),可以免密码远程登录redis服务。
漏洞危害
攻击者可远程登录redis,导致敏感信息泄露。
攻击者登录redis后,可更改redis设置,也可使用flushall命令,删除所有数据。
攻击者可通过EVAL执行lua代码,或通过数据备份功能往磁盘写入后门文件。
如果redis以root身份运行,攻击者可以给root账户写入SSH公钥文件,直接通过SSH登录受害服务器
漏洞复现
环境搭建
攻击机kali192.168.25.128受害机ubuntu192.168.25.130
1、在ubuntu上安装redis:
wget http://download.redis.io/releases/redis-2.8.17.tar.gz #下载redis
tar -xzf redis-2.8.17.tar.gz #解压包
进入解压目录,执行如下命令:
make
如果make命令执行失败,且报错:
jemalloc/jemalloc.h: No such file or directory
这是由于没有安装gcc,可以用如下命令安装:
sudo apt-get install gcc
运行redis时可能还会报错,运行失败,提示运行当前redis需要更高版本的tcl,运行如下命令安装tcl:
sudo apt-get install tcl
以上都安装成功之后,运行如下命令,重新编译redis
make distclean && make
出现如下界面,redis安装成功:
2、redis基本配置
进入redis解压目录下的src目录,执行如下命令:
# 执行下面两条命令的目的是,每次可以直接在终端启动服务,而不必每次都进入安装目录
cp redis-server /usr/bin
cp redis-cli /usr/bin
返回redis解压目录,执行如下命令:
cp redis.conf /etc/
使用如下命令启动redis服务
redis-server /etc/redis.conf
出现如下界面,启动成功:
之后,查看redis配置文件
vim ../../etc/redis.conf
确保bind 127.0.0.1没有启用,如下图:
自此,环境部署完成,下面开始攻击。
漏洞利用
未授权访问的漏洞一共有3种利用方式,分别开始介绍。
第一种,利用redis写入shell
要能成功写入shell,需要满足如下条件:
可以通过redis-cli远程登录受害机
知道web发布绝对路径,且路径有读写权限
web服务器运行中
ubuntu中的web目录信息如下:
下面开始攻击。
通过redis-cli连接到ubuntu
如下图,写入成功:
直接在kali中访问写入的脚本,执行成功:
第二种,利用密钥登录,获取root权限
在kali中生成ssh登录需要的公钥和私钥,将公钥保存到test.txt文件中,方便一会儿写入ubuntu:
将tes.txt文件中的公钥写入到ubuntu:
redis-cli中的-x参数表示:从标准输入读取数据作为该命令的最后一个参数。
之后,还需要一步,就是设置redis的默认备份目录和备份文件。因为要通过ssh免密登录, 所以这里设置目录和备份文件,基本上是固定的。
默认的,ssh的免密登录公钥存默认放在目录/root/.ssh下,且密钥存放文件为:authorized_keys。如果ubuntu中没有/root/.ssh目录,自己可以手动创建一个。
至此,kali的公钥已经写入到ubuntu中。然后,在kali中用密钥登录ubuntu:
这里说明一点,要确保ubuntu是安装了ssh的,否则无法成功入侵。以上为成功通过root登录ubuntu。
第三种,
这种方式想获取shell,前提是权限要允许,可以设置定时任务,且任务设置完毕是可执行的。
先启用nc监听端口:
之后设置定时任务,将shell写入到ubuntu的定时任务中:
之后等待,很快就会连接到ubuntu:
解决方案
1. 在redis.conf文件中,绑定redis访问IP地址,指定固定的IP地址才能访问redis;
bind 127.0.0.1
2. 在redis.conf文件中,为redis添加密码验证
requirepass mypassword
3. 为redis配置单独的运行账户,以最低权限运行,且禁止redis账户远程登录
groupadd -r redis && useradd -r -g redis redis