J'ai rien compris en lisant l'article en Français, donc si quelqu'un qui a le même cerveau que moi passe par ici, voilà plus de détails à partir du billet de Klink.
Où est le bug ?
Le bug est que java ne s'occupe pas des cr/lf lorsqu'il parse les urls de type:
ftp://foo:bar%0d%0aINJECTED%0d%0a@example.net/dir/file.png
Donc si on demande à java de se connecter à un serveur FTP en utilisant cette url, il va se connecter normalement sur le serveur FTP de example.net, utiliser 'foo' comme nom d'utilisateur, 'bar' comme mot de passe, mais en plus il va exécuter la commande 'INJECTED'.
Java gère mal les cr/lf à la fois dans le use/mdp mais aussi dans les noms de répertoires :
ftp://foo:bar@example.net/dir%0d%0aINJECTED%0d%0a
Python se contente de mal gérer les cr/lf uniquement au niveau des noms de répertoires.
Après, il se trouve que comme SMTP est proche de FTP, on peut utiliser la même url en ftp: pour faire exécuter des commandes sur un serveur SMTP.
Que vient faire le contournement de firewall dans l'histoire ?
Alors là c'est bien tordu...
En gros en FTP, deux connections sont utilisées, une de contrôle avec le port 21 côté serveur, et une autre pour les données, donc avec des ports différents.
Et "bien sûr" les pare-feu sont fait pour supporter ça ! En gros ils lisent les commandes de la connexion de contrôle FTP pour savoir quelle port est choisi et autorisent le trafic sur ce port. Donc sous prétexte de nous simplifier le boulot (D'avoir à autoriser le port pour les données à la main), le pare-feu fait sauter automatiquement une restriction sur un port donné.
Pour exploiter les requêtes FTP vont ressembler à ça :
On ne demande plus de se connecter à un serveur FTP chez la victime.
evil.com est au contraire un serveur géré par l'attaquant.
La commande PORT demande normalement au serveur de se connecter (Pour la connection de données) à la machine client sur un port donné.
Le pirate doit y mettre l'IP (Interne, gare au NAT) de la victime et un numéro de port au choix (Mais supérieur à 1024).
C'est cette commande que le pare feu va voir et il va donc autoriser les connections sur le port décrit (Par exemple 8080).
Le pirate peut alors se connecter au port 8080 de la machine victime (Qui peut par exemple être ouvert par une appli Java) depuis l'extérieur, magique.
La vulnérabilité peut également être exploitée pour faire du parsing de fichiers JNLP malveillants
Non en fait le JNLP est simplement un vecteur d'attaque proposé en alternative aux applets qui ne sont pas utilisables si les victimes "n'ont pas le plugin de navigateur Java activé". A priori il y aurait moyen de mettre les urls directement dans le fichier JNLP donc la victime n'a même pas besoin d'utiliser l'application Java correspondant au JNLP.
Un autre vecteur intéressant est les "XML eXternal Entities". Si on met correctement les urls ftp dans des fichiers xml et que le parseur xml en java est "mal" configuré (Ce qui est bien souvent le cas par défaut), le parseur va se connecter automatiquement en utilisant les requêtes FTP pour "résoudre les entitées externes".
Donc en gros une appli java dans un serveur web parsant des fichiers xml venant de l'extérieur est vulnérable (Dans le sens ou on peut lui faire faire des requêtes FTP, qui plus est avec des commandes additionnelles).
Partager