溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何進(jìn)行ApacheTomca遠(yuǎn)程執(zhí)行代碼CVE-2019-0232漏洞淺析和復(fù)現(xiàn)

發(fā)布時(shí)間:2021-12-18 18:20:47 來源:億速云 閱讀:122 作者:柒染 欄目:網(wǎng)絡(luò)管理

這篇文章給大家介紹如何進(jìn)行ApacheTomca遠(yuǎn)程執(zhí)行代碼CVE-2019-0232漏洞淺析和復(fù)現(xiàn),內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。

ApacheTomca遠(yuǎn)程執(zhí)行代碼(CVE-2019-0232)漏洞淺析和復(fù)現(xiàn)

一、 漏洞背景

Apache Tomcat,俗稱Tomcat Server,是一個(gè)開源的JavaServlet容器,由社區(qū)在Apache Software Foundation(ASF)的支持下開發(fā)。它實(shí)現(xiàn)了多個(gè)Java EE規(guī)范,包括Java Servlet,JavaServer Pages(JSP),Java表達(dá)式語言(EL)和WebSocket,并提供了一個(gè)“純Java”HTTP Web服務(wù)器環(huán)境,Java代碼可以在該環(huán)境中運(yùn)行。

2019年4月15日,Nightwatch網(wǎng)絡(luò)安全發(fā)布的信息對(duì)CVE-2019-0232,包括Apache Tomcat上的通用網(wǎng)關(guān)接口(CGI)Servlet的一個(gè)遠(yuǎn)程執(zhí)行代碼(RCE)漏洞。這種高嚴(yán)重性漏洞可能允許攻擊者通過濫用由Tomcat CGIServlet輸入驗(yàn)證錯(cuò)誤引起的操作系統(tǒng)命令注入來執(zhí)行任意命令。

二、  影響版本

影響版本如下:

tomcat 7.0.04之前

tomcat 8.5.40之前

tomcat 9.0.19之前  

三、  漏洞分析

CGI(CommonGateway Interface) 是WWW技術(shù)中最重要的技術(shù)之一,有著不可替代的重要地位。CGI是外部應(yīng)用程序(CGI程序)與WEB服務(wù)器之間的接口標(biāo)準(zhǔn),是在CGI程序和Web服務(wù)器之間傳遞信息的過程。CGI規(guī)范允許Web服務(wù)器執(zhí)行外部程序,并將它們的輸出發(fā)送給Web瀏覽器,CGI將Web的一組簡(jiǎn)單的靜態(tài)超媒體文檔變成一個(gè)完整的新的交互式媒體。CGI腳本用于執(zhí)行Tomcat Java虛擬機(jī)(JVM)外部的程序。默認(rèn)情況下禁用的CGI Servlet用于生成從查詢字符串生成的命令行參數(shù)。由于Java運(yùn)行時(shí)環(huán)境(JRE)將命令行參數(shù)傳遞給Windows的錯(cuò)誤,在啟用CGI Servlet參數(shù)enableCmdLineArguments的Windows計(jì)算機(jī)上運(yùn)行的Tomcat服務(wù)器很容易受到遠(yuǎn)程代碼執(zhí)行的影響。

ApacheTomcat文件web.xml用于為加載到Tomcat實(shí)例中的所有Web應(yīng)用程序定義默認(rèn)值。CGI Servlet是默認(rèn)提供的servlet之一。該servlet支持執(zhí)行符合CGI規(guī)范的外部應(yīng)用程序。通常,CGI Servlet映射到URL模式“/cgi-bin / *”,這意味著任何執(zhí)行的CGI應(yīng)用程序必須存在于Web應(yīng)用程序中。

如何進(jìn)行ApacheTomca遠(yuǎn)程執(zhí)行代碼CVE-2019-0232漏洞淺析和復(fù)現(xiàn)

通過調(diào)用CreateProcess()函數(shù)啟動(dòng)Windows操作系統(tǒng)中的新進(jìn)程,該函數(shù)將以下命令行作為字符串(對(duì)CreateProcess的lpComandLine參數(shù)):int CreateProcess(...,lpComandLine,...)

Windows中的參數(shù)不是作為字符串?dāng)?shù)組單獨(dú)傳遞的,而是作為單個(gè)命令行字符串傳遞的。這要求程序通過使用GetCommandLine() API 提取命令行字符串然后使用CommandLineArgvW()輔助函數(shù)解析參數(shù)字符串來解析命令行本身。Windows的命令行字符串流程圖如下:

如何進(jìn)行ApacheTomca遠(yuǎn)程執(zhí)行代碼CVE-2019-0232漏洞淺析和復(fù)現(xiàn)

漏洞是由于命令行參數(shù)從JRE到Windows的不正確傳遞而產(chǎn)生的,對(duì)于Java應(yīng)用程序,在CreateProcess()函數(shù)啟動(dòng)之前調(diào)用ProcessBuilder()。然后將參數(shù)傳遞給ProcessImpl()的靜態(tài)方法start ,這是一個(gè)依賴于平臺(tái)的類。在ProcessImpl()的Windows實(shí)現(xiàn)中,start方法調(diào)用ProcessImpl()的私有構(gòu)造函數(shù),該構(gòu)造函數(shù)為CreateProcess調(diào)用創(chuàng)建命令行。Java應(yīng)用程序的命令行字符串流程圖如下:如何進(jìn)行ApacheTomca遠(yuǎn)程執(zhí)行代碼CVE-2019-0232漏洞淺析和復(fù)現(xiàn)

ProcessImpl()構(gòu)建Cmdline并將其傳遞給CreateProcess() Windows函數(shù),之后CreateProcess()  在cmd.exe shell環(huán)境中執(zhí)行.bat.cmd文件。

如果要運(yùn)行的文件包含.bat或.cmd擴(kuò)展名,則要運(yùn)行的映像將變?yōu)閏md.exe,即Windows命令提示符。然后CreateProcess()在階段1重新啟動(dòng),批處理文件的名稱作為cmd.exe的第一個(gè)參數(shù)傳遞。這導(dǎo)致'hello.bat ...'成為'C:\ Windows \ system32 \cmd.exe / c“hello.bat ...” '。由于CommandLineToArgvW的引用規(guī)則與cmd的引用規(guī)則不同,這意味著需要應(yīng)用一組額外的引用規(guī)則以避免cmd.exe解釋的命令行中的命令注入。

由于Java(ProcessImpl())確實(shí)沒有額外的報(bào)價(jià)為這種隱含的cmd.exe上傳遞的參數(shù)調(diào)用推廣,通過加工參數(shù)的cmd.exe現(xiàn)在被用來執(zhí)行,呈現(xiàn)固有的問題,如果參數(shù)不傳遞給cmd.exe的正確。

對(duì)于cmd.exe,我們首先理解cmd本質(zhì)上是一個(gè)文本預(yù)處理器:給定一個(gè)命令行,它進(jìn)行一系列文本轉(zhuǎn)換,然后將轉(zhuǎn)換后的命令行交給CreateProcess()。某些轉(zhuǎn)換用其值替換環(huán)境變量名稱。轉(zhuǎn)換,例如由&,||,&&運(yùn)算符觸發(fā)的轉(zhuǎn)換,將命令行拆分為幾個(gè)部分。所有cmd的轉(zhuǎn)換都由以下元字符之一觸發(fā):(,),%,!,^,“,<,>,&和|。元字符“特別有趣:當(dāng)cmd正在轉(zhuǎn)換命令行并看到”時(shí),它會(huì)將“復(fù)制”到新的命令行,然后開始將字符從舊命令行復(fù)制到新命令行,而不會(huì)看到是否有任何這些字符是元字符。這一直持續(xù)到cmd到達(dá)命令行的末尾,進(jìn)入變量替換,或者看到另一個(gè)“。

如果我們依賴cmd的“-behavior來保護(hù)參數(shù),使用引號(hào)會(huì)產(chǎn)生意外行為。通過將不受信任的數(shù)據(jù)作為命令行參數(shù)傳遞,由此約定不匹配引起的錯(cuò)誤成為安全問題。

例如,以下內(nèi)容:

hello.bat“dir\”&whoami“

0:[hello.bat]

1:[&dir]

這里,cmd將&metacharacter解釋為命令分隔符,因?yàn)閺乃慕嵌葋砜?,&字符位于引用區(qū)域之外。在這種情況下,'whoami'可以被任意數(shù)量的有害命令所取代。當(dāng)使用hello.bat運(yùn)行上面顯示的命令時(shí)實(shí)現(xiàn)命令執(zhí)行。

四、  漏洞復(fù)現(xiàn)

首先下載有漏洞的tomcat版本,加壓到響應(yīng)文件夾,然后配置環(huán)境變量。如何進(jìn)行ApacheTomca遠(yuǎn)程執(zhí)行代碼CVE-2019-0232漏洞淺析和復(fù)現(xiàn)

如何進(jìn)行ApacheTomca遠(yuǎn)程執(zhí)行代碼CVE-2019-0232漏洞淺析和復(fù)現(xiàn)

如何進(jìn)行ApacheTomca遠(yuǎn)程執(zhí)行代碼CVE-2019-0232漏洞淺析和復(fù)現(xiàn)

然后修改conten.xml

如何進(jìn)行ApacheTomca遠(yuǎn)程執(zhí)行代碼CVE-2019-0232漏洞淺析和復(fù)現(xiàn)

修改web.xml,添加一些參數(shù)并在web.xml文件中啟用CGIServlet。

如何進(jìn)行ApacheTomca遠(yuǎn)程執(zhí)行代碼CVE-2019-0232漏洞淺析和復(fù)現(xiàn)

兩個(gè)文件修改后,啟動(dòng)服務(wù)器,訪問http://localhost:8080/如何進(jìn)行ApacheTomca遠(yuǎn)程執(zhí)行代碼CVE-2019-0232漏洞淺析和復(fù)現(xiàn)

如何進(jìn)行ApacheTomca遠(yuǎn)程執(zhí)行代碼CVE-2019-0232漏洞淺析和復(fù)現(xiàn)

成功訪問到tomcat后,創(chuàng)建hello.bat腳本放入cgi-bin目錄下。如何進(jìn)行ApacheTomca遠(yuǎn)程執(zhí)行代碼CVE-2019-0232漏洞淺析和復(fù)現(xiàn)

 hello.bat內(nèi)容如何進(jìn)行ApacheTomca遠(yuǎn)程執(zhí)行代碼CVE-2019-0232漏洞淺析和復(fù)現(xiàn)

然后訪問http://localhost:8080/cgi-bin/hello.bat?dir,顯示如下命令執(zhí)行成功。如何進(jìn)行ApacheTomca遠(yuǎn)程執(zhí)行代碼CVE-2019-0232漏洞淺析和復(fù)現(xiàn)

如何進(jìn)行ApacheTomca遠(yuǎn)程執(zhí)行代碼CVE-2019-0232漏洞淺析和復(fù)現(xiàn)

五、  修復(fù)建議

下載Apache Tomcat官方補(bǔ)丁盡快升級(jí)進(jìn)行防護(hù)。同時(shí),用戶可以將CGI Servlet初始化參數(shù)enableCmdLineArguments設(shè)置為false來進(jìn)行防護(hù)。

關(guān)于如何進(jìn)行ApacheTomca遠(yuǎn)程執(zhí)行代碼CVE-2019-0232漏洞淺析和復(fù)現(xiàn)就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI