CVE-2017-12617-Tomcat遠程代碼執行漏洞復現測試
*本文原創作者:生如夏花,本文屬於FreeBuf原創獎勵計劃,禁止轉載
0x00前情提要
Apache Tomcat團隊10月3日宣布,如果配置了默認servlet,則在9.0.1(Beta),8.5.23,8.0.47和7.0.82之前的所有Tomcat版本都包含所有操作系統上的潛在危險的遠程執行代碼(RCE)漏洞,CVE-2017-12617:遠程代碼執行漏洞。
只需參數readonly設置為false或者使用參數readonly設置啟用WebDAV servlet false。此配置將允許任何未經身份驗證的用戶上傳文件(如WebDAV中所使用的)。發現並阻止上傳JavaServer Pages(.jsp)的過濾器可以避免這個問題。所以只要JSP可以上傳,然後就可以在伺服器上執行。
現在,由於此功能通常不需要,所以大多數公開曝光的系統將不會readonly設置false並因此不受影響。
在WindowsCVE-2017-12615的 Tomcat 7中,類似的漏洞被修復後,前幾天又發現了這個安全問題(CVE-2017-12617)。
2017年9月19日,Apache Tomcat官方確認並修復了兩個高危漏洞,漏洞CVE編號:CVE-2017-12615和CVE-2017-12616,該漏洞受影響版本為7.0-7.80之間,在一定條件下,攻擊者可以利用這兩個漏洞,獲取用戶伺服器上 JSP 文件的源代碼,或是通過精心構造的攻擊請求,向用戶伺服器上傳惡意JSP文件,通過上傳的 JSP 文件 ,可在用戶伺服器上執行任意代碼,從而導致數據泄露或獲取伺服器許可權,存在高安全風險。
CVE-2017-12616:信息泄露漏洞
當 Tomcat 中使用了 VirtualDirContext 時,攻擊者將能通過發送精心構造的惡意請求,繞過設置的相關安全限制,或是獲取到由VirtualDirContext 提供支持資源的 JSP 源代碼。
CVE-2017-12615:遠程代碼執行漏洞
當 Tomcat 運行在 Windows 主機上,且啟用了 HTTP PUT 請求方法(例如,將readonly 初始化參數由默認值設置為 false),攻擊者將有可能可通過精心構造的攻擊請求向伺服器上傳包含任意代碼的 JSP 文件。之後,JSP 文件中的代碼將能被伺服器執行。
通過以上兩個漏洞可在用戶伺服器上執行任意代碼,從而導致數據泄露或獲取伺服器許可權,存在高安全風險。
影響版本:
CVE-2017-12617影響範圍:Apache Tomcat 7.0.0 - 7.0.81
CVE-2017-12616影響範圍:Apache Tomcat 7.0.0 - 7.0.80
CVE-2017-12615影響範圍: Apache Tomcat 7.0.0 - 7.0.79
參考鏈接:
CVE-2017-12615:
https://tomcat.apache.org/security-7.html
http://tomcat.apache.org/securit… pache_Tomcat_7.0.81
CVE-2017-12617
http://tomcat.apache.org/security-7.html
http://tomcat.apache.org/security-8.html
http://tomcat.apache.org/security-9.html
0x01漏洞利用
該公開描述的利用是作為發送特殊特製HTTP,使用PUT作為有效載荷用JSP請求到Tomcat伺服器。
然後,當通過HTTP客戶端(例如Web瀏覽器)訪問新上傳的JSP時,執行代碼。
首先搭建tomcat環境,需要預裝下jdk,安裝流程和配置參考:
http://www.ouyaoxiazai.com/soft/stgj/133/45254.html
搭建成功後,訪問 http://127.0.0.1:8080
安裝好後,修改 D:ProgramFilesApache Software FoundationTomcat 7.0confweb.xml 配置文件,增加 readonly 設置為 false ,一定要記得重啟下tomcat服務。
然後使用burpsuite抓包把GET方法轉為PUT方法,後面加test.jsp文件的內容然後發送
內容如下:
注意:PUT路徑要用/結束,寫入成功後,會返回201或者200,如果返回404說明沒有寫/。
不能直接put jsp或者jspx文件的,在windows下可以用test.jsp/、test.jsp/.、test.jsp::$DATA來繞過
經過測試,最新版apache-tomcat-7.0.81可以用test.jsp/、test.jsp/.來繞過
訪問http://127.0.0.1:8080/test.jsp 頁面會出現test這個字元串
寫入成功後,在伺服器的 web目錄,如下
D:Program FilesApache SoftwareFoundationTomcat 7.0webappsROOT增加了test.jsp文件
訪問上傳的文件 http://127.0.0.1:8080/test.jsp?pwd=023&cmd=ipconfig
0x02原理分析
Tomcat 的 Servlet 是在 conf/web.xml 配置的,通過配置文件可知,當後綴名為 .jsp 和 .jspx 的時候,是通過 JspServlet 處理請求的:
而其他的靜態文件是通過 DefaultServlet 處理的:
可以得知,「1.jsp 」(末尾有一個和空格)並不能匹配到 JspServlet,而是會交由 DefaultServlet 去處理。當處理 PUT 請求時:
會調用 resources.bind:
dirContext 為 FileDirContext:
調用 rebind 創建文件:
又由於 Windows 不允許「 」作為文件名結尾,所以會創建一個 .jsp 文件,導致代碼執行。
0x03參考資料:
https://github.com/fupinglee/MyPython/tree/master/exploit/CVE-2017-12615
https://www.secfree.com/article-399.html
https://www.rapid7.com/db/vulnerabilities/apache-tomcat-cve-2017-12617
http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-12617
https://lists.apache.org/thread.html/3fd341a604c4e9eab39e7eaabbbac39c30101a022acc11dd09d7ebcb@%3Cannounce.tomcat.apache.org%3E
0x04修復建議:
將Tomcat更新到該漏洞被修復的版本(例如,Tomcat 8.5.23)只能防止攻擊者上傳JSP。
但是readonlyinit-param不應該將false首先設置。如果此參數保留到默認(true),則攻擊者無法上傳文件。
另外,當然也可以在前端(例如WAF)上阻止PUT和DELETE請求。
*本文原創作者:生如夏花,本文屬於FreeBuf原創獎勵計劃,禁止轉載
※如何將自己的樹莓派打造成「滲透測試神器」
※獨家首發 | CVE-2017-11816 GDI信息泄露漏洞分析
TAG:FreeBuf |