Tomcat 遠程代碼執行漏洞分析(CVE-2017-12615)及補丁 Bypass
9 月 19 日,騰訊雲安全中心監測到 Apache Tomcat 修復了2個嚴重級別的漏洞, 分別為: 信息泄露漏洞(CVE-2017-12616)、遠程代碼執行漏洞(CVE-2017-12615),在某些場景下,攻擊者將分別能通過這兩個漏洞,獲取用戶伺服器上 JSP 文件的源代碼,或是通過精心構造的攻擊請求,向用戶伺服器上傳惡意 JSP 文件,通過上傳的 JSP 文件 ,可在用戶伺服器上執行任意代碼。
雲鼎實驗室通過對於漏洞描述,搭建漏洞環境,並對其進行復現。此漏洞為高危漏洞,即使是非默認配置,但是一旦存在漏洞,那麼攻擊者可以成功上傳 Webshell,並控制伺服器。
復現
根據描述,在 Windows 伺服器下,將 readonly 參數設置為 false 時,即可通過 PUT 方式創建一個 JSP 文件,並可以執行任意代碼。
通過閱讀 conf/web.xml 文件,可以發現:
默認 readonly 為 true,當 readonly 設置為 false 時,可以通過 PUT / DELETE 進行文件操控。
配置 readonly 為 false:
啟動 Tomcat,利用 PUT 請求創建文件:
提示 404。通過描述中的 Windows 受影響,可以結合 Windows 的特性。其一是 NTFS 文件流,其二是文件名的相關限制(如 Windows 中文件名不能以空格結尾)來繞過限制:
訪問發現可以正常輸出:
分析
Tomcat 的 Servlet 是在 conf/web.xml 配置的,通過配置文件可知,當後綴名為 .jsp 和 .jspx 的時候,是通過JspServlet處理請求的:
而其他的靜態文件時通過DefaultServlet處理的:
可以得知,「1.jsp 」(末尾有一個和空格)並不能匹配到 JspServlet,而是會交由DefaultServlet去處理。當處理 PUT 請求時:
會調用resources.bind:
dirContext 為FileDirContext:
調用 rebind創建文件:
又由於 Windows 不允許「 」作為文件名結尾,所以會創建一個 .jsp 文件,導致代碼執行。
Bypass 分析
然而,經過黑盒測試,當 PUT 地址為/1.jsp/時,仍然會創建 JSP,會影響 Linux 和 Windows 伺服器,並且 Bypass 了之前的補丁,分析如下。
在進入 bind 函數時,會聲明一個 File 變數:
進入 File 後,會對 name 進行 normalize
最後得到的 path 就是沒有最後 / 的 path 了:
影響
由於存在去掉最後的 / 的特性,那麼這個漏洞自然影響 Linux 以及 Windows 版本。而且經過測試,這個漏洞影響全部的 Tomcat 版本,從 5.x 到 9.x 無不中槍。目前來說,最好的解決方式是將 conf/web.xml 中對於 DefaultServlet 的 readonly 設置為 true,才能防止漏洞。
*本文作者:騰訊雲安全團隊,轉載請註明來自FreeBuf.COM


※Face ID是否使iPhone X更安全?答案可能取決於你自己
※探訪2017國家網路安全宣傳周,參展安全廠商巡禮(下)
※CVE-2017-8759完美復現(另附加hta+powershell彈框閃爍解決方案)
※特別企劃 | 2017年安全公司併購案迭起,誰在押寶機器學習和人工智慧?
TAG:FreeBuf |