# 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 [**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 au [repo hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
## 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 qui contrôle 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. Après cela, 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 ### Récupération de la 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 ``` 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 de mots de passe 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 FTP de connexion anonyme et de rebond sont effectuées par défaut par nmap avec l'option **-sC** ou : ```bash nmap --script ftp-* -p 21 ``` ## Connexion du navigateur Vous pouvez vous connecter à un serveur FTP en utilisant 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 les commandes 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 5ème caractère en "0" et le 6ème en port décimal ou utiliser le 5ème et le 6ème 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 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 6ème 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é sur 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 utiliser cela pour scanner les ports d'un hôte via un serveur FTP. [**Apprenez ici comment abuser d'un serveur FTP pour scanner des ports.**](ftp-bounce-attack.md) 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 facile: 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 parler à un autre serveur HTTP ou FTP, vous devez changer 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 besoin de mettre 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 **lance une erreur comme** _**Socket not writable**_ **parce que la connexion ne dure pas assez longtemps pour envoyer les données avec `RETR`**. Les 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: {% 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 en répétant 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 télécharger un fichier à un serveur FTP à 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** 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 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 anonymement * `chown_username=username` - Utilisateur qui reçoit la propriété des fichiers téléchargés anonymement * `local_enable=YES` - Autoriser les utilisateurs locaux à se connecter * `no_anon_password=YES` - Ne pas demander de mot de passe anonyme * `write_enable=YES` - Autoriser les commandes: STOR, DELE, RNFR, RNTO, MKD, RMD, APPE et SITE ### Shodan * `ftp` * `port:21` ## 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 [**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)**.