21 - Pentesting FTP
Last updated
Last updated
Groupe de sécurité Try Hard
Le protocole de transfert de fichiers (FTP) sert de protocole standard pour le transfert de fichiers sur un réseau informatique entre un serveur et un client.
C'est un protocole en texte clair qui utilise comme caractère de nouvelle ligne 0x0d 0x0a
donc parfois vous devez vous connecter en utilisant telnet
ou nc -C
.
Port par défaut: 21
En FTP Actif, le client FTP initie d'abord la connexion de contrôle depuis son port N vers le port de commande du serveur FTP - port 21. Le client écoute ensuite sur le port N+1 et envoie le port N+1 au serveur FTP. Le serveur FTP initie ensuite la connexion de données, depuis son port M vers le port N+1 du client FTP.
Cependant, si le client FTP a un pare-feu qui contrôle les connexions de données entrantes de l'extérieur, le FTP actif peut poser problème. Une solution possible est le FTP passif.
En FTP Passif, le client initie la connexion de contrôle depuis son port N vers le port 21 du serveur FTP. Ensuite, le client envoie une commande passv. Le serveur envoie alors au client l'un de ses numéros de port M. Et le client initie la connexion de données depuis son port P vers le port M du serveur FTP.
Source: https://www.thesecuritybuddy.com/vulnerabilities/what-is-ftp-bounce-attack/
Les commandes debug
et trace
de FTP peuvent être utilisées pour voir comment se déroule la communication.
Avec nmap
Vous pouvez utiliser les commandes HELP
et FEAT
pour obtenir des informations sur le serveur FTP :
anonymous : anonymous anonymous : ftp : ftp
Ici, vous pouvez trouver une belle liste avec les identifiants FTP par défaut : https://github.com/danielmiessler/SecLists/blob/master/Passwords/Default-Credentials/ftp-betterdefaultpasslist.txt
Les vérifications FTP de connexion anonyme et de rebond sont effectuées par défaut par nmap avec l'option -sC ou :
Vous pouvez vous connecter à un serveur FTP en utilisant un navigateur (comme Firefox) en utilisant une URL comme suit :
Notez que si une application web envoie des données contrôlées par un utilisateur directement à un serveur FTP, vous pouvez envoyer des octets d'encodage d'URL double %0d%0a
(dans un encodage d'URL double, c'est %250d%250a
) et faire en sorte que le serveur FTP effectue des actions arbitraires. L'une de ces actions arbitraires possibles est de télécharger du contenu à partir d'un serveur contrôlé par un utilisateur, d'effectuer un balayage de ports ou d'essayer de communiquer avec d'autres services basés sur du texte en clair (comme http).
Si votre nom d'utilisateur/mot de passe contient des caractères spéciaux, la commande suivante peut être utilisée :
USER nom_utilisateur
PASS mot_de_passe
HELP
Le serveur indique quelles commandes sont supportées
**PORT 127,0,0,1,0,80
** Cela indiquera au serveur FTP d'établir une connexion avec l'IP 127.0.0.1 sur le port 80 (vous devez mettre le 5e caractère comme "0" et le 6e comme le port en décimal ou utiliser le 5e et 6e pour exprimer le port en hexadécimal).
**EPRT |2|127.0.0.1|80|
** Cela indiquera au serveur FTP d'établir une connexion TCP (indiqué par "2") avec l'IP 127.0.0.1 sur le port 80. Cette commande prend en charge IPv6.
LIST
Cela enverra la liste des fichiers dans le dossier actuel
LIST -R
Liste de manière récursive (si autorisé par le serveur)
APPE /chemin/quelquechose.txt
Cela indiquera au FTP de stocker les données reçues d'une connexion passive ou d'une connexion PORT/EPRT dans un fichier. Si le nom de fichier existe, il ajoutera les données.
STOR /chemin/quelquechose.txt
Comme APPE
mais écrasera les fichiers
STOU /chemin/quelquechose.txt
Comme APPE
, mais ne fera rien s'il existe déjà.
RETR /chemin/vers/fichier
Une connexion passive ou de port doit être établie. Ensuite, le serveur FTP enverra le fichier indiqué via cette connexion
REST 6
Cela indiquera au serveur que la prochaine fois qu'il enverra quelque chose en utilisant RETR
, il doit commencer au 6e octet.
TYPE i
Définit le transfert en binaire
PASV
Cela ouvrira une connexion passive et indiquera à l'utilisateur où se connecter
PUT /tmp/fichier.txt
Télécharge le fichier indiqué vers le FTP
Certains serveurs FTP autorisent la commande PORT. Cette commande peut être utilisée pour indiquer au serveur que vous souhaitez vous connecter à un autre serveur FTP sur un certain port. Ensuite, vous pouvez l'utiliser pour scanner les ports ouverts d'un hôte via un serveur FTP.
Apprenez ici comment abuser d'un serveur FTP pour scanner des ports.
Vous pourriez également abuser de ce comportement pour faire interagir un serveur FTP avec d'autres protocoles. Vous pourriez télécharger un fichier contenant une requête HTTP et faire en sorte que le serveur FTP vulnérable l'envoie à un serveur HTTP arbitraire (peut-être pour ajouter un nouvel utilisateur admin?) ou même télécharger une requête FTP et faire en sorte que le serveur FTP vulnérable télécharge un fichier pour un autre serveur FTP. La théorie est simple :
Téléchargez la requête (à l'intérieur d'un fichier texte) sur le serveur vulnérable. N'oubliez pas que si vous voulez communiquer avec un autre serveur HTTP ou FTP, vous devez changer les lignes avec 0x0d 0x0a
Utilisez REST X
pour éviter d'envoyer les caractères que vous ne voulez pas envoyer (peut-être pour télécharger la requête à l'intérieur du fichier, vous avez dû ajouter un en-tête d'image au début)
Utilisez PORT
pour vous connecter au serveur et au service arbitraires
Utilisez RETR
pour envoyer la requête enregistrée au serveur.
Il est très probable que cela génère une erreur comme Socket non inscriptible car la connexion ne dure pas assez longtemps pour envoyer les données avec RETR
. Des suggestions pour essayer d'éviter cela sont :
Si vous envoyez une requête HTTP, mettez la même requête l'une après l'autre jusqu'à ~0,5 Mo au moins. Comme ceci :
Essayez de remplir la requête avec des données "junk" relatives au protocole (en parlant à FTP peut-être juste des commandes junk ou répéter l'instruction RETR
pour obtenir le fichier)
Remplissez simplement la requête avec beaucoup de caractères nuls ou autres (divisés en lignes ou non)
Quoi qu'il en soit, voici un ancien exemple sur la façon d'abuser de cela pour faire en sorte qu'un serveur FTP télécharge un fichier depuis un autre serveur FTP.
FileZilla se lie généralement à un service administratif local pour le serveur FileZilla (port 14147). Si vous pouvez créer un tunnel depuis votre machine pour accéder à ce port, vous pouvez vous y connecter en utilisant un mot de passe vide et créer un nouvel utilisateur pour le service FTP.
La configuration par défaut de vsFTPd peut être trouvée dans /etc/vsftpd.conf
. Ici, vous pourriez trouver des paramètres dangereux :
anonymous_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_root=/home/username/ftp
- Répertoire pour les utilisateurs anonymes.
chown_uploads=YES
- Changer la propriété des fichiers téléchargés de manière anonyme
chown_username=username
- Utilisateur à qui la propriété des fichiers téléchargés de manière anonyme est attribuée
local_enable=YES
- Autoriser les utilisateurs locaux à se connecter
no_anon_password=YES
- Ne pas demander de mot de passe aux utilisateurs anonymes
write_enable=YES
- Autoriser les commandes : STOR, DELE, RNFR, RNTO, MKD, RMD, APPE et SITE
ftp
port:21
Try Hard Security Group