# 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)**.