Weblogic反序列化攻擊不依賴日志溯源攻擊時間
Part1 前言
WebLogic是美國Oracle公司出品一款中間件產品,在國內使用也比較廣泛。從2015年開始至今,接連爆出過10幾個可直接利用的Java反序列化漏洞,相關漏洞的原理也越來越復雜。每次應急響應過程中,遇到Oracle公司的產品都會特別頭疼,因為其日志結構太過繁雜,相關介紹文檔也很少,想弄明白是需要下一番功夫的。
在日常的應急響應過程中,為了解決這個問題,我曾經反復搭建環境,反編譯各種Weblogic攻擊工具,跟蹤其源代碼,研究可以不依賴日志分析去快速解決Weblogic中間件應急響應的方法,流量監控設備通常會有各種報警,混雜在一起的時候,也很難確定準確的攻擊時間。對于早期Weblogic反序列化攻擊,我做應急響應的時候,ls -lah看一下Weblogic幾個目錄下新增的文件及文件時間屬性,就能判斷出攻擊者用的是哪一款Weblogic漏洞利用工具,而且還可以確定準確的攻擊時間,根本就不用去看日志。下面分享一下這個技巧,后續也會花很大篇幅講講Weblogic的日志結構及各種漏洞的應急溯源技巧,因為牽扯到Oracle公司的產品,都會很復雜。花很大精力:
Part2 具體研究過程
- 虛擬機下測試
本地搭建Weblogic的環境如下:

使用Weblogic反序列化工具進行攻擊,查看服務器的/temp/目錄,會生成一個.tmp格式的臨時文件,然后查看此文件屬性,得知攻擊者執行命令的準確時間。

將此tmp文件拷貝出來,改擴展名為.jar,使用jadx-gui工具反編譯,即可看到攻擊代碼,證明此文件確實是攻擊者遺留下來的。

很多weblogic反序列化利用工具為了能通過T3協議回顯命令執行結果,都有類似的文件落地,也有的weblogic反序列化利用工具為了實現無文件落地回顯,是通過defineClass方法,從byte[]字節碼中還原一個Class對象,實現無文件落地注入構造回顯,這種應急方法不再適用。
- Weblogic回顯的實現原理:
應急方法講完之后,接下來看一下相關工具為什么會向/temp/目錄寫文件,首先要大體講一下T3反序列化回顯的原理:
Weblogic對外提供Web服務,會開放7001等端口,這個端口是Web協議、T3協議、IIOP協議并存的,而T3協議允許客戶端遠程調用Weblogic服務端的類,然后把執行結果再傳輸給客戶端。因此攻擊者會在本地事先編譯好一個具有執行命令、上傳文件等功能的java類,接著將編譯好的文件上傳至服務器上,通過URLClassLoader加載這個編譯文件,在服務端綁定一個實例,進而實現T3下的Weblogic反序列化回顯,其實有點類似于RMI遠程方法調用的過程。
這里要指出,有的Weblogic利用工具向服務器寫入臨時文件時,并沒有關閉文件句柄,導致文件會一直存在服務器上。
- 常見Weblogic利用工具特征
1 首先看第一款實現Weblogic反序列化回顯的利用工具,是由冰蝎作者rebeyond大牛編寫的。我記得大概是15年年底時,冰蝎作者rebeyond第一個公布出Weblogic T3反序列化回顯方法,而且給出了相關的代碼。后續的研究者的回顯方法基本上與rebeyond的差不多,通過加載字節碼方式實現無文件落地回顯。
我們反編譯一下rebeyond的工具,看看代碼的具體實現過程:

通過Connect按鈕事件跟進,一直跟到GenPayload類的Gen方法,很明顯可以看到,這款工具會向服務器的臨時目錄寫入1vBLBK.tmp臨時文件:
之后再通過URLClassLoader類加載這個tmp文件,在服務端綁定一個實例,進而實現T3回顯。

2 接下來看另一款Weblogic反序列化利用工具:

利用成功后,會在服務器上生成H3y5ec.tmp臨時文件。

之后同樣使用URLClassLoader類加載,實現T3回顯。
3 接下來看第3款Weblogic反序列化利用工具:
可以看到,也會向服務器寫一個臨時文件

同樣是使用URLClassLoader類加載,實現T3回顯:

Part3 總結
1. 早期的Weblogic反序列化利用工具,為了實現T3協議回顯,都會向服務器上寫入一個臨時文件。近幾年隨著無文件落地的流行,Weblogic的回顯基本上都是找一個實現了defineClass方法的類,通過還原字節碼方式實現回顯,這種應急方法不再適用。
2. 應急溯源過程中,日志量通常浩如煙海,而且容易被攻擊者刪掉。在此情況,研究一下攻擊者常用工具的原理,總結一些小技巧,在日常應急溯源工作中,會事半功倍,省去很大的工作量。