Archives Wild Code School
Cybersecurity

[Séc. Web] [Divers] Spécificités technologiques

Quête 10 sur 13

image

Introduction

Dans cette quête, nous verrons comment s'authentifier auprès d'un serveur FTP via le langage PHP en utilisant des fonctions natifs de PHP notamment ftp_login();, ftp_connect(); etc.. Je vais te montrer comment configurer un serveur FTP sur Linux simplement et rapidement.

  • File Transfer Protocol, ou FTP, est un protocole de communication destiné au partage de fichiers sur un réseau TCP/IP. Il permet, depuis un ordinateur, de copier des fichiers vers un autre ordinateur du réseau, ou encore de supprimer ou de modifier des fichiers sur cet ordinateur.

🤓 Objectifs

✅ Comprendre à quoi sert le protocole FTP (File Transfer Protocol). ✅ Installer et configurer un serveur FTP sur une machine Linux. ✅ Comprendre comment fonctionne un code PHP, et s'authentifier auprès d'un serveur FTP en PHP.

👉 Installation et configuration d'un serveur FTP

  • Nous installerons le paquet vsftpd pour créer notre serveur FTP. Installons vsftpd avec le gestionnaire de paquet apt-get. (Cela nécessite un accès root pour exécuter cette commande)
bash
root@ubuntu:/root# apt-get install vsftpd -y

Une fois que le serveur vsftpd a été installé. Il suffit maintenant de créer un nouveau dossier où nous stockerons nos fichiers, personnellement, je vais créer un nouveau dossier /srv/ftp.

bash
root@ubuntu:/root# mkdir /srv/ftp

Nous allons également créer un nouveau fichier avec une note dans ce dossier.

bash
root@ubuntu:/root# echo "Bienvenue dans le serveur FTP" > /srv/ftp/notes
root@ubuntu:/root# cat /srv/ftp/notes

Dans mon système, j'ai uniquement deux utilisateurs ex75 et root. Je vais donner les permissions à l'utilisateur ex75 à écrire dans le dossier /srv/ftp.

bash
root@ubuntu:/root# chown -R ex75 /srv/ftp

Nous allons maintenant démarrer notre service vsftpd.

bash
root@ubuntu:/root# service vsftpd start

Maintenant, je vais essayer de m'authentifier en tant que mon utilisateur actuel de mon système (ex75), mais il s'avère que ici, nous devons plusieurs problèmes notamment que le serveur FTP n'est pas chroot au dossier /srv/ftp. Je peux également interdire au serveur FTP des utilisateurs présents dans le système (mais je vais pas le faire dans ce cas).

bash
ftp localhost
Connected to localhost.
220 (vsFTPd 3.0.3)
Name (localhost:ex75): ex75
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
200 EPRT command successful. Consider using EPSV.
150 Here comes the directory listing.
drwxr-xr-x    2 1000     1000         4096 May 17 06:28 Desktop
drwxr-xr-x    2 1000     1000         4096 Apr 30 05:27 Documents
drwxr-xr-x    2 1000     1000         4096 May 13 07:40 Downloads
drwxr-xr-x    2 1000     1000         4096 Apr 30 05:27 Music
drwxr-xr-x    2 1000     1000         4096 May 25 03:51 Pictures
drwxr-xr-x    2 1000     1000         4096 Apr 30 05:27 Public
drwxr-xr-x    2 1000     1000         4096 Apr 30 05:27 Templates
drwxr-xr-x    2 1000     1000         4096 Apr 30 05:27 Videos
226 Directory send OK.
ftp> pwd
257 "/home/ex75" is the current directory
ftp>

Revenons à notre configuration, nous allons modifier notre fichier de configuration /etc/vsftpd.conf.

bash
local_enable=YES
allow_writeable_chroot=YES
write_enable=YES
chroot_local_user=YES

Nous ajouterons ces configurations pour permettent aux utilisateurs de se connecter automatiquement dans le dossier /srv/ftp avec le répertoire chrooté. Cela va nous permettre que les utilisateurs ne remontent pas les dossiers dans le système de fichier Linux. Et, nous avons également autoriser l'écriture de données dans le dossier /srv/ftp.

  • Il nous reste plus que à redémarrer le service vsftpd, et réessayer une authentification. Tout fonctionne parfaitement, lorsque je liste les fichiers dans le dossier courant, il me liste uniquement le fichier notes (le fichier que nous avons créer avant), et lorsque je regarde le chemin actuel du répertoire en utilisant la commande pwd, je suis bien chroot au répertoire /, cela veut dire que je peux plus remonter en haut, cela permet d'assurer la sécurité du système de fichier, il est important de le mettre.
bash
root@ubuntu:/root# service vsftpd restart
root@ubuntu:/root# ftp localhost
Connected to localhost.
220 (vsFTPd 3.0.3)
Name (localhost:ex75): ex75
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
200 EPRT command successful. Consider using EPSV.
150 Here comes the directory listing.
-rw-r--r--    1 0        0              30 May 26 02:38 notes
226 Directory send OK.
ftp> pwd
257 "/" is the current directory
ftp> 

👉 Authentification dans un serveur FTP via le langage PHP

  • Il ne sera pas nécessaire d'interpréter le code PHP directement depuis le navigateur, il y a également la possibilité d'utiliser directement le binaire php pour exécuter notre script PHP.

Donc, voici un script PHP qui permet de tester l'authentification auprès d'un serveur FTP via un script PHP.

php
<?php

$ftp_server = "127.0.0.1";
$ftp_user = "ex75";
$ftp_pass = "ex75";

$ftp_id = ftp_connect($ftp_server) or die("La connexion au serveur FTP est impossible."); 

if (@ftp_login($ftp_id, $ftp_user, $ftp_pass)) {
    echo "Tu es connecté en tant que $ftp_user@$ftp_server.\n";
} else {
    echo "L'authentification est impossible !\n";
}

ftp_close($ftp_id);
?>

Et si maintenant, j'exécute le script PHP depuis le Terminal. Cela fonctionne parfaitement.

bash
root@ubuntu:/root# php -f file.php 
Connecté en tant que ex75@127.0.0.1

Ceci n'est que le début, nous avons également l'opportunité de télécharger des fichiers avec des fonctions intéressantes, il y a également des fonctions qui permettent de voir le dossier courant du serveur FTP et j'en passe. Ci-dessous, ça regroupe toutes les fonctions pour communiquer avec un serveur FTP.

Fonction FTP Description
ftp_alloc Alloue de l'espace pour un téléchargement de fichier
ftp_append Ajoute le contenu d'un fichier à un autre fichier sur le serveur FTP
ftp_cdup Change de dossier et passe au dossier parent
ftp_chdir Modifie le dossier FTP courant
ftp_chmod Modifie les droits d'un fichier via FTP
ftp_close Ferme une connexion FTP
ftp_connect Ouvre une connexion FTP
ftp_delete Efface un fichier sur un serveur FTP
ftp_exec Exécute une commande sur un serveur FTP
ftp_fget Télécharge un fichier via FTP dans un fichier local
ftp_fput Téléverse un fichier sur un serveur FTP
ftp_get_option Lit différentes options pour la connexion FTP courante
ftp_get Télécharge un fichier depuis un serveur FTP
ftp_login Identification sur un serveur FTP
ftp_mdtm Retourne la date de dernière modification d'un fichier sur un serveur FTP
ftp_mkdir Crée un dossier sur un serveur FTP
ftp_mlsd Retourne la liste des fichiers d'un dossier donné
ftp_nb_continue Reprend le téléchargement d'un fichier (non bloquant)
ftp_nb_fget Lit un fichier sur un serveur FTP, et l'écrit dans un fichier (non bloquant)
ftp_nb_fput Écrit un fichier sur un serveur FTP, et le lit depuis un fichier (non bloquant)
ftp_nb_get Lit un fichier sur un serveur FTP, et l'écrit dans un fichier (non bloquant)
ftp_nb_put Envoie un fichier sur un serveur FTP (non-bloquant)
ftp_nlist Retourne la liste des fichiers d'un dossier
ftp_pasv Active ou désactive le mode passif
ftp_put Charge un fichier sur un serveur FTP
ftp_pwd Retourne le nom du dossier courant
ftp_quit Alias de ftp_close
ftp_raw Envoie une commande FTP brute
ftp_rawlist Fait une liste détaillée des fichiers d'un dossier
ftp_rename Renomme un fichier sur un serveur FTP
ftp_rmdir Efface un dossier FTP
ftp_set_option Modifie les options de la connexion FTP
ftp_site Exécute la commande SITE sur un serveur FTP
ftp_size Retourne la taille d'un fichier
ftp_ssl_connect Ouvre une connexion FTP sécurisée avec SSL
ftp_systype Retourne un identifiant de type de serveur FTP

Par exemple, je vais essayer de lister le dossier courant du serveur FTP en utilisant la fonction ftp_nlist();. Le deuxième argument de la fonction ftp_nlist(), signifie le répertoire, personnellement, j'ai mis le dossier courant (qui est .).

php
<?php

$ftp_server = "127.0.0.1";
$ftp_user = "ex75";
$ftp_pass = "ex75";

$ftp_id = ftp_connect($ftp_server) or die("La connexion au serveur FTP est impossible."); 
$login_result = ftp_login($ftp_id, $ftp_user, $ftp_pass);

$contents = ftp_nlist($ftp_id, ".");
var_dump($contents);

?>

Et maintenant, l'exécution nous montre que le fichier notes est bien présent dans notre serveur FTP.

php
root@ubuntu:/root# php -f file.php
array(1) {
  [0]=>
  string(5) "notes"
}

Je t'invite à voir la documentation complète des fonctions PHP vis à vis du protocole FTP. Cela explique en détail le fonctionnement des fonctions, et de mieux maîtriser les fonctions si tu souhaites communiquer avec un serveur FTP.

↗
Functions PHP for FTP
php.net

☝️ Résumé

  • FTP (File Transfer Protocol) est un protocole utilisé sur un réseau pour envoyer ou télécharger des fichiers.
  • Il est tout à fait possible de communiquer avec un serveur FTP via un langage de programmation notamment par exemple avec le langage PHP.