jueves, enero 21, 2016

Cómo sacar la contraseña de Gmail de la memoria del proceso de Firefox usando Metasploit

La semana pasada escribí sobre cómo volcar el proceso en memoria RAM de KeePass a través de Meterpreter para ver como, en algunos casos, se puede obtener información sensible debido a que se requería ver la contraseña y por tanto ésta era copiada en memoria. Esta no era más que una prueba de concepto para mostrar cómo funcionan estas técnicas con Metasploit, y entender algunas otras técnicas que se pueden utilizar para extraer información de memoria. Para KeePass en concreto, ya hemos visto que existen algunas específicas, como es el caso de Keefarce, para sacar las credenciales de bases de datos de la herramienta en algunas versiones.

Figura 1: Cómo sacar la contraseña de Gmail de la memoria del proceso de Firefox usando Metasploit

Hablando con Chema me propuso crear un script continuo para optimizar o mejorar la búsqueda de expresiones o cadenas en proceso de memoria RAM durante un pentesting. ¿Por qué no hacer que Meterpreter monitorice un proceso concreto o varios en busca de diferentes patrones mientras seguimos con el trabajo? Decidí hacer una aproximación a este sano ejercicio de pentest y ponerme manos a la obra. Al script lo llamé process_monitor.rb.

El script de Meterpreter

Meterpreter puede ejecutar diferentes scripts en paralelo, lo que hace que de una forma sencilla podamos añadirle funcionalidades a nuestro trabajo. Realmente podemos verlo como un intérprete de Ruby y podríamos incluso abrir la herramienta irb e ir indicándole a Meterpreter las órdenes una a una que queremos que ejecute. El objetivo era automatizar lo máximo el proceso de monitorización. Para ello decidí reutilizar el código de proc_memdump que permite realizar un volcado de un proceso de memoria RAM, entre otras cosas.

Figura 2: Función dump_mem del script proc_memdump

Esta función la utilizaremos de forma iterativa para monitorizar uno o varios procesos. Una vez tenemos esto claro hay que ver las diferentes opciones del módulo que pueden servirnos para mejorarlo. Los scripts de Meterpreter tienen algo en común y es que se debe incluir un objeto opts. Este objeto de tipo Parser::Arguments permite simplificar el menú de ayuda con la información que se debe ejecutar en función de cada parámetro. Este script de Meterpreter presenta diferentes opciones que son las siguientes:
• “-h”. Mostrará la ayuda del script.
• “-p”. Permite indicar el PID del proceso a monitorizar.
• “-i”. Permite indicar el intervalo en segundos entre cada volcado de proceso.
• “-m”. Permitiría indicar si en el momento que haya un “match” entre el contenido y el patrón buscado se dejaría de llevar a cabo el proceso de monitorización. Es un valor booleano, al fin y al cabo.
• “-e”. Permite indicar el patrón buscado. A día de hoy es tan sencillo como un string, pero se podría evolucionar a una expresión regular, dotándole de mayor potencial.
Cuando se crea el objeto opts se utiliza el constructor new y se le pasan los argumentos. Los argumentos tienen un campo dónde se indica mediante un valor booleano si éste irá acompañado de un valor o no. Como se puede visualizar en la imagen “-h” tiene un valor false asociado, esto quiere decir que si el usuario lanza run process_monitor –h dicho parámetro no se acompaña de un valor. Sin embargo, run process_monitor –p [val] se le debe especificar el PID.


Figura 3: Opciones y configuraciones en función de los parámetros introducidos por el usuario

Por último, el cuerpo del script consta de un sencillo algoritmo. Este irá dumpeando el proceso indicado a través del parámetro –p, en un intervalo indicado por el parámetro –i y se buscará lo que se indique en el parámetro –e. A continuación se hace un esbozo en pseudocódigo de dicho algoritmo.

Mientras no_salir
Dump de memoria 
Mientras leer dumpeo
Si línea incluye patrón buscado
Imprimir “Yeah”
Fin si
Fin Mientras
Fin mientras

Como se puede ver, el pseudocódigo es muy sencillo. Su código en Ruby también. El script puede descargarse desde mi Github de Metasploit: process_monitor.rb

Prueba de concepto

Para la prueba de concepto utilicé Firefox como proceso a monitorizar. Según he ido viendo con Firefox, cuando un usuario se loguea incorrectamente en su cuenta de correo, toda la petición HTTPs queda en claro almacenada en RAM, por lo que se pueden encontrar datos interesantes. En el caso de realizar un login correcto dicha información no se almacena.

Figura 4: Ejecución del módulo process_monitor

En este caso el patrón de búsqueda es Passwd, el cual se conoce que cuando nos conectamos al correo electrónico de Gmail es el parámetro dónde se indica la contraseña. Es importante no quedarse solo en este ejemplo de prueba de concepto, y dejar que vuestros pensamientos más oscuros fluyan hacia cosas que se pueden obtener de un proceso de aplicación que esté siendo utilizada por un usuario… Las ideas surgen a partir de semillas, utilicemos esto de semilla.

Cuando el dumpeo finaliza, se analizará el fichero con el dump en busca del patrón concreto. Si se encuentra alguna coincidencia se mostrará por pantalla, aunque también se podría modificar para que se almacenase en un fichero. Además, si se encuentra una coincidencia se podría notificar al pentester de algún modo.

Figura 5: Extracción de las credenciales de Gmail del proceso de Firefox

Se puede observar en la imagen anterior la petición realizada y que se alojaba en el dump del proceso. Información útil y monitorizada, que una vez estando dentro de una máquina se puede tener. ¿Qué más cosas buscarías en los procesos de una máquina comprometida por el auditor durante la realización de un pentesting que puedan dar resultados efectivos?

Autor: Pablo González Pérez (@pablogonzalezpe)
Escritor de los libros "Metasploit para Pentesters", "Ethical Hacking" y “Pentesting con Powershell

11 comentarios:

  1. O lo que es lo mismo: En un equipo compartido no sería suficiente con cerrar la sesión, habría que apagar el PC para limpiar la RAM.

    Contra este tipo de ataques, no veo como un desarrollador web pueda defenderse.

    ResponderEliminar
  2. Congratulations Pablo! Gracias por compartirlo a los dos! Saludos, que tengais un buen dia!

    ResponderEliminar
  3. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  4. y si limpiamos la am con programas de tipo ram booster o algo por el estilo, que liberan memoria no usada?

    ResponderEliminar
  5. Wow! :) excelente! un saludo cordial! :)

    ResponderEliminar
  6. Amigo Pablo, excelente tutorial.
    Muchas gracias por compartir.
    Me gustaria ser su amigo.

    ResponderEliminar
  7. Oye Chema disculpa tengo una duda al estudiar informatica en la uiversidad que es ing. O lic.

    ResponderEliminar
  8. Es, es, puffff es brutal, que bueno señores.

    ResponderEliminar
  9. Es, es, puffff es brutal, que bueno señores.

    ResponderEliminar
  10. Hola!!! genial! buen articulo. Una sola duda, decis esto:
    "cuando un usuario se loguea incorrectamente en su cuenta de correo, toda la petición HTTPs queda en claro almacenada en RAM, por lo que se pueden encontrar datos interesantes. En el caso de realizar un login correcto dicha información no se almacena"

    osea, con este metodo solo accedemos a las credenciales de login fallido??

    ResponderEliminar