漏洞成因 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命令执行失败,且报错: jemalloc/jemalloc.h: No such file or directory
这是由于没有安装gcc,可以用如下命令安装: 运行redis时可能还会报错,运行失败,提示运行当前redis需要更高版本的tcl,运行如下命令安装tcl: 以上都安装成功之后,运行如下命令,重新编译redis 出现如下界面,redis安装成功: class="ztext-empty-paragraph">
class="ztext-empty-paragraph">
2、redis基本配置 进入redis解压目录下的src目录,执行如下命令: # 执行下面两条命令的目的是,每次可以直接在终端启动服务,而不必每次都进入安装目录
cp redis-server /usr/bin
cp redis-cli /usr/bin
返回redis解压目录,执行如下命令: class="ztext-empty-paragraph">
class="ztext-empty-paragraph">
使用如下命令启动redis服务 redis-server /etc/redis.conf
出现如下界面,启动成功: class="ztext-empty-paragraph">
之后,查看redis配置文件 确保bind 127.0.0.1没有启用,如下图: class="ztext-empty-paragraph">
class="ztext-empty-paragraph">
自此,环境部署完成,下面开始攻击。 漏洞利用 未授权访问的漏洞一共有3种利用方式,分别开始介绍。 第一种,利用redis写入shell 要能成功写入shell,需要满足如下条件: 知道web发布绝对路径,且路径有读写权限 web服务器运行中ubuntu中的web目录信息如下: class="ztext-empty-paragraph">
class="ztext-empty-paragraph">
下面开始攻击。 通过redis-cli连接到ubuntu class="ztext-empty-paragraph">
class="ztext-empty-paragraph">
如下图,写入成功: class="ztext-empty-paragraph">
class="ztext-empty-paragraph">
直接在kali中访问写入的脚本,执行成功: class="ztext-empty-paragraph">
class="ztext-empty-paragraph">
第二种,利用密钥登录,获取root权限 在kali中生成ssh登录需要的公钥和私钥,将公钥保存到test.txt文件中,方便一会儿写入ubuntu: class="ztext-empty-paragraph">
class="ztext-empty-paragraph">
将tes.txt文件中的公钥写入到ubuntu: class="ztext-empty-paragraph">
class="ztext-empty-paragraph">
redis-cli中的-x参数表示:从标准输入读取数据作为该命令的最后一个参数。 之后,还需要一步,就是设置redis的默认备份目录和备份文件。因为要通过ssh免密登录, 所以这里设置目录和备份文件,基本上是固定的。 默认的,ssh的免密登录公钥存默认放在目录/root/.ssh下,且密钥存放文件为:authorized_keys。如果ubuntu中没有/root/.ssh目录,自己可以手动创建一个。 class="ztext-empty-paragraph">
class="ztext-empty-paragraph">
至此,kali的公钥已经写入到ubuntu中。然后,在kali中用密钥登录ubuntu: class="ztext-empty-paragraph">
class="ztext-empty-paragraph">
这里说明一点,要确保ubuntu是安装了ssh的,否则无法成功入侵。以上为成功通过root登录ubuntu。 第三种, 这种方式想获取shell,前提是权限要允许,可以设置定时任务,且任务设置完毕是可执行的。 先启用nc监听端口: class="ztext-empty-paragraph">
class="ztext-empty-paragraph">
之后设置定时任务,将shell写入到ubuntu的定时任务中: class="ztext-empty-paragraph">
class="ztext-empty-paragraph">
之后等待,很快就会连接到ubuntu: class="ztext-empty-paragraph">
class="ztext-empty-paragraph">
解决方案 1. 在redis.conf文件中,绑定redis访问IP地址,指定固定的IP地址才能访问redis; 2. 在redis.conf文件中,为redis添加密码验证 3. 为redis配置单独的运行账户,以最低权限运行,且禁止redis账户远程登录 groupadd -r redis && useradd -r -g redis redis
|