漏洞概述
2018年4月17日,北京時間4月18日凌晨,Oracle官方發布了4月份的關鍵補丁更新CPU(Critical Patch Update),其中包含一個高危的Weblogic反序列化漏洞(CVE-2018-2628),這個漏洞是在2017年11月份報給Oracle的,通過該漏洞,攻擊者可以在未授權的情況下遠程執行任意代碼。
其基本原理其實都是利用了T3協議的缺陷實現了Java虛擬機的RMI:遠程方法調用(Remote Method Invocation),能夠在本地虛擬機上調用遠端代碼。
影響版本
10.3.6.0,12.1.3.0,12.2.1.2, 12.2.1.3
JAVA序列化和反序列化
1.序列化
Java是運行在JVM(java虛擬機)之上的一種語言,我們通過命令行javac生成的字節碼格式的類文件在任何平台的JVM上都可以運行而JVM(java虛擬機)運行時會解釋類文件中的命令。在Java下對象這個概念很重要,java允許我們在內存中創建可復用的對象,但是一般情況下,只有當JVM屬於運行狀態時,這些對象才能夠存在,也就是說這些對象的生命周期沒有JVM的生命周期來的長。那如果我們需要保證即使在JVM停止運行的情況下,也能夠保存相關制定對象,並且在將來某個時刻能夠被讀取是用得到,Java的序列化正是為了解決這一需求而產生的。
Java序列化是指把Java對象轉換為字節序列的過程便於保存在內存、文件、數據庫中,ObjectOutputStream類的writeObject()方法可以實現序列化。
2.反序列化
通過對序列化的理解,那么就可以很好的來理解反序列化。
反序列化的過程是指把字節序列恢復為 Java 對象的過程。我們可以將反序列化理解為一個”讀”操作,通過ObjectInputStream 類的 readObject() 方法可以將對象實例進行”反序列化”操作。
綜合來說,序列化與反序列化是讓 Java 對象脫離 Java 運行環境的一種手段,可以有效的實現多平台之間的通信、對象持久化存儲。
漏洞原理
遠程攻擊者可利用該漏洞在未授權的情況下發送攻擊數據,通過T3協議(EJB支持遠程訪問,且支持多種協議。這是web Container和EJB Container的主要區別)在Weblogic Server在執行反序列化操作,利用RMI(遠程方法調用)機制的缺陷,通過JRMP協議(JAVA Remote Messaging Protocol: Java遠程消息交換協議)達到執行任意反序列化目的。
環境搭建
漏洞復現
使用ysoserial工具啟動一個JRMP Server:
接下來使用exploit.py腳本,向服務器發送數據包:
連接成功,並且返回了payload,可以繼續利用上傳shell。
接下來進入容器內,查看命令是否執行:
漏洞修復
更新至最新版
禁用T3協議
參考鏈接
https://github.com/vulhub/vulhub/tree/master/weblogic/CVE-2018-2628
https://blog.csdn.net/he_and/article/details/90580999