Jboss 反序列化(CVE-2017-12149)的復現
漏洞名稱: Jboss 反序列化(CVE-2017-12149)
漏洞描述: JBoss是一個管理EJB的容器和服務器,支持EJB 1.1、EJB 2.0和EJB3的規范。在/invoker/readonly路徑下,攻擊者可以構造序列化代碼傳入服務器進行反序列化,由於沒有對反序列化操作進行任何檢測,導致攻擊者可以執行任意代碼。
漏洞影響: Redhat JBoss Enterprise Application Platform 5.0\
影響版本: JBoss 5.x / 6.x
\
靶機相關環境
Ubuntu:20.04(要注意Ubuntu:20.04一般默認安裝了UFW(Uncomplicated Firewall))
jdk:1.8
jboss:jboss-5.1.0.GA
(因為jboss的版本比較老,所以修改配置文件時可以參考:https://wenku.baidu.com/view/18bc1b18c5da50e2524d7ff5.html)
安裝配置成功后啟動服務通過另一個虛擬機訪問:
\
接下來我們先看下這個漏洞能干什么,直接使用暴力工具jboss-_CVE-2017-12149-master,(下載地址:https://github.com/yunxu1/jboss-_CVE-2017-12149)
\
好,證明存在該漏洞。接下來就可以進行指令了:
\
這樣就進入了Ubuntu的終端命令,可以在此進行各種行為。例如新建文件等:
\
\
所以,這個漏洞的危險性可顯而知,那是這個漏洞是如何產生的呢?
Jboss 反序列化(CVE-2017-12149)的原理
Java序列化就是指把Java對象轉換為字節序列的過程,在傳遞和保存對象時.保證對象的完整性和可傳遞性。對象轉換為有序字節流,以便在網絡上傳輸或者保存在本地文件中。
Java反序列化就是指把字節序列恢復為Java對象的過程,根據字節流中保存的對象狀態及描述信息,通過反序列化重建對象。
序列化:
FileOutputStream fos = new FileOutputStream(file);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(st);
反序列化:
ileInputStream fis = new FileInputStream(file);
ObjectInputStream ois = new ObjectInputStream(fis);
Student st1 = (Student) ois.readObject();
而jboss的漏洞出現在HttpInvoker組件中的ReadOnlyAccessFilter過濾器中,源碼在jboss\server\all\deploy\httpha-invoker.sar\invoker.war\WEB-INF\classes\org\jboss\invocation\http\servlet目錄下的ReadOnlyAccessFilter.class文件中,其中doFilter函數代碼如下:
\
可以看出它從http中獲取數據,通過調用readobject()方法對數據流進行反序列操作,但是沒有進行檢查或者過濾。
知道了大概原理后我們就可以對其進行相應的修復。
Jboss 反序列化(CVE-2017-12149)的修復方案
修復原理: 通過向http-invoker.sar的web.xml文件中的安全約束添加url-pattern>來保護對整個 http-invoker上下文的訪問,不想使用http-invoker.sar可以將其刪除。
方法一:修改web.xml文件
具體步驟如下:
步驟一: 進入/jboss/server/default/deploy/http-invoker.sar/invoker.war/WEB-INF/web.xml,如圖所示:
\
步驟二: 在安全約束中添加
\
步驟三: 修改完成后,重啟jboss服務,再次通過另一個虛擬機訪問並且使用工具檢測,結果如下:
\
發現沒有執行漏洞,故修復成功。
方法二:不需要http-invoker.sar組件的直接刪除\
結果同方法一。
\
方法三:升級jboss到jboss7x版本\
以上使用的是JBoss AS 5.1.0,用JBoss AS 6.1.0.Final復現並使用相同步驟修復后結果同上。