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

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