# 21 - Pentesting FTP
☁️ 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 [**La famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFT**](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 au [repo hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
Trouvez les vulnérabilités les plus importantes afin de pouvoir les corriger plus rapidement. Intruder suit votre surface d'attaque, effectue des analyses de menace proactives, trouve des problèmes dans l'ensemble de votre pile technologique, des API aux applications web et aux systèmes cloud. [**Essayez-le gratuitement**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks) dès aujourd'hui. {% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %} *** ## Informations de base Le **File Transfer Protocol (FTP)** est un protocole réseau standard utilisé pour le transfert de fichiers informatiques entre un client et un serveur sur un réseau informatique.\ 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 ``` PORT STATE SERVICE 21/tcp open ftp ``` ### Connexions actives et passives Dans le **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 configuré pour contrôler les connexions de données entrantes depuis l'extérieur, le FTP actif peut poser problème. Une solution possible est le FTP passif. Dans le **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/](https://www.thesecuritybuddy.com/vulnerabilities/what-is-ftp-bounce-attack/) ### Débogage de la connexion Les commandes **`debug`** et **`trace`** du FTP peuvent être utilisées pour voir **comment se déroule la communication**. ## Énumération ### Capture de bannière ```bash nc -vn 21 openssl s_client -connect crossfit.htb:21 -starttls ftp #Get certificate if any ``` ### Se connecter à FTP en utilisant starttls Lors de l'audit de sécurité d'un serveur FTP, il peut être nécessaire de se connecter au serveur en utilisant le protocole STARTTLS pour sécuriser la communication. Voici comment se connecter à un serveur FTP en utilisant STARTTLS : 1. Ouvrez un terminal et utilisez la commande suivante pour vous connecter au serveur FTP : ```bash ftp ``` 2. Une fois connecté, utilisez la commande suivante pour activer le protocole STARTTLS : ```bash quote AUTH TLS ``` 3. Ensuite, utilisez la commande suivante pour vous authentifier en tant qu'utilisateur : ```bash user ``` 4. Entrez le mot de passe de l'utilisateur lorsque vous y êtes invité. 5. Enfin, utilisez la commande suivante pour activer le mode passif : ```bash passive ``` Vous êtes maintenant connecté au serveur FTP en utilisant STARTTLS. Vous pouvez exécuter des commandes FTP normales pour interagir avec le serveur, telles que `ls`, `get`, `put`, etc. Assurez-vous de prendre toutes les précautions nécessaires lors de l'audit de sécurité d'un serveur FTP et de respecter les lois et réglementations en vigueur. ``` lftp lftp :~> set ftp:ssl-force true lftp :~> set ssl:verify-certificate no lftp :~> connect 10.10.10.208 lftp 10.10.10.208:~> login Usage: login [] lftp 10.10.10.208:~> login username Password ``` ### Enumération non autorisée Avec **nmap** ```bash sudo nmap -sV -p21 -sC -A 10.10.10.10 ``` Vous pouvez utiliser les commandes `HELP` et `FEAT` pour obtenir des informations sur le serveur FTP : ``` HELP 214-The following commands are recognized (* =>'s unimplemented): 214-CWD XCWD CDUP XCUP SMNT* QUIT PORT PASV 214-EPRT EPSV ALLO* RNFR RNTO DELE MDTM RMD 214-XRMD MKD XMKD PWD XPWD SIZE SYST HELP 214-NOOP FEAT OPTS AUTH CCC* CONF* ENC* MIC* 214-PBSZ PROT TYPE STRU MODE RETR STOR STOU 214-APPE REST ABOR USER PASS ACCT* REIN* LIST 214-NLST STAT SITE MLSD MLST 214 Direct comments to root@drei.work FEAT 211-Features: PROT CCC PBSZ AUTH TLS MFF modify;UNIX.group;UNIX.mode; REST STREAM MLST modify*;perm*;size*;type*;unique*;UNIX.group*;UNIX.mode*;UNIX.owner*; UTF8 EPRT EPSV LANG en-US MDTM SSCN TVFS MFMT SIZE 211 End STAT #Info about the FTP server (version, configs, status...) ``` ### Connexion anonyme _anonymous : anonymous_\ _anonymous :_\ _ftp : ftp_ ```bash ftp >anonymous >anonymous >ls -a # List all files (even hidden) (yes, they could be hidden) >binary #Set transmission to binary instead of ascii >ascii #Set transmission to ascii instead of binary >bye #exit ``` ### [Brute force](../../generic-methodologies-and-resources/brute-force.md#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](https://github.com/danielmiessler/SecLists/blob/master/Passwords/Default-Credentials/ftp-betterdefaultpasslist.txt) ### Automatisé Les vérifications de connexion anonyme et de rebond FTP sont effectuées par défaut par nmap avec l'option **-sC** ou : ```bash nmap --script ftp-* -p 21 ``` ## Connexion via navigateur Vous pouvez vous connecter à un serveur FTP à l'aide d'un navigateur (comme Firefox) en utilisant une URL comme : ```bash ftp://anonymous:anonymous@10.10.10.98 ``` 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 doublement encodés en URL `%0d%0a` (en double encodage URL, cela devient `%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 une analyse de port ou d'essayer de communiquer avec d'autres services basés sur du texte en clair (comme http). ## Télécharger tous les fichiers depuis FTP ```bash wget -m ftp://anonymous:anonymous@10.10.10.98 #Donwload all wget -m --no-passive ftp://anonymous:anonymous@10.10.10.98 #Download all ``` ## Quelques commandes FTP * **`USER nom_utilisateur`** * **`PASS mot_de_passe`** * **`HELP`** Le serveur indique quelles commandes sont prises en charge * **`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 en "0" et le 6e en port décimal ou utiliser le 5e et le 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ée 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 courant * **`LIST -R`** Liste récursivement (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 il écrasera les fichiers * **`STOU /chemin/quelquechose.txt`** Comme `APPE`, mais s'il existe, il ne fera rien. * **`RETR /chemin/vers/fichier`** Une connexion passive ou une connexion 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éfinir le transfert en binaire * **`PASV`** Cela ouvrira une connexion passive et indiquera à l'utilisateur où il peut se connecter * **`PUT /tmp/fichier.txt`** Télécharger le fichier indiqué vers le FTP ![](<../../.gitbook/assets/image (227).png>) ## Attaque FTPBounce 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 les ports.**](ftp-bounce-attack.md) Vous pouvez également abuser de ce comportement pour faire interagir un serveur FTP avec d'autres protocoles. Vous pouvez **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 administrateur ?_) 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 : 1. **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 modifier les lignes avec `0x0d 0x0a` 2. **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) 3. **Utilisez `PORT` pour vous connecter au serveur et au service arbitraires** 4. **Utilisez `RETR` pour envoyer la requête enregistrée au serveur.** Il est très probable que cela **génère une erreur telle que** _**Socket non inscriptible**_ **parce que la connexion ne dure pas suffisamment longtemps pour envoyer les données avec `RETR`**. Voici quelques suggestions pour essayer d'éviter cela : * Si vous envoyez une requête HTTP, **mettez la même requête l'une après l'autre** jusqu'à environ **0,5 Mo** au moins. Comme ceci : {% file src="../../.gitbook/assets/posts (1).txt" %} posts.txt {% endfile %} * 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 à partir d'un autre serveur FTP.](ftp-bounce-download-2oftp-file.md) ## Vulnérabilité du serveur Filezilla **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 **connecter** à **celui-ci** en utilisant un **mot de passe vide** et **créer** un **nouvel utilisateur** pour le service FTP. ## Fichiers de configuration ``` ftpusers ftp.conf proftpd.conf vsftpd.conf ``` ### Post-Exploitation La configuration par défaut de vsFTPd peut être trouvée dans `/etc/vsftpd.conf`. Ici, vous pouvez trouver certains 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 ### Shodan * `ftp` * `port:21`
Trouvez les vulnérabilités les plus importantes afin de pouvoir les corriger plus rapidement. Intruder suit votre surface d'attaque, effectue des analyses de menace proactives et trouve des problèmes dans l'ensemble de votre pile technologique, des API aux applications web et aux systèmes cloud. [**Essayez-le gratuitement**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks) dès aujourd'hui. {% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %} *** ## Commandes automatiques HackTricks ``` Protocol_Name: FTP #Protocol Abbreviation if there is one. Port_Number: 21 #Comma separated if there is more than one. Protocol_Description: File Transfer Protocol #Protocol Abbreviation Spelled out Entry_1: Name: Notes Description: Notes for FTP Note: | Anonymous Login -bi <<< so that your put is done via binary wget --mirror 'ftp://ftp_user:UTDRSCH53c"$6hys@10.10.10.59' ^^to download all dirs and files wget --no-passive-ftp --mirror 'ftp://anonymous:anonymous@10.10.10.98' if PASV transfer is disabled https://book.hacktricks.xyz/pentesting/pentesting-ftp Entry_2: Name: Banner Grab Description: Grab FTP Banner via telnet Command: telnet -n {IP} 21 Entry_3: Name: Cert Grab Description: Grab FTP Certificate if existing Command: openssl s_client -connect {IP}:21 -starttls ftp Entry_4: Name: nmap ftp Description: Anon login and bounce FTP checks are performed Command: nmap --script ftp-* -p 21 {IP} Entry_5: Name: Browser Connection Description: Connect with Browser Note: ftp://anonymous:anonymous@{IP} Entry_6: Name: Hydra Brute Force Description: Need Username Command: hydra -t 1 -l {Username} -P {Big_Passwordlist} -vV {IP} ftp Entry_7: Name: consolesless mfs enumeration ftp Description: FTP enumeration without the need to run msfconsole Note: sourced from https://github.com/carlospolop/legion Command: msfconsole -q -x 'use auxiliary/scanner/ftp/anonymous; set RHOSTS {IP}; set RPORT 21; run; exit' && msfconsole -q -x 'use auxiliary/scanner/ftp/ftp_version; set RHOSTS {IP}; set RPORT 21; run; exit' && msfconsole -q -x 'use auxiliary/scanner/ftp/bison_ftp_traversal; set RHOSTS {IP}; set RPORT 21; run; exit' && msfconsole -q -x 'use auxiliary/scanner/ftp/colorado_ftp_traversal; set RHOSTS {IP}; set RPORT 21; run; exit' && msfconsole -q -x 'use auxiliary/scanner/ftp/titanftp_xcrc_traversal; set RHOSTS {IP}; set RPORT 21; run; exit' ```
☁️ 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 [**La famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFT**](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 au [repo hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.