http://dy.163.com/v2/article/detail/F7VD50BL0511CJ6O.htmlhtml
Apache Tomcat是一個開源的Java servlet容器。2月20日,長亭科技研究人員發現了Apache Tomcat文件包含漏洞(CNVD-2020-10487/CVE-2020-1938)。該漏洞是因爲Tomcat AJP協議存在缺陷而致使,攻擊者利用該漏洞可經過構造特定參數,讀取服務器webapp下的任意文件。若目標服務器同時存在文件上傳功能,攻擊者可進一步實現遠程代碼執行。web
本文介紹如何利用該漏洞實現遠程代碼執行。shell
AJP協議
apache
AJP是Apache Tomcat web服務器用來與servlet容器通訊的一個二進制協議。主要用於集羣或逆向代理場景,其中web服務器與應用服務器或servelet容器進行通訊。tomcat
簡單來講,就是HTTP Connector暴露給客戶端了,AJP是webserver (如Apache HTTPD)和Apache Tomcat服務器之間內部使用的,如圖1所示。AJP在Apache HTTP服務器中是以模塊的形式實現的,表示爲mod_jk或mod_proxy_ajp。AJP自己並不會暴露到外部,這也是下一部分要討論的RCE場景的先決條件之一。安全
圖 1. Apache JServ協議說明服務器
Ghostcat漏洞
網絡
Ghostcat自己是一個Local File Include/Read(本地文件包含/讀)漏洞,而非任意文件上傳/寫漏洞。在Apache Tomcat的安全公告頁中,Ghostcat被描述爲「AJP Request Injection and potential Remote Code Execution」(AJP請求注入和潛在的遠程代碼執行)漏洞。Potential代表Ghostcat默認狀況下並不是RCE漏洞。
公告中進一步描述了RCE發生的所須要的條件:web應用須要容許文件上傳和容許將上傳的文件存儲到web應用中,或者攻擊者能夠獲取web應用內容的控制權。融合了將文件看做JSP處理的場景能夠實現RCE。
總的來講,若是Tomcat AJP Connector對外暴露了,那麼Ghostcat就會引起一些潛在的安全風險。但對外暴露並非推薦的配置。此外,RCE還須要一些其餘的先決條件。這些條件同時知足在現實場景中是很難的。
app
巴西知名的安全研究人員Joo Matos將這些先決條件進行了總結。webapp
圖 2. RCE發生的先決條件
研究人員對這些先決條件進行進一步分析:
·經過APP特徵上傳文件。第一個先決條件表示系統中應該預先安裝一個含有文件上傳特徵的應用。若是安裝了,潛在攻擊者就能夠用web應用自己的文件上傳漏洞來上傳惡意web shell文件。將文件翻譯爲JSP只有在上傳漏洞限制特定文件(如JPG或TXT)擴展時才須要。
·文件保存在document root中。攻擊者入侵應用後,就能夠上傳惡意文件,上傳的惡意文件須要保存在應用的root文件夾中。這個先決條件幾乎是不可能的,由於:
-在Java應用中將文件保存到應用的root文件夾中是不常見的;
此外,從開發者角度來看,由於大多數Apache Tomcat應用都是以.WAR文件形式存在的,所以上傳文件到root文件夾是沒有意義的。
應用root文件夾是臨時的,因此當有新版本的應用升級時,文件夾就會被覆寫。
·直接到達AJP端口。前面兩個條件知足後,攻擊者就能夠直接從互聯網經過反向代理到達Tomcat AJP Connector (默認端口8009),這也就是外部暴露的AJP。如前所述,這並非常見的推薦配置。並且即時AJP Connector暴露了,由於AJP是一個二進制文件,所以攻擊者嘗試鏈接也會接收到一個來自服務器的400 Bad Request響應。
Ghostcat的嚴重性
Ghostcat漏洞影響大多數的Apache Tomcat版本。可是考慮到RCE漏洞利用所需的先決條件,研究人員認爲在現實中將Ghostcat變成RCE漏洞是幾乎不可能的。
大多數的PoC都證實了在Apache Tomcat的webapps/ROOT中有一個webshell.txt文件,而後能夠將漏洞變成RCE漏洞。可是在實際場景中,已經存在於網絡中的攻擊者可能利用該漏洞來進行下一步攻擊,由於能夠直接到達AJP Connector。可是要到達攻擊的這一階段,仍然須要上傳一個惡意文件,好比webapps/folder文件夾的webshell,而後將該文件翻譯爲JSP,這是很難作到的。
Ghostcat補丁
Apache Tomcat發佈了一系列補丁來解決Ghostcat漏洞。
由於Ghostcat 漏洞利用的是AJP Connector中默認啓用的/conf/server.xml文件的錯誤配置:
< Connector port=」8009″ protocol=」AJP/1.3″ redirectPort=」8443″ / >
因此Apache Tomcat團隊在commit 4c933d8禁用了AJP connector,如圖3所示:
圖 3. Commit 4c933d8,默認禁用AJP connector
由於補丁禁用了AJP因此也就阻止了Ghostcat漏洞利用的可能性。
此外,Apache還發布了一個補丁,只須要限制AJP爲默認監聽回還端口無需禁用AJP,如圖4所示。Apache Tomcat研究人員還作了一些改變來改善AJP協議的總體使用狀況,好比當secretRequired屬性設置爲true時強制定義一個secret。同時也確保全部到AJP Connector的含有任意或未識別的屬性的請求接收到403響應,如圖6所示。
圖 4. Commit 0e8a50f0,強制SJP協議監聽回還地址而非0.0.0.0
圖 5. Commit 9ac90532,檢查參數secretRequired是否設置爲true和是否有定義的secret
圖 6. Commit 64fa5b99,若是到AJP Connector的請求中含有任意或未識別的屬性,攔截並返回403錯誤
結論
綜上所述,Ghostcat自己並非一個RCE漏洞,但仍然帶來許多潛在的風險。考慮到當前已經有不少該漏洞的公開利用方法,所以研究人員建議用戶儘快更新到最新的Tomcat版本,以較少被利用的風險。
參考及來源:https://blog.trendmicro.com/trendlabs-security-intelligence/busting-ghostcat-an-analysis-of-the-apache-tomcat-vulnerability-cve-2020-1938-and-cnvd-2020-10487/