乐趣区

关于运维:高危-Apache-Kafka-远程代码执行漏洞复现及攻击拦截-CVE202325194

破绽简介

Apache Kafka 是一个分布式数据流解决平台,能够实时公布、订阅、存储和解决数据流。Kafka Connect 是一种用于在 kafka 和其余零碎之间可扩大、牢靠的流式传输数据的工具。攻击者能够利用基于 SASLJAAS 配置和 SASL 协定的任意 Kafka 客户端,对 Kafka Connect worker 创立或批改连接器时,通过结构非凡的配置,进行 JNDI 注入来实现近程代码执行。

影响版本

2.4.0<=Apache kafka<=3.3.2

修复计划

更新 Apache Kafka 至官网最新版本

环境搭建

通过 https://github.com/vulhub/vulhub 搭建

破绽复现

exp 可参考:
https://github.com/projectdiscovery/nuclei-templates/blob/5d90e8275084b0ae9166ec38cacd22e5a5a94fb8/http/vulnerabilities/apache/apache-druid-kafka-connect-rce.yaml

发动攻打申请:
结构 payload , 执行新建 /tmp/test.txt 文件

验证破绽存在,文件新建胜利

开启 RASP 后发动攻打:
在业务优先模式下,RASP 会呈现 JNDI 注入的告警,拦挡最终的命令执行

堆栈信息为

在防护模式下将间接在 JNDI 注入处被拦挡

堆栈信息为

破绽剖析

开始 org.apache.kafka.clients.producer.KafkaProducer#KafkaProducer(java.util.Properties)

跟进到 org.apache.kafka.clients.producer.KafkaProducer#KafkaProducer(java.util.Propertiesorg.apache.kafka.common.serialization.Serializer<K>,org.apache.kafka.common.serialization.Serializer<V>)

调用 org.apache.kafka.common.utils.Utils#propsToMap 对传入对象进行解决

将 map 型的对象传入 org.apache.kafka.clients.producer.KafkaProducer#KafkaProducer(java.util.Map<java.lang.String,java.lang.Object>org.apache.kafka.common.serialization.Serializer<K>org.apache.kafka.common.serialization.Serializer<V>)

之后调用 org.apache.kafka.clients.producer.ProducerConfig#appendSerializerToConfig

将返回的 newConfigs 传入 org.apache.kafka.clients.producer.ProducerConfig#ProducerConfig(java.util.Map<java.lang.String,java.lang.Object>)

将配置参数传入 org.apache.kafka.clients.producer.KafkaProducer#KafkaProducer(org.apache.kafka.clients.producer.ProducerConfig,org.apache.kafka.common.serialization.Serializer<K>org.apache.kafka.common.serialization.Serializer<V>org.apache.kafka.clients.producer.internals.ProducerMetadata,org.apache.kafka.clients.KafkaClientorg.apache.kafka.clients.producer.internals.ProducerInterceptors<K,V>org.apache.kafka.common.utils.Time)

赋值后调用 org.apache.kafka.clients.producer.KafkaProducer#newSender

调用到 org.apache.kafka.clients.ClientUtils#createChannelBuilder

赋值后调用 org.apache.kafka.common.network.ChannelBuilders#clientChannelBuilder

这里对值做了一个判断后调用 org.apache.kafka.common.network.ChannelBuilders#create

Create 办法中失去 map 型的 configs 后进行 switch,失去 SaslChannelBuilder 类型 channelBuilder 的对象,switch 完结后调用了 org.apache.kafka.common.network.SaslChannelBuilder#configure

org.apache.kafka.common.network.SaslChannelBuilder#configure 进入循环后到 org.apache.kafka.common.security.authenticator.LoginManager#acquireLoginManager

判断值后到 org.apache.kafka.common.security.authenticator.LoginManager#LoginManager

跟进到 org.apache.kafka.common.security.authenticator.AbstractLogin#login

调用 javax.security.auth.login.LoginContext#login

调用 javax.security.auth.login.LoginContext#invokePriv

调用 javax.security.auth.login.LoginContext#invoke 进行逻辑判断后调用 initialize 办法

Initialize 中失去 userProvider

user.provider.url 通过 jndi 提供

调用 com.sun.security.auth.module.JndiLoginModule#login

调用 com.sun.security.auth.module.JndiLoginModule#attemptAuthentication

通过 javax.naming.InitialContext#lookup(java.lang.String) 执行 userProvider 的值

因为 RASP 对 javax.naming.InitialContext.lookup 调用做了防护策略检测,所以会在此处拦挡。

Reference

https://github.com/luelueking/Java-CVE-Lists#cve-2023-25194
https://blog.snert.cn/index.php/2023/04/04/cve-2023-25194-kaf…


对于云鲨 RASP
悬镜云鲨 RASP 助力企业构建利用平安爱护体系、搭建利用平安研运闭环,将踊跃防御能力注入业务利用中,实现利用平安自免疫。详情欢送拜访云鲨 RASP 官网 https://rasp.xmirror.cn/

退出移动版