Web中間件漏洞之Tomcat篇
1.Tomcat簡介
Tomcat 服務(wù)器是一個(gè)免費(fèi)的開放源代碼的 Web 應(yīng)用服務(wù)器,屬于輕量級(jí)應(yīng)用服務(wù)器,在中小型系統(tǒng)和并發(fā)訪問用戶不是很多的場(chǎng)合下被普遍使用,是開發(fā)和調(diào)試 JSP 程序的好選擇。
對(duì)于一個(gè)初學(xué)者來說,可以這樣認(rèn)為,當(dāng)在一臺(tái)機(jī)器上配置好 Apache 服務(wù)器,可利用它響應(yīng) HTML(標(biāo)準(zhǔn)通用標(biāo)記語言下的一個(gè)應(yīng)用)頁面的訪問請(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)行的。
2.遠(yuǎn)程代碼執(zhí)行
漏洞簡介及成因
Tomcat 運(yùn)行在 Windows 主機(jī)上,且啟用了 HTTP PUT 請(qǐng)求方法,可通過構(gòu)造的請(qǐng)求向服務(wù)器上傳包含任意代碼的 JSP 文件,造成任意代碼執(zhí)行。
影響版本:Apache Tomcat 7.0.0 – 7.0.81
漏洞復(fù)現(xiàn)
配置漏洞,開啟put方法可上傳文件功能
- tomcat文件夾下的/conf/web.xml文件插入
- readonly
- false
重啟tomcat服務(wù)
訪問127.0.0.1:8080,burp抓包,send to Repeater,將請(qǐng)求方式改為PUT,創(chuàng)建一個(gè)122.jsp,并用%20轉(zhuǎn)義空格字符。123.jsp內(nèi)容為:
- <%Runtime.getRuntime().exec(request.getParameter("cmd"));%>
返回201,說明創(chuàng)建成功
訪問127.0.0.1:8080/122.jsp?cmd=calc
彈出計(jì)算器
漏洞修復(fù)
1)檢測(cè)當(dāng)前版本是否在影響范圍內(nèi),并禁用PUT方法。
2)更新并升級(jí)至新版。
3.后臺(tái)弱口令war包部署
漏洞簡介及成因
Tomcat支持在后臺(tái)部署war文件,可以直接將webshell部署到web目錄下。
若后臺(tái)管理頁面存在弱口令,則可以通過爆破獲取密碼。
漏洞復(fù)現(xiàn)
Tomcat安裝目錄下conf里的tomcat-users.xml配置如下
訪問后臺(tái),登陸
上傳一個(gè)war包,里面是jsp后門
成功上傳并解析,打開
可執(zhí)行系統(tǒng)命令
也可進(jìn)行文件管理,任意查看、刪除、上傳文件
漏洞修復(fù)
1)在系統(tǒng)上以低權(quán)限運(yùn)行Tomcat應(yīng)用程序。創(chuàng)建一個(gè)專門的 Tomcat服務(wù)用戶,該用戶只能擁有一組最小權(quán)限(例如不允許遠(yuǎn)程登錄)。
2)增加對(duì)于本地和基于證書的身份驗(yàn)證,部署賬戶鎖定機(jī)制(對(duì)于集中式認(rèn)證,目錄服務(wù)也要做相應(yīng)配置)。在CATALINA_HOME/conf/web.xml文件設(shè)置鎖定機(jī)制和時(shí)間超時(shí)限制。
3)以及針對(duì)manager-gui/manager-status/manager-script等目錄頁面設(shè)置最小權(quán)限訪問限制。
4)后臺(tái)管理避免弱口令。
4.反序列化漏洞
漏洞簡介及成因
該漏洞與之前Oracle發(fā)布的mxRemoteLifecycleListener反序列化漏洞(CVE-2016-3427)相關(guān),是由于使用了JmxRemoteLifecycleListener的監(jiān)聽功能所導(dǎo)致。而在Oracle官方發(fā)布修復(fù)后,Tomcat未能及時(shí)修復(fù)更新而導(dǎo)致 的遠(yuǎn)程代碼執(zhí)行。
該漏洞所造成的最根本原因是Tomcat在配置JMX做監(jiān)控時(shí)使用了JmxRemoteLifecycleListener的方法。
漏洞影響版本:
- ApacheTomcat 9.0.0.M1 到9.0.0.M11
- ApacheTomcat 8.5.0 到8.5.6
- ApacheTomcat 8.0.0.RC1 到8.0.38
- ApacheTomcat 7.0.0 到7.0.72
- ApacheTomcat 6.0.0 到6.0.47
漏洞復(fù)現(xiàn)
利用條件:外部需要開啟JmxRemoteLifecycleListener監(jiān)聽的10001和10002端口,來實(shí)現(xiàn)遠(yuǎn)程代碼執(zhí)行。
conf/server.xml中第30行中配置啟用JmxRemoteLifecycleListener功能監(jiān)聽的端口:
配置好jmx的端口后,在tomcat版本所對(duì)應(yīng)的extras/目錄下來下載catalina-jmx-remote.jar以及下載groovy-2.3.9.jar兩個(gè)jar包。下載完成后放至在lib目錄下。
接著再去bin目錄下修改catalina.bat腳本。在ExecuteThe Requested Command注釋前面添加這么一行。
重啟tomcat,監(jiān)聽本地的10001和10002的RMI服務(wù)端口是否成功運(yùn)行。

構(gòu)造payload,彈出計(jì)算器
成功彈出計(jì)算器。
漏洞修復(fù)
1、關(guān)閉JmxRemoteLifecycleListener功能,或者是對(duì)jmx JmxRemoteLifecycleListener遠(yuǎn)程端口進(jìn)行網(wǎng)絡(luò)訪問控制。同時(shí),增加嚴(yán)格的認(rèn)證方式。
2、根據(jù)官方去升級(jí)更新相對(duì)應(yīng)的版本。