[关闭]
@websec007 2017-08-21T02:51:25.000000Z 字数 5874 阅读 4123

JBoss 反序列化漏洞学习

漏洞利用收集 环境搭建


一、时间回顾

2015.11.06 国外FoxGlove 安全研究团队在博客上首次公开了关于使用反序列化漏洞进行实战攻击的利用过程和利用的poc。

二、受影响的web容器

以上web容器基本上都使用了“反序列化技术”的web容器,所以也就是说只要使用“反序列化技术”的web应用都可能存在这个漏洞。

三、漏洞引发的原因

3.1 jboss 配置不当

一般情况下jboss 漏洞的利用都是由于默认配置不当导致的,即没配置好相应的权限验证,只要配置好相应的权限验证,这个漏洞基本上就利用不了啦!

Jboss 应用服务利用的是HTTP协议,可以在任何端口上运行,默认安装在8080端口,而且Jboss与“JMXInvokerServlet”的通信过程中存在一个公开漏洞(可以直接上传部署恶意war包,关键字:“8080/jmx-console/” 与“flavor=URL,type=DeploymentScanner”)。JMX是一个java的管理协议,在Jboss中的JMXInvokerServlet可以使用HTTP协议与其进行通话,这一通信功能依赖于java的序列化类。

我们可以通过以下三个面检查下我们自己的jboss应用是否存在漏洞利用的风险:    
(1)JBoss JMXInvokerServlet接口(默认8080端口)以及JBoss Web Console (/web-console/) 是否禁止对外;
(2)以上系统是否都有在传输对象内容时,使用序列化技术(二进制流或base64encode)
(3)当对这些传输数据截包并且被替换为“包含命令执行的序列化内容”时,远程命令执行即触发。

3.2 Apache common-collection库

apche common-collection库就是当前流行“java 反序列化漏洞”产生的主要原因所在。Java反序列化漏洞利用的较多的场景就是利用Apache Commons-Collections这个常用的Java库来实现任意代码执行。

在Apache commons工具包中有很多jar包(这些jar包可以理解为就像python里的各种库),具体jar包里面含有的内容,如下图所示。

3.3 java 介绍

java是个工业化的设计软件,其里面会用到序列号与反序列化的技术,其中的JMI JMX都会用到序列号与反序列化的技术,所以java相关的很多应用都可能受到这个漏洞的影响。

四、 防护措施

五、延伸

是不是使用只要使用以上的防护技术,就能解决java反序列号漏洞问题呢?其实并不是这样的,前面说过了,只要使用了“java反序列化”技术的应用都可能存在这个漏洞,像下面的三个java应用都是受到“反序列化漏洞”影响的。

即,这些使用了序列化技术的应用其实都可能存在“java 反序列化漏洞”的隐患。

六、JBoss 环境搭建


6.1 JDK 安装包下载

JDK 1.8 安装包下载链接:http://js.9553.com/soft/jdk-8u66-windows-i586-20151102.rar

6.1.1 JDK 安装

JDK 1.8 安装过程,我们默认安装即可,无需任何配置;

6.1.2 JRE 环境变量配置

直接编辑“用户环境变量”中 path 环境变量,在期中直接新增一个 JRE 中bin目录的绝对位置即可(C:\Program Files\Java\jre1.8.0_66)

注:有关JDK环境变量的设置,会后面JBoss部署时具体给出,这里无需配置,只要配置好JRE的环境变量直接即可。


6.2 JBoss 环境配置与部署

6.2.1 JBoss 安装下载

JBoss 服务器安装包,找了好半天终于找对了一个,下面是服务安装包的下载地址链接。

JBoss AS服务器安装包下载链接: http://jbossas.jboss.org/downloads/

6.2.2 JBoss 安装

JBoss 的安装包部署很简单,只要安装时选择好相应的目录,然默认安装即可,没有什么特别需要注意的内容。

截图:

6.2.3 JBoss 环境变量配置

6.2.3.1 启动 run.bat 报错

此时JBoss 服务器安装包就搞定了,接下其实我们第一想法就是要启动JBoss服务,但是我启动时发现报错了,具体报错信息如下图。


6.2.3.2 添加环境变量

依据个人JDK 的安装情况与 JBOSS的实际安装环境报错给出的三个全局环境变量值,进行环境变量的添加,笔者的实际环境变量信息如下。

注:简单点说,就是按照上面截图中报错中给出的信息进行相关配置即可。)
  1. 变量名:JAVA_HOME:
  2. 变量值:C:\Program Files\Java\jdk1.8.0_66
  1. 变量名:JBOSS_HOME
  2. 变量值:C:\jboss-4.2.1.GA
  1. 变量名:CLASSPATH
  2. 变量值:C:\jboss-4.2.1.GA\bin\run.jar


6.3 JBOSS 服务访问

6.3.1 JBoss 服务启动测试

全局环境变量添加结束后,我们再次尝试打开JBoss服务启动脚本,启动JBoss服务,看到如下图关键信息,即表示服务启动成功。

6.3.2 JBoss 远程访问报错

通过对jboss服务的访问测试发现,jboss服务默认只接受本地(127.0.0.1:8080)的访问,远程主机访问jboss 8080服务会报“拒绝访问”!

6.3.3 Jboss 远程访问配置

经过相关的查询,发现jboss 从4.0版本后,其默认配置是拒绝远程主机对jboss应用服务的直接访问的,如果需要访问,必须做相应的设置,具体办法见以下内容。

6.3.3.1 方法一:脚本启动处理

jboss-4.2.2.GA/bin目录下,新建start.bat批处理脚本,写入如下内容:

  1. run.bat -b 0.0.0.0

保存完,直接使用你新创建的这个start.bat 批处理脚本启动服务之即可,此时我们进行远程访问就OK了。

6.3.3.2 方法二:修改配置文件处理

需要要修改server.xml配置文件,其一般路径如下: $JBOSS_HOME\server\default\deploy\jboss-web.deployer\server.xml

具体需要配置的内容就是修改 address 的参数值,修改0.0.0.0即可,具体配置文件方法可参考如下所示。

  1. <Connector port="8080" address="${jboss.bind.address}"
  2. maxThreads="250" maxHttpHeaderSize="8192"
  3. emptySessionPath="true" protocol="HTTP/1.1"
  4. enableLookups="false" redirectPort="8443" acceptCount="100"
  5. connectionTimeout="20000" disableUploadTimeout="true" />

port:表示JBoss 应用的访问端口,默认是8080,把它改为80,访问网页时就可以不加端口号了访问,如:http://localhost

address:允许外网能访问你JBoss应用的IP地址,关键的地方就是把这里的address的值改为0.0.0.0 ,即表示监听本地所有网卡,这样外网终端就可以通过本地的接口IP来访问本地的JBoss服务。

  1. <Connector port="80" address="0.0.0.0"
  2. maxThreads="250" maxHttpHeaderSize="8192"
  3. emptySessionPath="true" protocol="HTTP/1.1"
  4. enableLookups="false" redirectPort="8443" acceptCount="100"
  5. connectionTimeout="20000" disableUploadTimeout="true" />

重启提示:

当然最后还要提醒下大家,修改配置文件后需要重启JBoss服务,只有这样配置文件内容才能生效,这一点请切记。

6.3.4 外网访问测试

此时我们可以在命令行下观察下本地服务器JBoss 8080服务端口监听的情况,通过如下的截图我们可以清醒的看到,此时本服务服务监听是开启在 0.0.0.0上,其实其表达的意思就是在本地服务器上开启所有接口 TCP 8080端口的监听,那么我们自然可以使用外网终端对JBoss服务进行访问了。

前面如果大家注意,在没有修改配置文件前,我们本地监听有关8080端口监听的开启,其只是在127.0.0.1 回环接口上(请见6.3.1章节截图)。

七、JBoss 反序列化漏洞复现

JBoss 漏洞环境我们已经搭建OK了,接下就正式进入漏洞利用的复现过程。

7.1 漏洞利用条件

有关 JBoss 反序列化漏洞利用条件,这里我们使用前面“3.1章节”关于JBoss 配置不当的检查方法,自检一下我们现在部署的jboss应用服务环境。

序号 自检内容 检查结果
1 JBoss JMXInvokerServlet接口(默认8080端口)以及JBoss Web Console (/web-console/) 是否禁止对外; 不符合
2 以上系统是否都有在传输对象内容时,使用序列化技术(二进制流或base64encode) 不符合
3 当对这些传输数据截包并且被替换为“包含命令执行的序列化内容”时,远程命令执行即触发。 不符合

当前笔者复现环境使用的是jboss-4.2.2.GA版本,所以默认情况下,以上三项检查内容自然是不符合的,接下来我们直接上工具利用检查确认。

7.2 工具下载

这里演示两款网上流行工具的基本使用,具体工具的下载地址统计如下。

Java反序列化集成工具:http://pan.baidu.com/s/1jGSEFFS 密码: si6t
JBoss反序列化漏洞getshell工具:http://pan.baidu.com/s/1hqD26fq

注:这里仅做学习交流之用,请勿使用这些工具进行任何违法攻击行为。

7.3 工具利用

7.3.1 Java反序列化集成工具

这里演示下使用这个 java 反序列化集成工具来上传菜刀一句话,然后使用菜刀直接获取主机的远程控制权限。

7.3.1.1 工具基本功能

通过信息获取功能,我们可以直接获取到系统、当前管理员权限以及当前用户目录位置等关键信息。

通过此功能模块,可以直接进行相关远程命令的执行操作,直接获取远程主机的控制权限。

我这里直接使用工具自带的webshell进行上传,上传成功后,我们进行webshell的访问,发现会报500的解析报错,也就是说工具自带的webshell可能有问题,后面测试使用Cknife自带的1.jsp源码,是可以正常解析的。

7.3.1.2 上传菜刀shell,获取主机权限

前面功能模块中,直接使用webshell上传,在不知道jboss web根目录的情况下,默认任何上传的文件,其存放的位置可能都是在$_jboss/bin 目录下(具体路径,可直接查看信息获取中给出的信息“User Currrent Directory”),所以我们首先可以使用“列目录”的功能收集下jboss web的真是根目录位置信息。

一般情况jboss默认安装的情况,其目录位置路径如下:
"$_jboss/server/default/deploy/jboss-webdeployer/ROOT.war/"

7.3.2 JBoss反序列化漏洞getshell工具

这个JBoss 反序列化漏洞利用工具,是一个专门针对JBoss反序列化漏洞利用的工具,其直接通过war包的部署来获取一个“中国菜刀”的webshell,使用非常的简单。

学习参考:

jboss 安装,环境搭建
http://www.jb51.net/softjc/222769.html

jboss 访问配置
http://www.cnblogs.com/hyddd/archive/2009/05/07/1451378.html

jboss 部署项目?
http://www.codeceo.com/article/jboss-setup-local-project.html

http://j4s0nh4ck.iteye.com/blog/2142592
http://www.codeceo.com/article/java-jar-war-ear.html

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注