Mostrando entradas con la etiqueta programación. Mostrar todas las entradas
Mostrando entradas con la etiqueta programación. Mostrar todas las entradas

jueves, 29 de septiembre de 2016

Crackeando credenciales de MySql obtenidos por un MITM like a Sir!


¡Hola amigos! vamos a explicar como poder hacernos por nuestros medios un crackeador de credenciales de MySql. Nos vamos a centrar en atacar una debilidad existente en MySql desde sus inicios, si bien es cierto que la han fortificado desde la versión 4.1, yo considero que en realidad sigue como estaba, pero un poquito mejor.



Para crackear las claves no vamos a requerir de acceso a la tabla mysql.user (mediante un sqli o similar), sino esnifando la trama de la conexión al mas puro estilo MITM (Man in the Middle).

Para ello realizaremos los siguientes pasos:


1- Entender como funciona el proceso de login en MySql

En la siguiente dirección podemos ver el código que utiliza MySql para la comprobación de la contraseña, aunque el link se trata de un fork hecho por twitter, nos vale, ya que este aspecto no cambia desde la versión 4.1 de MySql , no es necesario saber c o c++ pues amablemente, nos han comentado como funciona.



Como se puede ver, el servidor genera una cadena aleatoria (public_seed), esta cadena es enviada al cliente. El cliente la recibe, y realiza el SHA1 de la contraseña introducida (hash_stage1), después vuelve a generar otro SHA1 del resultado anterior (hash_stage2) y envía al servidor un XOR de hash_stage1 con el SHA1 de public_seed hash_stage2 (generando el reply). 

Lo que parece un poco confuso, en realidad es muy simple, pues en la propia documentación de MySql nos resumen el proceso a una sóla linea "SHA1( password ) XOR SHA1( "20-bytes random data from server" <concat> SHA1( SHA1( password ) ) )"



Nos vamos a centrar en el plugin de autentificación mysql_native_password (Secure Password Authentication) ya que es el que por defecto aparece en las instalaciones mas modernas. Nos explican de una manera mas clara en esta dirección (http://dev.mysql.com/doc/internals/en/authentication-method.html) los diferentes tipos de autentificación que hay, y como se comprueban.

También podemos ver, que lo único que ha variado es en incrementar el tamaño de la semilla enviada por el servidor y de la respuesta del cliente (versión <4.1 en la imagen inferior), que por tema de compatibilidades en la versión "segura", enviarán partida en dos trozos.



Ahora que ya sabemos como funciona, nos queda intentar extraer de la trama la semilla generada (public_seed) y el reply del cliente, realizar el mismo proceso que realiza el cliente con la public_seed fija (hardcodeada), y cuando nos de lo mismo que el reply enviado, ¡la contraseña será la misma!

2 - Obteniendo la trama de una conexión lícita

Lo primero es lo primero, como se trata de un ataque de red, los credenciales se pueden obtener mediante un MITM (como hemos visto en otras ocasiones) ... o en un ataque local, ¿local? pues si, supongamos que nuestro programa de gestión del trabajo utiliza MySql, tenemos derecho a instalar un WireShark, y somos unos meros operarios al que no nos dejan acceder a todos los datos de la empresa. Bastaría con encender el WireShark y abrir el programa en cuestión, para capturar la trama de la conexión a la base de datos. Pero, ¿es esto tan fácil?

Para la prueba de concepto, me he instalado un servidor MySql en una máquina remota, y he puesto al usuario root una contraseña que aparece en un diccionario de palabras (rockyou), ¡pero larga!



Y en el momento que el programa, se conecte de forma lícita, enviará la trama que necesitamos, la cual capturaremos por WireShark (o mediante un MITM)

Podemos ver que WireShark ya hace el trabajo sucio, y localiza los dos valores que más adelante vamos a necesitar:

  • En la salida del servidor: Los dos Salt (lo que llamabamos antes public_seed), tal y como os dije, aparece partida en dos Salt.


  • Y en la respuesta del cliente: el hash del password (lo que llamábamos antes reply). 

¡OJO! no confundir con el hash que guarda MySql en la tabla mysql.user, pues es totalmente diferente. 

El más observador, verá que el usuario viaja en texto plano, ¡Ya tenemos algo!



¿Y que hacemos con esta ristra de datos? Después de este paso, podríamos copiarnos toda esa información a un pendrive y continuar con nuestro ataque en offline. Los únicos valores que vamos a necesitar para más adelante son:


Salt:   28544c632e5956244e3b7e2b56537b3329712357

Hash: 78c87d4766993a5cc3b6b6c4a943069ecd94780b

Nótese que el 00 que nos muestra wireshark no le copiamos, ya que es el fin de cadena y concatenando los dos Salt, obtenemos un Hash SHA1 válido de 20 preciosos bytes.


3 - ¡Creando el kraken! ... digo ¡el cracker!

Lo primero es intentar replicar el funcionamiento de la función que realiza el cliente para generar el reply, para ello, nos creamos una función, que realize exactamente el mismo procedimiento (el lenguaje elegido es C#, pero puede hacerse en cualquiera)


Y después el cuerpo del programa, se leerá nuestro diccionario de palabras a la espera de encontrar la correcta.



Esperamos unos segundos y ... tachan!!



4 - ¡Pero que diantres es eso del c# y de programar!

Algunos os estaréis preguntando si se puede hacer sin necesidad de programar, y la respuesta es: SI, pero le quitamos la gracia. No ... en serio, hashcat y john the ripper tienen ya implementados el hash de MySql (tanto el obtenido por un sniffer como el Hash de la tabla mysql.user).


Para proceder a crackearlo con ayuda de hashcat, haremos lo siguiente:

Si nos vamos a la dirección https://hashcat.net/wiki/doku.php?id=example_hashes , podemos ver el ejemplo de como implementar el crackeo:
11200
MySQL Challenge-Response Authentication (SHA1)
$mysqlna$1c24ab8d0ee94d70ab1f2e814d8f0948a14d10b9*437e93572f18ae44d9e779160c2505271f85821d

Por lo que creamos un archivo hash.txt con el siguiente contenido (donde el primer hash es el Salt y el segundo la Password)
$mysqlna$28544c632e5956244e3b7e2b56537b3329712357*78c87d4766993a5cc3b6b6c4a943069ecd94780b
y ejecutamos el siguiente comando:
hashcat -m 11200 hash.txt /usr/share/wordlists/rockyou.txt


Y con esto, habremos obtenido de otra manera, la misma contraseña utilizada durante la conexión :)

¡Un saludo de @ShargonXL!

miércoles, 11 de mayo de 2016

Python Scripting (I) - Metadatos

Buenos días hackers, cuánto tiempo sin escribiros nada! Hoy vengo a introduciros un poco en el mundo de la programación de scripts en Python, ese lenguaje tan ampliamente utilizado en el mundo de la ciberseguridad.

Python

Python es un lenguaje interpretado y orientado a objetos cuyo principal objetivo es producir software de una forma fácil y rápida, así de sencillo. Python es rápido. Además, siendo bastante fácil de aprender y utilizar, lo hacen un lenguaje de programación perfecto para principiantes que quieran aprender programación.


Actualmente, la versión de Python más actualizada es la 3.5.1. Sin embargo, mucha gente (como yo de forma habitual) utiliza otra versión más antigua, de la familia 2.7.X. Esto se debe a que el paso de Python 2 a Python 3 llevó a una remodelación de algunos elementos del lenguaje. De todas formas, la rama de Python 2 aún sigue actualizándose, siendo la más actual la versión 2.7.11.

Pese a que estas diferencias existen, ambas ramas comparten el mismo paradigma y el mismo enfoque, y la sintaxis es prácticamente igual. Podéis usar cualquiera de estas dos versiones libremente, y los scripts escritos en una o en otra deberían poder usarse (con ciertos límites) en ambas versiones sin apenas modificaciones.

Dicho esto, soltaré una frase que me oiréis decir de vez en cuando: Saber programar no es saber un lenguaje. Cuando aprendes a programar, el lenguaje te da un poco igual. Esto, que puede sonar muy raro, al final tiene sentido; programar es comprender el flujo que tiene que seguir tu programa para solucionar tu problema de una forma ágil y fiable, y esto es igual en cualquier lenguaje de programación.

¡No me tengáis en cuenta los sermones! :)

Decir también que esta entrada y las que seguirán no pretenden realizar un paso-a-paso por la programación en Python; para ello puedo recomendar libros y manuales que os ayudarán mucho. Sin ir mas lejos, Python para todos de Raúl González Duque es el mejor manual que me he encontrado, y lo podéis descargar de forma gratuita. Lo que sí intentaré es justificar y explicar los elementos estructurales de la herramienta.

En Fwhibbit todos utilizamos Python en mayor o menor medida a la hora de crear herramientas y pruebas de concepto, como la que os traigo hoy. Este script, que podéis encontrar en mi perfil de GitHub, permite obtener metadatos de ficheros con extensión pdf y docx. Por supuesto, el script es ampliable (en un futuro seguramente se amplíe) con nuevos formatos soportados; os lo brindo como prueba de concepto a la recolección de metadatos.

Metadatos

Hablando de ello, ¿qué es eso de metadatos? Los metadatos son una serie de marcas o etiquetas en un archivo que describen diversa información acerca del mismo. La información que arrojan puede ser muy variada dependiendo de cómo se creó el archivo y con qué formato y extensión: autor, fecha de creación, programa y sistema operativo origen... La información que puede arrojar un solo fichero puede dejarnos muy sorprendidos y ser clave para la recolección de información de un objetivo.

El script metadatos.py

El proceso que suelo utilizar a la hora de realizar este tipo de scripts (que puede no ser la mejor, ¡uno no es perfecto!) es comenzar escribiendo la función principal del programa (la función main de toda la vida y que os sonará a los que sois más de Java o C), que verificará los argumentos que le pasamos al script; en este caso, es la dirección (absoluta o relativa) a un directorio que contendrá los ficheros a analizar.

Función principal del script

Una vez hecho esto, la función main invocará a la función que abre y realiza el análisis del fichero en sí, que llamo printMeta(target). Recibe como parámetro el directorio objetivo una vez comprobado y filtrado por la función principal. Una vez comprobado que el objetivo existe, realizará un recorrido en profundidad en su interior (utilizo la función os.walk(target), extremadamente útil en estos casos) y, por cada fichero encontrado, analizará su extensión e invocará a la función correspondiente para la impresión de metadatos si es una extensión soportada.

Función de apertura para analizar el directorio y ficheros encontrados

Por último, las funciones print_doxc(file_full_path) y print_pdf(file_full_path) reciben como parámetro la dirección completa del fichero objetivo e imprimen todos los metadatos encontrados. Para esto, hacemos uso de los módulos externos python-docx y PyPDF2, que proporcionan medios para crear, modificar y borrar ficheros .docx y .pdf respectivamente. En nuestro caso, servirán para analizar un fichero que ya existe y extraer toda la información en forma de metadatos que contengan, imprimiendo por pantalla los datos encontrados.

Análisis de metadatos en PDF
Análisis de metadatos en PDF

A continuación, la ejecución del script en nuestra distribución Linux favorita (funcionará en Windows excepto por la coloración de los resultados, dependiendo de nuestra shell): 

Ejecución del script sobre un directorio

Cabe destacar la importancia de varias cosas que podéis apreciar en el script como buenas prácticas que os animo encarecidamente a seguir: 
  • Los argumentos pasados al script deben verificarse antes de proceder a la ejecución de las funciones, evitando errores futuros. 
  • Es importante dividir el código en funciones para facilitar la lectura y el reciclado del código. Lo agradeceréis cuando abráis el script unos meses después. 
  • Los errores han de tratarse (bloques de código en try...except) y, si son conocidos, informar al usuario de lo que ha pasado.
  • ¡El código debe estar comentado! Una buena práctica es comenzar cada función con un docstring  y comentar el resto del código con comentarios normales (utilizando #). 



Y hasta aquí nuestro script de análisis de metadatos. Espero que os haya gustado y que os sirva para aprender, que es el objetivo de los scripts que os empezaré a traer más de vez en cuando en calidad de prueba de concepto. 

Un saludo hackers!
hartek

Google Analytics