天天看點

Struts2 REST插件遠端執行指令漏洞全面分析,WAF支援檢測防禦

Struts2 REST插件遠端執行指令漏洞全面分析,WAF支援檢測防禦

漏洞概述

2017年9月5日,apache struts 2官方釋出一個嚴重級别的安全漏洞公告,該漏洞由國外安全研究組織lgtm.com的安全研究人員發現,漏洞編号為cve-2017-9805(s2-052)。

在一定條件下,攻擊者可以利用該漏洞遠端發送精心構造的惡意資料包,擷取業務資料或伺服器權限,存在高安全風險。

漏洞基本資訊

當struts2使用rest插件使用xstream的執行個體xstreamhandler處理反序列化xml有效載荷時沒有進行任何過濾,可以導緻遠端執行代碼,攻擊者可以利用該漏洞構造惡意的xml内容擷取伺服器權限。

利用條件:使用rest插件并在受影響版本範圍内。

利用方式:攻擊者建構惡意資料包遠端利用。

漏洞影響範圍:

struts 2.3.x全系版本(根據實際測試,2.3版本也存在該漏洞)

struts 2.5 - struts 2.5.12

如何檢測漏洞?

建議運維人員或開發人員盡快關注并資産,可以檢查使用了rest插件struts版本是否在受影響範圍内。如果存在,建議您盡快按照以下方式修複漏洞。

如何規避漏洞風險?

目前官方已經釋出更新檔,建議更新到 apache struts2.5.13、apache struts 2.3.34版本。

阿裡雲雲盾waf已釋出該漏洞規則,使用者可以通過waf,對利用該漏洞的攻擊行為進行檢測和防禦,最大程度減少安全風險。

漏洞詳細分析資訊

本次struts2漏洞起因:一個rest插件struts2-rest-plugin.jar用到了xstreamhandler這個類,這個類對http請求中content-type是application/xml的,調用xstream進行處理,這裡先看一下污點傳入,如圖:

Struts2 REST插件遠端執行指令漏洞全面分析,WAF支援檢測防禦
Struts2 REST插件遠端執行指令漏洞全面分析,WAF支援檢測防禦

然而漏洞真正存在域xstream中,觸發的根本在于javax.imageio.spi.filteriterator類的next()會調用filteriterator$filter的filter(),然後javax.imageio.imageio$containsfilter的filter()方法中會用反射調用java.lang.processbuilder().start()

利用代碼如圖所示:

Struts2 REST插件遠端執行指令漏洞全面分析,WAF支援檢測防禦

之前github已經公開利用代碼,上圖代碼隻不過是攻擊者的exp當中的一個payload而已,阿裡雲安全團隊詳細分析,主要是利用javax.imageio.imageio$containsfilter這個内部類,代碼如圖:

Struts2 REST插件遠端執行指令漏洞全面分析,WAF支援檢測防禦

再來看利用代碼,如圖:

Struts2 REST插件遠端執行指令漏洞全面分析,WAF支援檢測防禦

這裡用反射将java.lang.processbuilder().start()設定進入containsfilter對象裡,以待後面漏洞觸發時調用

Struts2 REST插件遠端執行指令漏洞全面分析,WAF支援檢測防禦

這裡用無參的constructor去newinstance對象,生成空對象,然後再用反射去填充對應屬性,實際上這裡就是對應xml中的每個dom屬性,根據代碼邏輯阿裡雲安全團隊觀察出,這裡層層封裝最終放到nativestring對象的value屬性裡,然後繼續跟蹤代碼

Struts2 REST插件遠端執行指令漏洞全面分析,WAF支援檢測防禦

最終将上面nativestring的對象放到了hashmap裡,

Struts2 REST插件遠端執行指令漏洞全面分析,WAF支援檢測防禦

最後對上面return的那個hashmap做toxml序列化,然後就有了今天公開的exploit。下面分析漏洞觸發流程,漏洞觸發就是fromxml重組對象的過程了,如圖:

Struts2 REST插件遠端執行指令漏洞全面分析,WAF支援檢測防禦

xstream反序列化的邏輯,實際上是解析xml dom重組對象的一個過程,如圖:

Struts2 REST插件遠端執行指令漏洞全面分析,WAF支援檢測防禦

當解析到jdk.nashorn.internal.objects.nativestring這個類的時候,漏洞觸發,先看下此時的調用棧,如圖:

Struts2 REST插件遠端執行指令漏洞全面分析,WAF支援檢測防禦

看到了熟悉的hashcode,這根groovy的反序列化利用類觸發邏輯類似。

因為exp代碼中我們最終将nativestring對象最終放到了hashmap裡然後對hashmap進行序列化,是以當反序列化重組對象的時候,肯定會觸發hashcode邏輯。繼續跟蹤,這裡nativestring和base64data都屬于java未公開的代碼,官方未提供源碼,不過可以參考openjdk的源碼,先看nativestring,如圖:

Struts2 REST插件遠端執行指令漏洞全面分析,WAF支援檢測防禦

這裡value是前面封裝的base64data的對象,後面進入base64data的邏輯,如圖:

Struts2 REST插件遠端執行指令漏洞全面分析,WAF支援檢測防禦

這裡對應依次解析xml中的datahandler、xmldatasource的對象,從中取出cipherinputstream的對象,同理依次解析,最終在重組javax.imageio.spi.filteriterator對象的時候觸發漏洞,這裡看一下利用代碼,如圖:

Struts2 REST插件遠端執行指令漏洞全面分析,WAF支援檢測防禦
Struts2 REST插件遠端執行指令漏洞全面分析,WAF支援檢測防禦

這裡cfcons.newinstance(processbuilder.class.getmethod("start"), "foo")被設定為filteriterator的filter,因為javax.imageio.spi.filteriterator類的next()會調用filteriterator$filter的filter()函數,而此時filteriterator$filter正是javax.imageio.imageio$containsfilter,在javax.imageio.imageio$containsfilter的filter()下斷,代碼如圖:

Struts2 REST插件遠端執行指令漏洞全面分析,WAF支援檢測防禦

這裡的method是正是processbuilder().start()方法,此時調用棧如圖:

Struts2 REST插件遠端執行指令漏洞全面分析,WAF支援檢測防禦

最終觸發成功,漏洞複現如下圖:

Struts2 REST插件遠端執行指令漏洞全面分析,WAF支援檢測防禦

分析總結

阿裡雲安全團隊回顧struts2 釋出的官方安全公告,發現struts2應該說是目前java web架構裡面存在安全問題最多的。

本次官方漏洞公告對外發出受影響版本為2.5.x全系,但在實際測試過程發現,2.3.x全系版本同樣存在此漏洞。

Struts2 REST插件遠端執行指令漏洞全面分析,WAF支援檢測防禦

作為安全運維人員和開發人員,我們需要做的就是快速擷取漏洞情報,快速響應和處置,把業務風險降到最低。

來源:阿裡雲安全

<a href="https://mp.weixin.qq.com/s/gxd2_i8jle4x2ud7ofvl7g">原文連結</a>