這篇文章給大家介紹如何進行ApacheTomca遠程執行代碼CVE-2019-0232漏洞淺析和復現,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
一、 漏洞背景
Apache Tomcat,俗稱Tomcat Server,是一個開源的JavaServlet容器,由社區在Apache Software Foundation(ASF)的支持下開發。它實現了多個Java EE規范,包括Java Servlet,JavaServer Pages(JSP),Java表達式語言(EL)和WebSocket,并提供了一個“純Java”HTTP Web服務器環境,Java代碼可以在該環境中運行。
2019年4月15日,Nightwatch網絡安全發布的信息對CVE-2019-0232,包括Apache Tomcat上的通用網關接口(CGI)Servlet的一個遠程執行代碼(RCE)漏洞。這種高嚴重性漏洞可能允許攻擊者通過濫用由Tomcat CGIServlet輸入驗證錯誤引起的操作系統命令注入來執行任意命令。
二、 影響版本
影響版本如下:
tomcat 7.0.04之前
tomcat 8.5.40之前
tomcat 9.0.19之前
三、 漏洞分析
CGI(CommonGateway Interface) 是WWW技術中最重要的技術之一,有著不可替代的重要地位。CGI是外部應用程序(CGI程序)與WEB服務器之間的接口標準,是在CGI程序和Web服務器之間傳遞信息的過程。CGI規范允許Web服務器執行外部程序,并將它們的輸出發送給Web瀏覽器,CGI將Web的一組簡單的靜態超媒體文檔變成一個完整的新的交互式媒體。CGI腳本用于執行Tomcat Java虛擬機(JVM)外部的程序。默認情況下禁用的CGI Servlet用于生成從查詢字符串生成的命令行參數。由于Java運行時環境(JRE)將命令行參數傳遞給Windows的錯誤,在啟用CGI Servlet參數enableCmdLineArguments的Windows計算機上運行的Tomcat服務器很容易受到遠程代碼執行的影響。
ApacheTomcat文件web.xml用于為加載到Tomcat實例中的所有Web應用程序定義默認值。CGI Servlet是默認提供的servlet之一。該servlet支持執行符合CGI規范的外部應用程序。通常,CGI Servlet映射到URL模式“/cgi-bin / *”,這意味著任何執行的CGI應用程序必須存在于Web應用程序中。
通過調用CreateProcess()函數啟動Windows操作系統中的新進程,該函數將以下命令行作為字符串(對CreateProcess的lpComandLine參數):int CreateProcess(...,lpComandLine,...)
Windows中的參數不是作為字符串數組單獨傳遞的,而是作為單個命令行字符串傳遞的。這要求程序通過使用GetCommandLine() API 提取命令行字符串然后使用CommandLineArgvW()輔助函數解析參數字符串來解析命令行本身。Windows的命令行字符串流程圖如下:
漏洞是由于命令行參數從JRE到Windows的不正確傳遞而產生的,對于Java應用程序,在CreateProcess()函數啟動之前調用ProcessBuilder()。然后將參數傳遞給ProcessImpl()的靜態方法start ,這是一個依賴于平臺的類。在ProcessImpl()的Windows實現中,start方法調用ProcessImpl()的私有構造函數,該構造函數為CreateProcess調用創建命令行。Java應用程序的命令行字符串流程圖如下:
ProcessImpl()構建Cmdline并將其傳遞給CreateProcess() Windows函數,之后CreateProcess() 在cmd.exe shell環境中執行.bat和.cmd文件。
如果要運行的文件包含.bat或.cmd擴展名,則要運行的映像將變為cmd.exe,即Windows命令提示符。然后CreateProcess()在階段1重新啟動,批處理文件的名稱作為cmd.exe的第一個參數傳遞。這導致'hello.bat ...'成為'C:\ Windows \ system32 \cmd.exe / c“hello.bat ...” '。由于CommandLineToArgvW的引用規則與cmd的引用規則不同,這意味著需要應用一組額外的引用規則以避免cmd.exe解釋的命令行中的命令注入。
由于Java(ProcessImpl())確實沒有額外的報價為這種隱含的cmd.exe上傳遞的參數調用推廣,通過加工參數的cmd.exe現在被用來執行,呈現固有的問題,如果參數不傳遞給cmd.exe的正確。
對于cmd.exe,我們首先理解cmd本質上是一個文本預處理器:給定一個命令行,它進行一系列文本轉換,然后將轉換后的命令行交給CreateProcess()。某些轉換用其值替換環境變量名稱。轉換,例如由&,||,&&運算符觸發的轉換,將命令行拆分為幾個部分。所有cmd的轉換都由以下元字符之一觸發:(,),%,!,^,“,<,>,&和|。元字符“特別有趣:當cmd正在轉換命令行并看到”時,它會將“復制”到新的命令行,然后開始將字符從舊命令行復制到新命令行,而不會看到是否有任何這些字符是元字符。這一直持續到cmd到達命令行的末尾,進入變量替換,或者看到另一個“。
如果我們依賴cmd的“-behavior來保護參數,使用引號會產生意外行為。通過將不受信任的數據作為命令行參數傳遞,由此約定不匹配引起的錯誤成為安全問題。
例如,以下內容:
hello.bat“dir\”&whoami“
0:[hello.bat]
1:[&dir]
這里,cmd將&metacharacter解釋為命令分隔符,因為從它的角度來看,&字符位于引用區域之外。在這種情況下,'whoami'可以被任意數量的有害命令所取代。當使用hello.bat運行上面顯示的命令時實現命令執行。
四、 漏洞復現
首先下載有漏洞的tomcat版本,加壓到響應文件夾,然后配置環境變量。
然后修改conten.xml
修改web.xml,添加一些參數并在web.xml文件中啟用CGIServlet。
兩個文件修改后,啟動服務器,訪問http://localhost:8080/
成功訪問到tomcat后,創建hello.bat腳本放入cgi-bin目錄下。
hello.bat內容
然后訪問http://localhost:8080/cgi-bin/hello.bat?dir,顯示如下命令執行成功。
五、 修復建議
下載Apache Tomcat官方補丁盡快升級進行防護。同時,用戶可以將CGI Servlet初始化參數enableCmdLineArguments設置為false來進行防護。
關于如何進行ApacheTomca遠程執行代碼CVE-2019-0232漏洞淺析和復現就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。