歡迎和大家交流技術相關問題:
郵箱: jiangxinnju@163.com
博客園地址: http://www.cnblogs.com/jiangxinnju
GitHub地址: https://github.com/jiangxincode
知乎地址: https://www.zhihu.com/people/jiangxinnju
漏洞介紹
國外的研究人員zero thoughts發現了一個Spring框架的反序列化遠程代碼執行漏洞。
spring-tx.jar包中的org.springframework.transaction.jta.JtaTransactionManager類存在JNDI反序列化問題。只要創建一個JtaTransactionManager 對象讓userTransactionName指向我們注冊的RMI鏈接(如rmi://x.x.x.x:1099/Object)然后將對象發送到有漏洞的服務器,即可執行遠程命令。具體細節可以分析漏洞作者的POC代碼。
漏洞發現者的博客
http://zerothoughts.tumblr.com/post/137769010389/fun-with-jndi-remote-code-injection
漏洞影響
受影響漏洞服務器主要需要滿足如下條件:
- CLASSPATH 中包含了 spring-tx.jar,spring-commons.jar,javax.transaction-api.jar
- 存在反序列化接口如RMI, JMS, IIOP等
出現漏洞的關鍵jar包 spring-tx.jar,並不是spring最基本的包,默認並不使用,所以並不是所有使用了spring框架的應用都受影響,需要具體檢查是否包含了spring-tx.jar包。
POC簡要復現
環境描述:
Java環境——這里使用的是JDK1.7版本
Maven環境——見下面的maven包 apache-maven-3.3.9-bin.zip
Spring漏洞利用POC——spring-jndi-master.zip
環境搭建:
- Java環境安裝,略
- Maven安裝
直接解壓apache-maven-3.3.9-bin.zip ,添加環境變量,然后用mvn –v測試是否安裝成功
如我的maven路徑:C:\java\apache-maven-3.3.9
添加環境變量:
Mvn –v測試
服務器搭建:
Poc里面有兩個文件夾server和client
Server用於搭建包含spring的服務器環境,client用於構建反序列化對象並發送給server
服務器搭建命令如下
首先進入server目錄
然后用mvn install安裝spring環境
Mvn就是開始安裝的maven,server目錄下有pom.xml文件。 Mvn install會根據里面的內容來下載安裝spring等組件。 最后會將jar包放到target中。
java -cp “target/*” ExploitableServer 9999命令在9999端口起到有漏洞的服務器程序。
ExploitableServer.java比較簡單,創建socket等待連接,讀取對象。
這樣便開啟了一個連接
客戶端攻擊對象構建:
命令與上面相似:
進入目錄,安裝spring組件,調用代碼向服務器發送指令。
Mvn install,客戶端也需要安裝spring的組件,來使得客戶端的java代碼能夠構造spring對象。
java -cp “target/” ExploitClient 127.0.0.1 9999 127.0.0.1
“target/ 指定spring路徑
ExploitClient 為客戶端的main程序
127.0.0.1 9999 127.0.0.1三個參數分別對應為
客戶端包含三個文件
ExploitClient是主程序,包含序列化的過程,一些主要出現漏洞的類,以及數據的發送。
HttpFileHandler 主要是構建字節流
ExportObject 是功能代碼,構建自己的java代碼,服務器有權限就能執行。
執行結果:
自檢與修復:
由於主要出現漏洞的地方在於Spring-tx.jar包的JtaTransactionManager類中。 可以檢測項目中是否有使用spring-tx.jar包。如果有使用可以對JtaTransactionManager類進行重寫。同時有防火牆的用戶可以先對數據包中的JtaTransactionManager數據進行過濾,直到源碼修復。
POC網絡傳輸數據如下,可以先對使用了JtaTransactionManager的報文進行攔截。