15 marzo 2012

Desarrollando para Metasploit (I) : Introducción

Buenas a todos, este es nuestro primer artículo en SbD de una serie en la que nos gustaría compartir con vosotros, si nos dejan :P, algunos ejemplos sencillos de distintos tipos de módulos de Metasploit.

Como todos sabréis Metasploit es un framework que nació con el objetivo de ayudar en el desarrollo de exploits pero poco a poco se comenzó a utilizar en tests de intrusión como una herramienta más. La continua aparición de módulos que cubren las distintas técnicas utilizadas en las auditorías extendió todavía más la herramienta hasta el día de hoy, en el que el framework ha evolucionado de tal manera que se puede utilizar para automatizar un montón de tareas relacionada con la seguridad de la información. Recomendamos estas transparencias de una conferencia impartida por gente de Rapid7 donde nos muestran algunas de las tareas en las que ellos lo utilizan, dicho esto, vamos a empezar.

Lo primero es señalar que está desarrollado en Ruby, como no es un lenguaje al que la gente suela estar acostumbrada recomendamos los siguientes documentos para hacer una introducción “por la vía rápida”.


También creemos necesario comentar algunos aspectos de la arquitectura del framework que se muestra en la imagen a continuación:




Para lo que nos ocupa y no complicarnos nos centraremos en la parte de los módulos, los cuales describimos a continuación:
NOTA: En la guia del desarrollador tenemos una explicación más detallada sobre de cada una de las parte.

- “Exploits”: Pues eso, no creemos que sea necesario explicar aquí lo que son. ;)
- “Payloads”: Código para ser ejecutado una vez que el exploit tenga el control del equipo objetivo, una de las ventajas de Metasploit es que distintos payloads pueden combinar con distintos exploits de forma muy cómoda y rápida.
- “Aux”: Son un tipo genérico de módulo, diseñado de forma flexible para que puede hacer casi cualquier cosa, nacieron en la versión 3 del framework para evitar usar módulos del tipo Exploit en situaciones que no se debería.
- “Encoders”: Se utilizan para generar versiones modificadas de los Payloads para evitar las distintas protecciones del sistema atacado, de tal forma que puedan restaurar su forma original en tiempo de ejecución y posteriormente ejecutarse.
- “Nops”: Se usan para crear cadenas de instrucciones que se ejecutan con el objetivo de alterar el estado de los registros y “flags” del procesador.

Una vez iniciados en Ruby y conocida un poco la arquitectura del framework es el momento de preparar el entorno. El sistema operativo utilizado para este ejemplo fue Backtrack 5 R1, que incorpora el framework en la instalación por defecto:

cd /opt/framework/msf3
A continuación instalamos las herramientas de desarrollo necesarias:

apt-get install ruby-dev
Creamos la estructura de ficheros necesaria y el módulo, es muy importante que se sitúe en la carpeta adecuada para el mismo (auxiliary, exploit, etc.). Por ser la primera vez vamos a programar un sencillo “Hi world!” de toda la vida y lo situamos en la carpeta de los módulos auxiliares debido a su naturaleza.

mkdir /opt/framework/msf3/modules/auxiliary/private
geany /opt/framework/msf3/modules/auxiliary/private/demo_aux.rb

Código:



Comentarios sobre el código fuente:

- Al comienzo nos encontramos un "require" que importa la biblioteca principal del framework, donde se implementan las interfaces necesarias para la interacción de módulos, sesiones y plugins.

- A continuación se define la clase principal, la cual hereda de la clase "Auxiliary" ya que, como comentamos, estamos desarrollando un módulo de este tipo.

- El método "initialize()" lo llama Ruby automáticamente cada vez que se crea un objeto, se utiliza para incorporar información del módulo como nombre, descripción, autor, revisión, etc. Al final se llama al método "register_options", el cual define las variables del módulo. En este caso creamos una variable nueva tipo cadena ("OptString") que va a contener el saludo a imprimir cada vez que se ejecute, para ello le pasamos dos parámetros: el nombre de la variable y una matriz de varios elementos:
- Un valor booleano que indica si es obligatorio definir esta variable para que funcione el módulo.
- Un valor tipo cadena que incluye su descripción.
- El valor por defecto de la misma para el caso de que no se le asigne ninguno.

- El método “run()” contiene el código que define realmente el funcionamiento del módulo, vemos que lo único que hace nuestro código es obtener el valor de la variable “GREETING” del almacén de datos (así se accede al contenido de las variables desde los módulos) e imprimirlo.

Para finalizar, como vemos en la imagen, probamos el módulo cambiando el valor del parámetro “GREETING” y confirmamos que lo imprime correctamente.



Pues nada más, en el siguiente post veremos un módulo auxiliar un poco más completo para comprender mejor su funcionamiento. Mientras en la web de Metasploit o en e código fuente del propio framework tenéis todos los existentes para jugar con ellos. :D

Artículo cortesía de Roi Mallo y  Jesús Pérez    

3 comments :

brianne dijo...

Muy bien! hacia tiempo que quería aprender el funcionamiento de los módulos de msf, ahora ya no tendré excusa! en espera del siguiente post!
Saludos!
 

Domain Admin dijo...

¿Es necesario algún paso intermedio para agregar el módulo a Metasploit?... al momento de probar el módulo me aparece el error:

[-] Failed to load module: auxiliary/private/demo_aux

Saludos

cesar herrera gazco dijo...

 Buena noches , muy buena referencia. Como dice brianne de tiempo que no se veia algo por el estilo en SBD , felicitaciones para el creador del post. Espero sigan con esa linea de enseñar desde algo basico hasta algo avanzado, util y real. Particularmente ya que estamos con metasploit , andaria maravilloso si se diera las pautas de contruir un buffer overflow, ya saben pasando por lo que es un " EIP " Y Terminando con la gran ayuda ke nos da nuestra metasploit para tareas automatizadas...  Serian el primer post de esa clase en español. Bueno exitos y felicitacines por el post... un video no vendria mal no????