FTP (File Transfer Protocol)

🌐 Introduction

Le FTP (File Transfer Protocol) est l'un des protocoles les plus anciens d'Internet, permettant le transfert de fichiers entre un client et un serveur. Il fonctionne sur la couche application du modèle TCP/IP, aux côtés de HTTP ou POP. Son fonctionnement repose sur deux canaux :

  • 🔌 Port 21 (canal de commande) : où le client envoie des instructions et reçoit des réponses.

  • 🔊 Port 20 (canal de données) : utilisé exclusivement pour le transfert de fichiers.

🔑 Modes Actif ⚪ et Passif 🔷

  • Actif : Le client informe le serveur sur quel port il peut envoyer la réponse. Problème : les pare-feux bloquent souvent ces connexions entrantes.

  • Passif : Le serveur fournit un port au client pour l'échange de données. Adapté aux environnements protégés.

✅ Authentification & Anonymat

Par défaut, FTP exige des identifiants. Cependant, certains serveurs offrent un accès anonyme (✉️ anonymous) permettant de télécharger (et parfois uploader) sans mot de passe. ❌ Attention : FTP transmet les données en clair, ce qui le rend vulnérable au sniffing.


📂 TFTP : Une version allégée de FTP

Le TFTP (Trivial FTP) est une version simplifiée du FTP :

  • ⚡ Utilise UDP (et non TCP).

  • ❌ Pas d'authentification.

  • 🏡 Ne fonctionne que sur des réseaux locaux sûris.

  • ❎ Pas de navigation dans les répertoires.

Commandes utiles :

  • connect, get, put, quit, status, verbose


🔧 Configuration de vsFTPd

Sur Linux, le serveur vsFTPd est l'un des plus répandus. On peut l'installer avec :

sudo apt install vsftpd

Quelques options clés du fichier /etc/vsftpd.conf :

Option
Description

anonymous_enable=NO

Désactiver l'accès anonyme

local_enable=YES

Autoriser les utilisateurs locaux

write_enable=YES

Autoriser les écritures

chroot_local_user=YES

Isoler les utilisateurs dans leur HOME

hide_ids=YES

Masquer les UID/GID des fichiers

Fichier à surveiller ✉️ : /etc/ftpusers (liste noire d'utilisateurs).


🚀 Exploitation d'un serveur FTP

👤 Connexion anonyme

ftp <IP_CIBLE>
Name: anonymous
Password: (vide ou email)

📂 Listing des fichiers

ftp> ls
ftp> ls -R   # Liste récursive

📄 Téléchargement de fichiers

ftp> get fichier.txt

↑ Upload de fichiers

touch fichier.txt
ftp> put fichier.txt

🚕 Téléchargement massif

wget -m --no-passive ftp://anonymous:anonymous@<IP_CIBLE>

🤖 Scan & Footprinting

🔮 Nmap avec scripts NSE

sudo nmap -sV -sC -A -p21 <IP_CIBLE>

Scripts utiles :

  • ftp-anon.nse : détecte l'accès anonyme

  • ftp-syst.nse : récupère les infos du serveur

  • ftp-vsftpd-backdoor.nse : cherche une backdoor présente dans certaines versions

Pour voir les paquets envoyés :

sudo nmap -sV -sC -A -p21 <IP_CIBLE> --script-trace

🧰 Bonus : TLS & Interactions manuelles

🛡️ Connexion SSL avec OpenSSL

openssl s_client -connect <IP_CIBLE>:21 -starttls ftp

Cela permet de :

  • Vérifier le certificat SSL

  • Identifier l'organisation

  • Récupérer des métadonnées utiles

🔈 Interaction directe

nc -nv <IP_CIBLE> 21
# ou
telnet <IP_CIBLE> 21

✨ Conclusion

Le protocole FTP peut sembler ancien, mais il reste largement utilisé et souvent mal configuré. Sa simplicité en fait une porte d'entrée très utile lors de tests d'intrusion.


📚 Ressources utiles


Which version of the FTP server is running on the target system? Submit the entire banner as the answer.

Nous effectuons un scan de notre cible sur le port 21 afin d'obtenir la bannière associée :

$ nmap -sCV -p21 10.xx.xx.xx --disable-arp-ping -D RND:5
                                                       
Starting Nmap 7.93 ( https://nmap.org ) at 2025-06-19 11:31 CEST
Nmap scan report for 10.xx.xx.xx
Host is up (0.029s latency).

PORT   STATE SERVICE VERSION
21/tcp open  ftp
| fingerprint-strings: 
|   GenericLines: 
|     220 InFreight FTP v1.1
|     Invalid command: try being more creative
|_    Invalid command: try being more creative

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 65.87 seconds

La bannière associé à notre cible est InFreight FTP v1.1.


Enumerate the FTP server and find the flag.txt file. Submit the contents of it as the answer.

Nous effectuons un scan d'énumération du serveur FTP :

$ sudo nmap -sV -p21 -sC -A 10.xx.xx.xx 
Starting Nmap 7.93 ( https://nmap.org ) at 2025-06-19 11:48 CEST
Nmap scan report for 10.xx.xx.xx
Host is up (0.025s latency).

PORT   STATE SERVICE VERSION
21/tcp open  ftp
| ftp-anon: Anonymous FTP login allowed (FTP code 230)
|_-rw-r--r--   1 ftpuser  ftpuser        39 Nov  8  2021 flag.txt
| fingerprint-strings: 
|   GenericLines: 
|     220 InFreight FTP v1.1
Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port
Aggressive OS guesses: Linux 5.4 (95%), Linux 4.15 - 5.6 (94%), Linux 3.1 (94%), Linux 3.2 (94%), AXIS 210A or 211 Network Camera (Linux 2.6.17) (94%), Linux 5.0 (94%), Linux 5.0 - 5.3 (94%), Linux 5.0 - 5.4 (93%), Linux 5.3 - 5.4 (93%), Linux 2.6.32 (93%)

TRACEROUTE (using port 21/tcp)
HOP RTT      ADDRESS
1   25.26 ms 10.xx.xx.xx
2   25.26 ms 10.xx.xx.xx

Nmap done: 1 IP address (1 host up) scanned in 68.83 seconds

Nous observons ainsi la présence du fichier flag.txt dans le serveur FTP, maintenant, nous nous connectons à ce dernier en tant que anonymous et récupérons en local le fichier :

$ ftp anonymous@10.xx.xx.xx
Connected to 10.xx.xx.xx.
220 InFreight FTP v1.1
331 Anonymous login ok, send your complete email address as your password
Password: 
230 Anonymous access granted, restrictions apply
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
229 Entering Extended Passive Mode (|||31740|)
150 Opening ASCII mode data connection for file list
-rw-r--r--   1 ftpuser  ftpuser        39 Nov  8  2021 flag.txt
226 Transfer complete
ftp> get flag.txt
local: flag.txt remote: flag.txt
229 Entering Extended Passive Mode (|||6653|)
150 Opening BINARY mode data connection for flag.txt (39 bytes)
    39       84.07 KiB/s 
226 Transfer complete
39 bytes received in 00:00 (1.38 KiB/s)

Nous analysons donc le contenu en local du fichier flag.txt afin d'en récupérer le contenu :

$ cat flag.txt 
HTB{b7skjr4c76zhsds7fzhd4k3ujg7nhdjre}

Voici le flag remonté :

HTB{b7skjr4c76zhsds7fzhd4k3ujg7nhdjre}

Mis à jour