French translation by Jerome Athias <jerome.athias[at]free.fr>

Utilisation du client de base de données d'opcodes (msfopcode)

La version 3.0 du Metasploit Framework inclu une interface en ligne de commande pour la base de données d'opcodes Metasploit (Metasploit Opcode Database). Il peut être utilisé à la place de l'interface web pour rechercher facilement des adresses d'opcodes portables. L'interface est fournie via la commande msfopcode qui se trouve dans le répertoire racine d'installation. Cette interface est simplement un front-end à l'interface de la classe Rex::Exploitation::OpcodeDb::Client qui interagit avec un protocole XML basé sur HTTP qui tourne sur le serveur web Metasploit.com.

L'interface elle-même fournit une interface simplifiée à certains des différents aspects de la base de données d'opcodes. En lançant la commande sans arguments, l'on obtient:

$ ./msfopcode

    Usage: msfopcode command 

SUPPORTED COMMANDS

   stats       Display database statistics (Affiche les statistiques sur la base de données)
   locales     Display supported locales (Affiche les lieux supportés)
   metatypes   Display supported opcode meta types (Ex: jmp reg) (Affiche les meta-types d'opcodes supportés)
   groups      Display supported opcode groups (Ex: esp => eip) (Affiche les groupes d'opcodes supportés)
   types       Display supported opcode types (Ex: jmp esp) (Affiche les types d'opcodes supportés)
   platforms   Display supported platforms (Affiche les plateformes supportées)
   modules     Display information about specific modules (Affiche les informations sur des modules particuliers)
   search      Search for opcodes given a set of criteria (Recherche des opcodes en fonction d'un ensemble de critères)

La commande stats permet d'afficher les statistiques courantes sur la base de données, comme le nombre d'opcodes et modules actuellement indexés par la base de données et la date de dernière mise à jour de la base de données.

$ ./msfopcode stats

Last Updated             : Sat Sep 03 01:32:00 CDT 2005
Number of Opcodes        : 12177419
Number of Opcode Types   : 320
Number of Platforms      : 14
Number of Architectures  : 1
Number of Modules        : 17683
Number of Module Segments: 71457
Number of Module Imports : 2065492
Number of Module Exports : 927637

La commande locales liste les lieux actuellement supportés par la base de données. Dans le futur, davantage de lieux seront indexés pour fournir une vision plus complète de la portabilité des opcodes.

$ ./msfopcode locales
English
French

La commande metatypes liste les meta-types d'opcodes actuellement supportés par la base de données. Un meta-type d'opcode est défini comme une catégorie générale d'opcodes basée sur l'action qu'ils réalisent, comme effectuer un saut vers un registre, effectuer un pop/pop/ret, etc. Le meta-type aide à catégoriser différents types d'opcodes spécifiques.

$ ./msfopcode metatypes
pop/pop/ret
jmp reg
call reg
jmp [reg + offset]
call [reg + offset]
popad/ret
popaw/ret
push reg/ret

La commande groups liste les groupes d'opcodes actuellement supportés par la base de données. La différence entre un "groupe d'opcodes" et un "meta-type d'opcodes" est qu'un groupe d'opcodes associe les opcodes en fonction de l'action spécifique qu'ils réalisent, comme transitionner le pointeur d'instruction à la valeur courante d'un registre spécifique, comme ESP.

$ ./msfopcode groups   
eax => eip
ebx => eip
ecx => eip
edx => eip
edi => eip
esi => eip
ebp => eip
esp => eip
[esp + 8] => eip
[reg + offset] => eip
[esp + 0x10] => eip
[esp + 0x20] => eip
[reg] => eip

La commande types liste tous les différents types d'opcodes spécifiques supportés par la base de données. Un type d'opcode est une instance d'un opcode spécifique ou des opcodes qui forment un bloc d'instruction logique, comme un jmp esp. Les types d'opcodes sont regroupés en utilisant les groupes d'opcodes et les meta-types.

$ ./msfopcode types
jmp esp
call esp
push esp, ret
jmp ebp
call ebp
push ebp, ret
jmp eax
...

La commande platforms liste les versions de systèmes d'exploitation actuellement supportés par la base de données. Actuellement, la base de données supporte les versions de Windows NT SP3 à 2003 SP1. La base de données ne tient pas compte des hotfixs. Les plateformes peuvent être optionnellement filtrées en spécifiant l'option -p. Par exemple, -p 2000 n'affichera que les versions de Windows 2000 supportées.

$ ./msfopcode platforms
Windows NT 4.0.3.0 SP3 (IA32)
Windows NT 4.0.4.0 SP4 (IA32)
Windows NT 4.0.5.0 SP5 (IA32)
Windows NT 4.0.6.0 SP6 (IA32)
Windows 2000 5.0.0.0 SP0 (IA32)
Windows 2000 5.0.1.0 SP1 (IA32)
Windows 2000 5.0.2.0 SP2 (IA32)
Windows 2000 5.0.3.0 SP3 (IA32)
Windows 2000 5.0.4.0 SP4 (IA32)
Windows XP 5.1.0.0 SP0 (IA32)
Windows XP 5.1.1.0 SP1 (IA32)
Windows XP 5.1.2.0 SP2 (IA32)
Windows 2003 Server 5.2.0.0 SP0 (IA32)
Windows 2003 Server 5.2.1.0 SP1 (IA32)

L'une des fonctionnalités majeures de la base de données d'opcodes est qu'elle indexe des informations détaillées sur les modules. Par exemple, la base de données contient actuellement des informations sur les imports, exports, segments et attributs de module spécifique pour tous les modules importés dans la base de données. Cela permet d'obtenir des références croisées sur plusieurs modules, ... La commande modules est utilisée pour extraire les informations sur les modules.

$ ./msfopcode modules -h

    Usage: msfopcode modules 

OPTIONS:

    -E        Include module export information	(Inclus les informations d'export des modules)
    -I        Include module import information (Inclus les informations d'import des modules)
    -S        Include module segment information (Inclus les informations de segment des modules)
    -d        Display detailed output (Affiche les informations détaillées)
    -h        Help banner (Affiche cette aide)
    -l   A comma separated list of locales to filter (Ex: English) (Liste de locales, séparée par des virgules, à filtrer)
    -m   A comma separated list of module names to filter (Ex: kernel32.dll,user32.dll) (Liste de noms de modules, séparée par des virgules, à filtrer)
    -p   A comma separated list of operating system names to filter (Ex: 2000,XP) (Liste de noms d'OS, séparée par des virgules, à filtrer)
    -x        Dump the raw XML response (Capture la réponse XML brute)

L'explication dans l'utilisation pour chaque option est assez explicite, mais l'idée de base est qu'il est possible de chercher des modules dans la base de données avec la possibilité de filtrer les résultats sur les noms de fichiers, locales et version de système d'exploitation. Pour les résultats retournés, les informations sur les imports, exports et segments des modules, et des informations détaillées peuvent être retournées. Par exemple, pour voir toutes les versions de kernel32.dll actuellement référencées dans la base de données, l'on peut utiliser la commande suivante:

$ ./msfopcode modules -m kernel32.dll

Matching Modules
================

    Name          Base Address  Size     Version           Timestamp                     Locale   
    ----          ------------  ----     -------           ---------                     ------   
    kernel32.dll  0x77e70000    790528   5.0.2191.1        Tue Dec 14 17:20:09 CST 1999  French   
    kernel32.dll  0x77e40000    1056768  5.2.3790.1830031  Thu Mar 24 20:30:42 CST 2005  English  
    kernel32.dll  0x77e40000    999424   5.2.3790.3        Tue Mar 25 03:42:44 CST 2003  English  
    kernel32.dll  0x77f00000    385024   4.0.0.0           Fri Apr 25 15:33:31 CDT 1997  English  
    kernel32.dll  0x77ef0000    421888   4.0.0.0           Mon Mar 29 18:10:58 CST 1999  English  
    kernel32.dll  0x77f00000    385024   4.0.0.0           Sun Feb 28 17:49:07 CST 1999  English  
    kernel32.dll  0x77f00000    385024   4.0.0.0           Tue Jul 20 18:19:59 CDT 1999  English  
    kernel32.dll  0x77e80000    745472   5.0.2191.1        Wed Dec 01 01:37:24 CST 1999  English  
    kernel32.dll  0x77e80000    741376   5.0.2195.1600     Fri Jun 09 21:03:14 CDT 2000  English  
    kernel32.dll  0x77e80000    741376   5.0.2195.2778     Fri May 04 17:34:08 CDT 2001  English  
    kernel32.dll  0x77e80000    745472   5.0.2195.5400     Tue Jul 23 03:13:13 CDT 2002  English  
    kernel32.dll  0x7c4e0000    757760   5.0.2195.6688     Thu Jun 19 22:43:40 CDT 2003  English  
    kernel32.dll  0x77e60000    937984   5.1.2600.0        Sat Aug 18 01:33:02 CDT 2001  English  
    kernel32.dll  0x77e60000    942080   5.1.2600.11061    Thu Aug 29 06:40:40 CDT 2002  English  
    kernel32.dll  0x7c800000    999424   5.1.2600.21802    Wed Aug 04 03:56:36 CDT 2004  English  

Si l'on souhaite obtenir uniquement les versions de kernel32.dll sur Windows XP anglais, il suffit d'ajouter des paramètres:

$ ./msfopcode modules -m kernel32.dll -p XP -l English

Matching Modules
================

    Name          Base Address  Size    Version         Timestamp                     Locale   
    ----          ------------  ----    -------         ---------                     ------   
    kernel32.dll  0x77e60000    937984  5.1.2600.0      Sat Aug 18 01:33:02 CDT 2001  English  
    kernel32.dll  0x77e60000    942080  5.1.2600.11061  Thu Aug 29 06:40:40 CDT 2002  English  
    kernel32.dll  0x7c800000    999424  5.1.2600.21802  Wed Aug 04 03:56:36 CDT 2004  English  

Pour afficher les informations détaillées sur les modules correspondants, l'on peut spécifier le paramètre -d:

$ ./msfopcode modules -m kernel32.dll -p XP -l English -d
.-============================================

  Name        : kernel32.dll
  Base Address: 0x77e60000
  Size        : 937984
  Version     : 5.1.2600.0
  Timestamp   : Sat Aug 18 01:33:02 CDT 2001
  Locale      : English
  Platforms   : 

    Windows XP 5.1.0.0 SP0 (IA32)

.-============================================

  Name        : kernel32.dll
  Base Address: 0x77e60000
  Size        : 942080
  Version     : 5.1.2600.11061
  Timestamp   : Thu Aug 29 06:40:40 CDT 2002
  Locale      : English
  Platforms   : 

    Windows XP 5.1.1.0 SP1 (IA32)

.-============================================

  Name        : kernel32.dll
  Base Address: 0x7c800000
  Size        : 999424
  Version     : 5.1.2600.21802
  Timestamp   : Wed Aug 04 03:56:36 CDT 2004
  Locale      : English
  Platforms   : 

    Windows XP 5.1.2.0 SP2 (IA32)

Le véritable objectif de la base de données d'opcodes, est la possibilité de pouvoir chercher des opcodes spécifiques parmi plusieurs versions de systèmes d'exploitation différents, en croisant les résultats, afin de déterminer la portabilité de l'adresse de retour. Pour cette raison, le script msfopcode fournit la commande search:

$ ./msfopcode search -h

    Usage: msfopcode search 

OPTIONS:
    
    -M   A comma separated list of opcode meta types to filter (Ex: jmp reg) (Liste de meta-types, séparée par des virgules, à filtrer)
    -P        Results must span more than one operating system version (Les résultats doivent correspondre à plus d'une version de système d'exploitation)
    -a   A comma separated list of addresses to filter (Ex: 0x41424344) (Liste d'adresses, séparée par des virgules, à filtrer)
    -g   A comma separated list of opcode groups to filter (Ex: esp => eip) (Liste de groupes d'opcodes, séparée par des virgules, à filtrer)
    -h        Help banner (Affiche cette aide)
    -l   A comma separated list of locales to filter (Ex: English) (Liste de locales, séparée par des virgules, à filtrer)
    -m   A comma separated list of module names to filter (Ex: kernel32.dll,user32.dll) (Liste de noms de modules, séparée par des virgules, à filtrer)
    -p   A comma separated list of operating system names to filter (Ex: 2000,XP) (Liste de noms de systèmes d'exploitation, séparée par des virgules, à filtrer)
    -t   A semi-colon separated list of opcode types to filter (Ex: jmp esp,call esp) (Liste de types d'opcodes, séparée par des points-virgule, à filtrer)
    -x        Dump the raw XML response (Capture la réponse XML brute)

A l'instar de la commande modules, la commande search fournit une manière de limiter les résultats. Dans ce cas, les résultats peuvent être filtrés sur le meta-type, groupe, type, OS, module, locale et même adresses. Cela permet d'obtenir très finement les résultats souhaités. De plus, l'on peut demander au serveur de ne retourner uniquement les résultats qui sont portables en utilisant l'option -P. (Il demeure quelques problèmes avec cette option actuellement.)

Pour chercher toutes les occurrences d'un groupe d'opcodes ecx => eip dans ws2help.dll sur Windows 2000 et XP, l'on peut utiliser la commande:

$ ./msfopcode search -p 2000,XP -m ws2help.dll -g "ecx => eip"

Opcodes
=======

    Address     Type           OS                                             
    -------     ----           --                                             
    0x74fa3112  call ecx       Windows 2000 5.0.0.0 SP0 (IA32) (ws2help.dll)  
                               Windows 2000 5.0.1.0 SP1 (IA32) (ws2help.dll)  
                               Windows 2000 5.0.2.0 SP2 (IA32) (ws2help.dll)  
                               Windows 2000 5.0.4.0 SP4 (IA32) (ws2help.dll)  
    0x71aa1224  push ecx, ret  Windows XP 5.1.0.0 SP0 (IA32) (ws2help.dll)    
                               Windows XP 5.1.1.0 SP1 (IA32) (ws2help.dll)    
    0x71aa396d  call ecx       Windows XP 5.1.0.0 SP0 (IA32) (ws2help.dll)    
                               Windows XP 5.1.1.0 SP1 (IA32) (ws2help.dll)    
    0x71aa3de3  call ecx       Windows XP 5.1.2.0 SP2 (IA32) (ws2help.dll)    
    0x71aa163b  push ecx, ret  Windows XP 5.1.2.0 SP2 (IA32) (ws2help.dll)    
    0x75023112  call ecx       Windows 2000 5.0.0.0 SP0 (IA32) (ws2help.dll)  
                               Windows 2000 5.0.1.0 SP1 (IA32) (ws2help.dll)  
                               Windows 2000 5.0.2.0 SP2 (IA32) (ws2help.dll)  
                               Windows 2000 5.0.3.0 SP3 (IA32) (ws2help.dll)  
                               Windows 2000 5.0.4.0 SP4 (IA32) (ws2help.dll)  

Pour limiter les résultats uniquement à ceux qui sont portables, l'on peut ajouter l'option -P :

$ ./msfopcode search -p 2000,XP -m ws2help.dll -g "ecx => eip" -P

Opcodes
=======

    Address     Type           OS                                             
    -------     ----           --                                             
    0x74fa3112  call ecx       Windows 2000 5.0.0.0 SP0 (IA32) (ws2help.dll)  
                               Windows 2000 5.0.1.0 SP1 (IA32) (ws2help.dll)  
                               Windows 2000 5.0.2.0 SP2 (IA32) (ws2help.dll)  
                               Windows 2000 5.0.4.0 SP4 (IA32) (ws2help.dll)  
    0x71aa1224  push ecx, ret  Windows XP 5.1.0.0 SP0 (IA32) (ws2help.dll)    
                               Windows XP 5.1.1.0 SP1 (IA32) (ws2help.dll)    
    0x71aa396d  call ecx       Windows XP 5.1.0.0 SP0 (IA32) (ws2help.dll)    
                               Windows XP 5.1.1.0 SP1 (IA32) (ws2help.dll)    
    0x75023112  call ecx       Windows 2000 5.0.0.0 SP0 (IA32) (ws2help.dll)  
                               Windows 2000 5.0.1.0 SP1 (IA32) (ws2help.dll)  
                               Windows 2000 5.0.2.0 SP2 (IA32) (ws2help.dll)  
                               Windows 2000 5.0.3.0 SP3 (IA32) (ws2help.dll)  
                               Windows 2000 5.0.4.0 SP4 (IA32) (ws2help.dll)  

Pour le développement, le script peut être utilisé pour obtenir les résultats dans un format XML brut, afin que des extensions puissent être écrites pour l'interface dans le futur par des tiers. Cela peut être obtenu en spécifiant le paramètre -x.