Attaquer un client FTP : obtenir plus que prévu avec MGET
4 avril 2018
0 minutes de lectureIntroduction
On entend souvent parler de vulnérabilités dans les clients HTTP, comme les navigateurs Web, généralement exploitées par du contenu Web malveillant : rien de nouveau jusque-là. Mais saviez-vous que les clients FTP eux-mêmes peuvent aussi présenter des vulnérabilités exploitables ? Des serveurs malveillants auxquels les clients se connectent peuvent les cibler.
Dans cet article, je vais vous présenter une vulnérabilité intéressante de traversée de répertoires que nous avons identifiée et signalée de manière responsable à plusieurs fournisseurs concernés en novembre 2017. Cette vulnérabilité peut toucher plusieurs applications et bibliothèques, et permettre à un serveur FTP malveillant de créer ou d’écraser des fichiers n’importe où dans le système de fichiers local. Comme vous le verrez dans les détails ci-dessous, cette vulnérabilité découle d’une absence de validation. Elle concerne non seulement les clients FTP, mais aussi de nombreuses autres applications et bibliothèques dans différents écosystèmes, notamment Java, npm et d’autres.
La vulnérabilité
D’accord, examinons le problème ! Nous voulons coder une fonction qui télécharge le contenu d’un dossier FTP distant vers un dossier local. Comme la plupart d’entre nous le savent déjà, le protocole FTP ne propose pas de commande de téléchargement de dossier, mais nous pouvons combiner plusieurs autres commandes pour atteindre notre objectif.
Nous pouvons :
Lister tous les fichiers du dossier distant (commandes FTP
LISTouNLST)Pour chaque fichier de la liste ci-dessus : télécharger le fichier et l’enregistrer dans un dossier local (commandes FTP
GETouMGET)
Voici à quoi pourrait ressembler un exemple de code Java effectuant cette opération avec la bibliothèque Apache commons-net :
Le code ci-dessus parcourt chaque fichier renvoyé par le serveur et le télécharge dans un dossier de destination local. Par exemple, si le premier fichier du dossier distant s’appelle passwd et que notre dossier de destination local est /var/data/sync/, le fichier sera téléchargé sous /var/data/sync/passwd.
Mais que se passe-t-il si le serveur FTP devient malveillant et, au lieu de répondre à la commande LIST avec passwd, renvoie ../../../../etc/passwd comme nom de fichier ? Le code ci-dessus placera alors le fichier dans /var/data/sync/../../../../etc/passwd, écrasant de fait /etc/passwd avec le fichier nouvellement téléchargé.
Vous pourriez dire que ../../../../etc/passwd n’est pas un nom de fichier valide, et c’est vrai. Mais la RFC ne dit pas qu’il ne l’est pas. En théorie, elle reste neutre vis-à-vis du système de fichiers et laisse au client comme au serveur le soin de déterminer eux-mêmes ce qui est valide. Par exemple, la réponse d’un serveur FTP Windows à une commande LIST pourrait ressembler à :
Tandis que celle d’un système Unix ressemble à :
Il existe en réalité de nombreux autres formats de systèmes de fichiers. Voici la liste de ceux pris en charge par la bibliothèque apache commons-net :
Le client FTP classique ne valide donc pas les noms de fichiers et les renvoie tels quels, laissant aux développeurs le soin de les valider. Inutile de dire que cette validation est souvent oubliée. Cela saute aux yeux quand on consulte des projets hébergés sur GitHub ou divers sites proposant des extraits de code et des exemples, comme StackOverflow et CodeJava.
Étude de cas : Apache HIVE
Apache Hive est un projet d’entrepôt de données reposant sur Apache Hadoop, qui permet de résumer, d’interroger et d’analyser des données. Hive propose une interface de type SQL pour interroger des données stockées dans diverses bases de données et divers systèmes de fichiers intégrés à Hadoop. Il permet notamment de copier des données depuis des serveurs FTP à l’aide de la commande COPY-FROM-FTP.
En examinant le code, nous voyons l’appel retrieveFileList().
Dans la fonction retrieveFileList, le nom de fichier renvoyé par le serveur est ajouté au nom du répertoire sans aucune validation (name = dir + name;). Le fichier est ajouté à une file d’attente pour être téléchargé ultérieurement.
Plus tard, dans le thread de téléchargement, le fichier est extrait de la file d’attente et téléchargé depuis le serveur.
Une attaque possible consiste à remplacer le fichier authorized_keys SSH de l’utilisateur root, afin de pouvoir se connecter ultérieurement en tant que root. Imaginons qu’une instance Apache Hive se connecte à notre serveur FTP pour télécharger chaque jour des données marchandes. Pour mener cette attaque, nous modifierions notre serveur FTP afin qu’il renvoie au client des noms de fichiers malveillants comportant des chemins traversant les répertoires. Par exemple, nous pourrions répondre à une commande LIST avec ../../../../../../../home/root/.ssh/authorized_keys.
Lorsque Hive exécute cette instruction (en supposant qu’il s’exécute en tant que root), le fichier SSH authorized_keys de root sera remplacé par un fichier connu de l’attaquant.
La vulnérabilité ci-dessus a été signalée de manière responsable à l’Apache Foundation. Voici la chronologie :
Date | Événement |
|---|---|
2/11/2017 | Vulnérabilité découverte par Snyk Security Research |
8/11/2017 | Liste des produits Apache concernés communiquée à la fondation. |
5/2/2018 | Apache nous a informés de son intention de publier une version corrigée d’ici la fin du mois de février. |
4/4/2018 | Publication de l’article. |
Les détails ont également été publiés dans la base de données CVE le 4/4/2018 pour le projet Apache Hive.CVE-2018-1315 : l’instruction « COPY FROM FTP » dans HPL/SQL peut écrire à n’importe quel emplacement si le serveur FTP est compromis :
Gravité : Modérée
Fournisseur : The Apache Software Foundation
Versions concernées : Hive 2.1.0 à 2.3.2
Description : Lorsqu’une instruction « COPY FROM FTP » est exécutée avec l’extension HPL/SQL de Hive, un serveur FTP compromis ou malveillant peut faire écrire le fichier à n’importe quel emplacement du cluster depuis lequel la commande est exécutée. En effet, le code du client FTP dans HPL/SQL ne vérifie pas l’emplacement de destination du code téléchargé. Cela ne concerne pas les utilisateurs hivecli et hiveserver2, car hplsql est un script en ligne de commande distinct qui doit être appelé différemment.
Mesures d’atténuation : Les utilisateurs de HPL/SQL avec Hive 2.1.0 à 2.3.2 doivent effectuer la mise à niveau vers la version 2.3.3. Il est également possible de désactiver HPL/SQL par d’autres moyens.
Résumé
Nous avons montré comment une vulnérabilité présente dans certains clients et bibliothèques FTP est due à l’absence de validation correcte des données provenant du serveur FTP. Des problèmes similaires ont déjà été observés. Par exemple, en 2002, Steve Christey, Principal Information Security Engineer chez MITRE, a découvert que le problème touchait plusieurs clients FTP, notamment le client FTP natif de Linux et wget.
Il est essentiel de valider les entrées, et pas seulement pour des raisons de sécurité. En tant que développeur, il est facile de penser à la façon dont une personne ordinaire pourrait utiliser nos API, mais il est tout aussi important de s’attendre aux entrées imprévues que pourraient envoyer des attaquants. Lorsque vous traitez des listes de répertoires provenant de serveurs FTP, veillez à les valider en bloquant les noms de fichiers qui commencent par / ou qui contiennent ...
Lancez-vous dans les compétitions Capture The Flag
Apprenez à résoudre des défis Capture The Flag en regardant à la demande notre atelier virtuel d’initiation.


