• Aucun résultat trouvé

Penchons-nous sur la composition d’un module auxiliaire dans un petit exemple amusant, absent du

référentiel Metasploit (car il n’appartient pas au pentest). Cet exemple démontre combien il est facile de se décharger d’une grande partie du programme sur le Framework, afin de mettre l’accent sur les spécificités d’un module.

Chris Gates a écrit un module auxiliaire pour le framework qui a donné l’impression à ses followers sur Twitter qu’il avait en quelque sorte inventé un dispositif qui lui permettait de voyager à la vitesse de la lumière. Cela en fait un excellent exemple de la réutilisation de code disponible dans Metasploit (vous pouvez accéder aux sources du script à http://carnal0wnage.googlecode.com/).

❶root@bt:/opt/framework3/msf3# cd module s/auxiliary/admin/ root@bt:/opt/framework3/msf3/modules/auxiliary/admin# wg e t http://carnal0wnage.googlecode.com/svn/trunk/msf3/modules/auxiliary/admin/random/foursquare.rb

Nous avons placé le module dans le répertoire des modules auxiliaires ❶ de sorte qu’il soit

disponible pour une utilisation par Metasploit. Mais avant de l’utiliser, nous allons regarder le script lui-même et le décomposer afin de voir exactement ce qu’il contient.

require ’msf/core’

❶ class Metasploit3 < Msf::Auxiliary

# Exploit mixins should be called first

❷ include Msf::Exploit::Remote::HttpClient include Msf::Auxiliary::Report

Le module commence par les deux premières lignes qui importent la classe auxiliaire ❶. Ensuite, il rend les fonctions du client HTTP disponibles pour une utilisation ❷ dans le script.

def initialize super(

’Name’ => ’Foursquare Location Poster’, ’Version => ’$Revision:$’,

’Description’ => ’F*ck with Foursquare, be anywhere you want to be by venue id’, ’Author’ => [’CG’],

’License’ => MSF_LICENSE, ’References’ =>

[

[ ’URL’, ’http://groups.google.com/group/foursquare-api’ ], [ ’URL’, ’http://www.mikekey.com/im-a-foursquare-cheater/’], ]

)

#todo pass in geocoords instead of venueid, create a venueid, other tom foolery register_options(

[

Opt::RHOST(’api.foursquare.com’),

OptString.new(’VENUEID’, [ true, ’foursquare venueid’, ’185675’]), #Louvre Paris France

OptString.new(’USERNAME’, [ true, ’foursquare username’, ’username’]), OptString.new(’PASSWORD’, [ true, ’foursquare password’, ’password’]),

], self.class) End

Dans la routine d’initialisation ❶ nous définissons une grande partie de l’information ❷ qui est retournée lors de l’émission de la commande info dans msfconsole. Nous pouvons voir où les diverses options sont définies ❸ et si elles sont nécessaires. Jusqu’à présent, toutes sont assez parlantes et leurs objectifs sont clairs. Cependant, nous n’avons encore vu aucune logique d’exécution réelle. La voici :

def run begin

user = datastore[’USERNAME’]

pass = datastore[’PASSWORD’]

venid = datastore[’VENUEID’]

user_pass = Rex::Text.encode_base64(user + ":" + pass) decode = Rex::Text.decode_base64(user_pass)

postrequest = "twitter=1\n" #add facebook=1 if you want facebook

print_status("Base64 Encoded User/Pass: #{user_pass}") #debug print_status("Base64 Decoded User/Pass: #{decode}") #debug res = send_request_cgi({

’uri’ => "/v1/checkin?vid=#{venid}", ’version’ => "1.1",

’method’ => ’POST’, ’data’ => postrequest, ’headers’ =>

{

’Authorization’ => "Basic #{user_pass}", ’Proxy-Connection’ => "Keep-Alive", }

}, 25)

Maintenant, nous arrivons à la logique même du script – ce qui arrive quand run est appelée à

l’intérieur du module. Au départ, les options proposées sont définies en tant que noms de variables locales ❶ avec la définition de différents autres objets. Un objet est alors créé par appel à la méthode

send_request_cgi ❷, importée dans le script à partir de ib/msf/core/exploit/http.rb et décrite comme remplissant les fonctionnalités suivantes : "Se connecte au serveur, crée une requête, envoie la demande, lit la réponse". Cette méthode accepte différents paramètres qui caractérisent l’appel au serveur réel, comme démontré ici.

print_status(«#{res}») # ça ressort la réponse entière. On pourrait

# probablement

# faire sans ça mais c’est sympa de voir ce

# qu’il se passe end

rescue ::Rex::ConnectionRefused, ::Rex::HostUnreachable, ::Rex::ConnectionTimeout rescue ::Timeout::Error, ::Errno::EPIPE =>e

puts e.message

end end

Une fois cet objet créé, les résultats sont imprimés ❶. Si quelque chose se passe mal, un traitement est prévu afin de capturer toutes les erreurs ❷ et de les signaler à l’utilisateur. Ce traitement est simple ; il s’agit simplement de fournir les différents paramètres aux fonctions existantes du framework. C’est un excellent exemple de la puissance du framework car il nous permet de nous concentrer

uniquement sur les informations nécessaires pour atteindre notre objectif. Il n’y a aucune raison de reproduire n’importe laquelle des fonctions standard telles que la gestion des erreurs, la gestion des connexions, etc.

Voyons ce module en action. Si vous ne vous souvenez pas du chemin complet vers le module dans la structure de répertoire Metasploit, lancez une recherche comme ceci.

❶ msf > se arc h foursquare

[*] Searching loaded modules for pattern ’foursquare’...

Auxiliary

=========

Name Rank Description

---- ----

---admin/foursquare normal Foursquare Location Poster

msf > use admin/foursquare

msf auxiliary(foursquare) > info

Name: Foursquare Location Poster Version: $Revision:$

License: Metasploit Framework License (BSD) Rank: Normal

Provided by:

CG cg@carnal0wnage.com

Basic options:

Name Current Setting Required Description ---- --- ---

---PASSWORD password yes foursquare password

Proxies no Use a proxy chain RHOST api.foursquare.comyes The target address

RPORT 80 yes The target port

USERNAME username yes foursquare username

VENUEID 185675 yes foursquare venueid

VHOST no HTTP server virtual host

Description:

F*ck with Foursquare, be anywhere you want to be by venue id

References:

http://groups.google.com/group/foursquare-api http://www.mikekey.com/im-a-foursquare-cheater/

Dans cet exemple, nous cherchons "Foursquare" ❶, lançons la commande use ❷ pour sélectionner le module auxiliaire et affichons les informations ❸ pour le module sélectionné. Nous devons

configurer quelques unes des options présentées ci-dessus.

msf auxiliary(foursquare) > se t VENUEID 2584421 VENUEID => 2584421

msf auxiliary(foursquare) > se t USERNAME msf@elwood.net USERNAME => metasploit

msf auxiliary(foursquare) > se t PASSWORD ilove m e tasploit PASSWORD => ilovemetasploit

msf auxiliary(foursquare) > run

[*] Base64 Encoded User/Pass: bXNmQGVsd29vZC5uZXQ6aWxvdmVtZXRhc3Bsb2l0 [*] Base64 Decoded User/Pass: msf@elwood.net:ilovemetasploit

[*] HTTP/1.1 200 OK

Content-Type: text/xml; charset=utf-8 Date: Sat, 08 May 2010 07:42:09 GMT Content-Length: 1400

Server: nginx/0.7.64 Connection: keep-alive

<?xml version="1.0" encoding="UTF-8"?>

<checkin><id>40299544</id><created>Sat, 08 May 10 07:42:09 +0000</created><message>OK!We’ve got you @ Washington DC Union Station.

This is your 1st checkin here!</message><venue><id>2584421</id><name>Washington DC Union Station</name><primarycategory><id>79283</id>

<fullpathname>Travel:Train Station</fullpathname><nodename>Train Station</nodename>

<iconurl>http://foursquare.com/img/categories/travel/trainstation.png</iconurl></primary category><address>Union Station</address>

<city>Washington</city><state>DC</state><geolat>38.89777986957695</geolat><geolong>-77.0060920715332</geolong></venue><mayor>

<type>nochange</type><checkins>4</checkins><user><id>685446</id><firstname>Ron</firstname>

<photo>http://playfoursquare.s3.amazonaws.com/userpix_thumbs/ELOW44QHXJFB4PWZ.jpg</photo><gender>male</gender></user><message>Ron is The Mayor of Washington DC Union Station.</message></mayor><badges><badge><id>1</id><name>Newbie</name>

<icon>http://foursquare.com/img/badge/newbie.png</icon><description>Congrats on your first check-in!</description></badge></badges><scoring>

<score><points>1</points><icon>http://foursquare.com/img/scoring/2.png</icon><message>First stop tonight❸</message></score><score>

<points>5</points><icon>http://foursquare.com/img/scoring/1.png</icon><message>First time @ Washington DC Union Station!</message></score>

</scoring></checkin>

Afin d’exécuter ce module avec succès, nous avons besoin d’identifiants d’accès à Foursquare pour réaliser notre enregistrement. Nous définissons d’abord le VenueID que l’on trouve en ligne avec un peu de recherche sur Google ❶, puis définissons nos identifiants Foursquare ❷ et exécutons le

module. Nous obtenons une réponse positive du service Foursquare confirmant notre identification et obtenons cinq points ❸.

Dans ce cas, nous avons soumis une demande de check-in à la gare "Union Station" à Washington DC, grâce au service Foursquare (voir Figure 9.1).

Fig ure 9.1

Réussite d’un check-in à l’Union Station.

Quand nous consultons le site Foursquare, notre succès est confirmé. Un module comme celui-ci démontre que Metasploit permet de mettre en œuvre presque tout ce que nous pouvons imaginer en termes de programmation.