26 feb 2016

Monitoriza un proceso de RAM para encontrar información

En un proceso de RAM se puede obtener información sensible, debido a pequeños descuidos que el común de los humanos podemos cometer. Es cierto que podemos extraer este tipo de información con Keefarce hasta ciertas versiones, lo cual os recomiendo que lo probéis. ¿Por qué no hacer que Meterpreter monitorice un proceso concreto o varios en busca de diferentes patrones? 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, lo cual hace que de una forma sencilla podamos añadirle funcionalidades de manera sencilla. 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. 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. 


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, lo cual puede servir a alguien 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 y que se debe ejecutar en función de cada parámetro. El 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.


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

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 puede encontrar datos interesantes. En el caso de realizar un login correcto dicha información no se almacena. 


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… Las ideas surgen a partir de semillas, utilicemos esto de semilla.

Cuando el dumpeo finaliza, se analizará 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. 


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 una máquina comprometida por el auditor durante la realización de un pentesting?

No hay comentarios:

Publicar un comentario