28 ago 2013

Meterpreter: Investigando en el IRB

¿Qué es el IRB? Es un intérprete de Ruby con el que un desarrollador puede ejecutar órdenes en Ruby y obtener los resultados en pantalla. Es totalmente recomendable que las personas que acaban utilizando Metasploit, y seguramente Meterpreter, aprendan el lenguaje de programación Ruby. Meterpreter proporciona al auditor un intérprete con el que interactuar de manera directa con la máquina remota o comprometida. A priori, y según hemos ido viendo en los cursos que se han dado de Metasploit, a los auditores les cuesta ver la utilidad al IRB, pero esto generalmente es porque no controlan el lenguaje del intérprete. Es interesante ver la utilidad del IRB, y sobretodo lo que más nos interesa entender como funciona Meterpreter por debajo.

Hoy hablaremos de qué cosas hay en el IRB que puedan resultarnos de interés. Para poder seguir el artículo, y futuros artículos que vendrán se recomienda conocer el lenguaje Ruby. El objetivo final será manejarse por este entorno, y poder desarrollar scripts muy interesantes y útiles para la comunidad Metasploit.

En el IRB existen distintos objetos que se deberán de conocer. El más importante es el objeto client, el cual representa la máquina vulnerada y proporciona un gran número de acciones que iremos viendo. Existen comandos interesantes que proporciona el IRB de Meterpreter, por ejemplo context, extensions, commands, etc. El comando extensions alberga las extensiones que hay cargadas actualmente en el framework, en lo que a Meterpreter se refiere. El comando commands proporciona una serie de órdenes que pueden ser utilizadas en la consola de Meterpreter e información sobre dicho comando. Y por último, un comando muy interesante es el context. Este comando alberga el contexto en el que se encuentra Meterpreter, y los objetos disponibles en el IRB, dando información en algunos de atributos y métodos que pueden resultar de interés.

En este punto hay que hacer una nota mental para el futuro, ¿Por qué ejecuto commands o extensions y en uno me devuelve información entre [] y otro {}? Es Ruby puro y duro, entre corchetes simplemente es un array o lista, por lo que el comando extensions proporciona un array con las extensiones cargadas, mientras que la orden commands proporciona un tabla (denominadas hash, o clave -> valor). Como se puede ver existen pares separados por comas, a la izquierda de => es la clave, y a la derecha del => es el valor, por lo que si queremos acceder al contenido de la clave background, haríamos algo tal que así:

ordenes = commands #esto guarda la salida en una variable

ordenes['background'] #acceso a dicho contenido

 

El objeto client

El más importante y el que nos va a dar el control remoto sobre la máquina vulnerada. Sabemos que Meterpreter se comporta como un client y un servidor, o eso nos dice la teoría. Vamos a bajar un peldaño y vamos a ver como acceder a una especie de API de este Meterpreter, y como se van componiendo los componentes que están por debajo. Si en el IRB ejecutamos client a secas, el intérprete nos devolverá que existe una sesión abierta con una dirección IP y con una identidad sobre un equipo. El objeto client tiene muchos métodos, los cuales pueden ser enunciados mediante la invocación del método methods, por lo que es importante aprender a usar este tipo de método estemos en el objeto que estemos.

Tras ejecutar el método methods obtenemos un listado en formato de array, el cual nos permite ya ver algunos aspectos importantes y que se pueden visualizar en la API de Meterpreter. Se puede visualizar el paquete core, fs, sys, net, railgun, webcam, ui, priv, entre otros. Ahora para movernos por estos elementos interesantes existen dos maneras, si son una clase final o si no lo es, ¿Cómo lo sabemos? Sencillo, ejecutamos, por ejemplo, client.fs y client.fs.file y obtenemos dos tipos de salida. En la primera podemos observar que hay tres elementos más por debajo, dir, file y filestat, mientras que en la segunda vemos que ya es una clase. En ambos casos podemos visualizar sus métodos a través del método methods.

Para acabar hoy, veremos como acceder a estas funciones de una clase y poder sacar algo de provecho de nuestra toma de contacto con el IRB de Meterpreter. Utilizaremos SYS a través del objeto client, ejecutando la siguiente instrucción: client.sys.process.get_procesess.

Se puede observar como primero se busca la clase process, y después se almacena en la variable procesos la llamada al método get_processes de la clase process. Ahora utilizaremos los conocimientos de Ruby para pintar bonito los procesos, mediante su nombre y su PID. Antes de poner el código analicemos en qué formato nos devuelve el método get_processes su información. Hay que ver que lo primero es [ por lo que sabemos que es una lista, y los elementos de su interior empiezan por { por lo que ya sabemos que es una lista de claves-valor.

procesos.each do |p|print_line "PID: #{p['pid']} Nombre: #{p['name']}"end

Esto es todo por hoy, toma de contacto con el IRB y como moverse con él. Recordar que si queréis empezar a desarrollar scripts para Meterpreter, o módulos de Metasploit, no os perdáis la serie de Flu Project.

Meterpreter scripts: encendiendo el horno

Mixins en Meterpreter

More Mixins

2 comentarios:

  1. saludos,disculpa mi pregunta es si hay un IDE para programar graficamente en ruby o como puedo acerlo

    ResponderEliminar
  2. Hola Carlos,Pues tienes este: http://www.jetbrains.com/ruby/ el cual es gratis para proyectos open source ;)

    ResponderEliminar