Pyrit Analizando Filtrando y Capturando handshake

En esta entrada explicamos como capturar y analizar handshakes wpa o wp2
utilizando la herramienta pyrit.

El objetivo es obtener un handshake asegurándonos que este es válido
para no perder el tiempo probando contra uno corrupto o conocer si
una captura contiene el handshake que necesitamos.

Si necesitas más información sobre pyrit puedes consultar:

https://laguialinux.es/pyrit-descifrar-clave-wpa-con-gpu

Si quieres consultar como compilar pyrit para tener soporte de
aceleración GPU con CUDA y OpenCL puedes consultar la
entrada:

https://laguialinux.es/instalar-pyrit-con-soporte-cuda-y-opencl

Analizando captura con pyrit

Analizando captura con pyrit

Para analizar un archivo de captura y obtener su información,
utilizaremos -r para indicar el nombre del archivo con dicha captura.

Mediante el comando analyze le indicamos que lleve a cabo esta
acción de analizar.

Utilizaremos como ejemplo el paquete micaptura.dump.gz que
representará nuestro archivo de captura donde se encuentran los
posibles handshakes que deseamos capturar:

pyrit -r micaptura.dump.gz analyze

Lo que nos devolverá una salida como la siguiente:


Pyrit 0.5.1 (C) 2008-2011 Lukas Lueg - 2015 John Mora


https://github.com/JPaulMora/Pyrit
This code is distributed under the GNU General Public License v3+

Parsing file ‘wpapsk-linksys.dump.gz’ (1/1)…
587 packets (587 802.11-packets), 1 APs

#1: AccessPoint 00:00:00:00:00:01 ('NombreAP')
#0: Station 00:00:00:00:00:02, handshake found
#1: Station 00:00:00:00:00:03
#2: Station 00:00:00:00:00:04

Pyrit analizó exitosamente el archivo de captura y se encontró con un
Access Point BSSID 00:00:00:00:00:01 y ESSID ‘NombreAP’.

Tres clientes se comunican con el Punto de Acceso.

La clave de la negociación (conocido como el cuatro vías handshake)
entre la estación con MAC 00:00:00:00:00:02 y el Punto de Acceso también
se ha registrado en el archivo de captura.

Podemos utilizar los datos de este handshake para adivinar la contraseña
que se utiliza para proteger la red.

Tenga en cuenta que Pyrit puede leer/escribir archivos comprimidos con
gzip de forma transparente, lo que resulta muy útil cuando se trata de
grandes listas de palabras o tablas cowpatty que pueden tardar mucho
tiempo además de ocupar cientos de megabytes o gigabytes.

Atacando handshake con pyrit

Vamos a ver un ejemplo intentando revelar la contraseña wpa o wpa2
con pyrit a través del handshake capturado y analizado.

En este ejemplo utilizamos el diccionario diccionario.gz para
referirnos al diccionario donde tenemos las palabras que lanzaremos
contra el handshake.

  • Punto de Acceso (AP): 00:00:00:00:00:01
  • Cliente al que pillamos el handshake: 00:00:00:00:00:02
  • Nombre del diccionario: diccionario.gz

En este caso mediante diccionario, es necesario que la contrasña exista
en él (poco probable pero no imposible usado con cabeza)

En nuestros términos, esto es conocido como un “pasthgrough-ataque

Según los datos que hemos tomado de ejemplo se ejecutaría así:


pyrit -r micaptura.dump.gz -i diccionario.gz -b 00:00:00:00:00:01 attack_passthrough

Esta orden anterior lo que haría es decir a pyrit que tome la
captura wpa desde micaptura.dump.gz y atacar el handshake que
se negoció con el punto de acceso 00:00:00:00:00:01 comprobando
el diccionario.gz contra él.

No siempre es necesario indicarle a pyrit que AccessPoint usar en el
archivo de captura (solo cuando existan varios) pero no está demás para
evitar confusiones en prácticas reales. Normalmente detectará el AP
correcto por si mismo.

Se debería obtener una respuesta similar a la siguiente:


Pyrit 0.5.1 (C) 2008-2011 Lukas Lueg - 2015 John Mora


https://github.com/JPaulMora/Pyrit
This code is distributed under the GNU General Public License v3+

Parsing file 'micaptura.dump.gz' (1/1)…
1611 packets (1611 802.11-packets), 1 APs

Tried 104026 PMKs so far; 18037 PMKs per second.

The password is 'diccionario'.

En este caso de ejemplo se resuelve la contraseña utilizada para
proteger la red 00:00:00:00:00:01 siendo en este caso diccionario.

Limpiar archivo de captura filtrando datos válidos

Capturar los archivos suelen ser los vertederos simples del tráfico
capturados directamente del aire.

Para nuestro propósito, sólo estamos interesados ​​en una muy pequeña
fracción del tráfico entre el Punto de Acceso y del cliente conectado.

Pyrit puede ayudar a reducir el tamaño de un archivo de captura de
paquetes a través del análisis del tráfico y tirar todos los paquetes
que no son de utilidad para nosotros.

Terminamos de esta forma con un nuevo archivo de captura muy pequeño
manteniendo toda la información valiosa y además es utilizable con
otras herramientas como Wireshark.

Limpiar un archivo de captura no es necesario y su único propósito
es hacer la vida un poco más fácil cuando se trata de archivos de
captura de gran tamaño.

Imaginamos el siguiente caso de prueba:

  • Captura: micaptura.dump.gz
  • Cantidad de paquetes: 1611
  • Tamaño: 894kb

Lo limpiaremos usando estos datos para el siguiente comando:

pyrit -r micaptura.dump.gz -o micaptura_limpia.dump.gz strip

Deberiamos haber tenido la siguiente respuesta:


Pyrit 0.5.1 (C) 2008-2011 Lukas Lueg - 2015 John Mora


https://github.com/JPaulMora/Pyrit
This code is distributed under the GNU General Public License v3+

Parsing file 'micaptura.dump.gz' (1/1)…
1611 packets (1611 802.11-packets), 1 APs

#1: AccessPoint 00:00:00:00:00:01 ('NombreAP'')
#0: Station 00:00:00:00:00:02 (1 authentications)

New pcap-file 'micaptura_limpia' written (4 out of 1611 packets)

El nuevo archivo de captura micaptura_limpia.dump.gz tiene un tamaño de
sólo unos cientos de bytes y contiene sólo tres de la llave de la
negociación (utilizado para atacar a la contraseña) y otro utilizado para detectar ESSID de la red.

Utilizando bases de datos con pyrit

Como usted ya sabe, adivinar la contraseña utilizada en un WPA o WPA2
es una tarea de cálculo intensivo.

Durante este proceso, el 99.9% de los ciclos de la CPU tiene que ser
gastado para calcular lo que se conoce como la llave maestra por
parejas, una clave de 256 bits derivado del ESSID y una contraseña con
el algoritmo SHA1-HMAC-PBKDF2.

Una de las principales debilidades de la WPA es que la llave
maestra por parejas no tiene elementos que son únicos a la hora de la
negociación entre el punto de acceso y la estación.

Es posible a fin de calcular la clave maestra en pares y almacenarla
para su uso posterior.

En el momento de atacar a una tecla de la negociación, nos quedamos con
el 0,1% restante de lo que depende de los datos de sesión único. Por
tanto, es muy valorable para un atacante para pre-calcular grandes
mesas de dos en dos llaves maestras para ESSIDs comunes.

Aquí es donde la base de datos de Pyrit entra al juego.
Es capaz de almacenar ESSIDs, contraseñas y sus correspondientes llaves
maestras por parejas, posiblemente creciendo hasta el tamaño de cientos
de millones de registros.

Estado de la base de datos de pyrit

A partir de una instalación nueva de Pyrit, su base de datos es muy
probable que esté vacía.

Ejecute el siguiente comando para obtener una visión general del estado:

pyrit eval

Si ha instalado la herramienta recientemente es normal recibir una
salida como la siguiente:


Pyrit 0.5.1 (C) 2008-2011 Lukas Lueg - 2015 John Mora


https://github.com/JPaulMora/Pyrit
This code is distributed under the GNU General Public License v3+

Connecting to storage at 'file://'... connected.
Passwords available: 0

Por favor, tenga en cuenta el valor por defecto de almacenamiento del sistema está basado en archivos: ‘file://’.

Llegaremos a las bases de datos SQL más adelante.

Rellenar y procesar por lotes la base de datos

Con el fin de hacer que la base de datos sea útil, vamos a llenarla con
las contraseñas de una lista de palabras.

Utilizarmos “diccionario.gz” en el ejemplo como fuente de contraseñas:

pyrit -i diccionario.gz import_passwords

Pyrit leerá diccionario.gz del archivo y guardará la lista de palabras
en su formato de base de datos interna.

Usted debe obtener una respuesta similar a la siguiente:


Pyrit 0.5.1 (C) 2008-2011 Lukas Lueg - 2015 John Mora

https://github.com/JPaulMora/Pyrit
This code is distributed under the GNU General Public License v3+

Connecting to storage at 'file://'… connected.
10202 lines read. Flushing buffers…
All done.

Tenga en cuenta que puede agregar más contraseñas para la base de datos
más adelante, el comando ‘import_passwords’ asegura que los duplicados
dentro de la lista de palabras o entre la lista de palabras y de la
base de datos se desechó y no se almacena de nuevo.

Por ahora, ejecute el comando ‘eval’ de nuevo para ver cómo la base de datos se ha rellenado con contraseñas de ‘diccionario.gz’.

Usted debe obtener una salida similar a la siguiente:


Pyrit 0.5.1 (C) 2008-2011 Lukas Lueg - 2015 John Mora

https://github.com/JPaulMora/Pyrit
This code is distributed under the GNU General Public License v3+

Connecting to storage at 'file://'… connected.
Passwords available: 4078

Se dará cuenta de que Pyrit sólo ha almacenado 4.078 de las 10.202 contraseñas del archivo.

Pyrit ha filtrado automáticamente contraseñas que no son adecuadas para WPA o WPA2 PSK y solucionado duplicados.

Ahora que ya tenemos algunas contraseñas en la base de datos, tenemos que crear un ESSID.

Ejecute el siguiente comando:

pyrit -e NombreAP create_essid

…con el que obtendremos una salida similar a la siguiente:


Pyrit 0.5.1 (C) 2008-2011 Lukas Lueg - 2015 John Mora

https://github.com/JPaulMora/Pyrit
This code is distributed under the GNU General Public License v3+

Connecting to storage at 'file://'... connected.
Created ESSID 'NombreAP'

Ejecute el comando ‘eval’ de nuevo y verás que ESSID ‘NombreAP’ se
ha creado en la base de datos:


Pyrit 0.5.1 (C) 2008-2011 Lukas Lueg - 2015 John Mora

https://github.com/JPaulMora/Pyrit
This code is distributed under the GNU General Public License v3+

Connecting to storage at 'file://'... connected.
Passwords available: 4078

ESSID 'NombreAP' : 0 (0.00%)

La base de datos contiene información suficiente para comenzar el proceso por lotes desde ella.

Pyrit tomará todas las combinaciones (ESSID: password), calculará las
correspondientes llaves maestras por parejas y almacenará estas para
su uso posterior.

Tenga en cuenta que usted puede salir de Pyrit abortando el
procesamiento por lotes en cualquier momento (con ctrl + c o enviar
SIGTERM).

Pyrit comenzará en el punto en el cual se detuvo la próxima vez
que se inicie el proceso por lotes.

Ejecute el siguiente comando para comenzar:

pyrit batch

..verá cómo trabaja Pyrit a través de la base de datos hasta que se queda sin trabajo.

Este proceso al acabar devolverá una salida similar a la siguiente:


Pyrit 0.5.1 (C) 2008-2011 Lukas Lueg - 2015 John Mora

https://github.com/JPaulMora/Pyrit
This code is distributed under the GNU General Public License v3+

Connecting to storage at 'file://'... connected.
Working on ESSID 'NombreAP'
Processed all workunits for ESSID 'NombreAP'; 19013 PMKs per second.

Batchprocessing done.

Usted puede utilizar el comando “eval” una vez más para ver si todos
los workunits por ESSID ‘NombreAP’ se han calculado.

Atacar Handshake desde una Base de Datos con Pyrit

Utilizando la base de datos para atacar a un handshake

Ahora podemos utilizar las claves maestras por pares almacenados en la
base de datos para atacar el mismo handshake, como en el ejemplo anterior.

En lugar de ejecutar un “passthrough-ataque”, donde la base de datos no
se toca en absoluto, emitimos una “attack_db” como en el ejemplo:

pyrit -r micaptura.dump.gz attack_db

Tenga en cuenta que no teníamos que especificar ESSID de la red ni su BSSID.

Esto nos devolvería la contraseña si estuviera en la base de datos.
Siguiendo los ejemplos anteriores, así sería, mostrando algo como
lo siguiente:


Pyrit 0.5.1 (C) 2008-2011 Lukas Lueg - 2015 John Mora

https://github.com/JPaulMora/Pyrit
This code is distributed under the GNU General Public License v3+

Connecting to storage at 'file://'... connected.
Parsing file micaptura.dump.gz (1/1)...
1611 packets (1611 802.11-packets), 1 APs

Picked AccessPoint 00:00:00:00:00:01 ('NombreAP') automatically.
Attacking handshake with Station 00:00:00:00:00:02...
Tried 19309 PMKs so far (39.8%); 287435 PMKs per second.

The password is ‘dictionary’.

Mientras que en estos ejemplos se utilizan una lista de palabras
muy pequeña y los números de rendimiento no son así muy fiable,
atacando un apretón de manos a partir de una base de datos
pre-calculada en pares Claves por lo general logrará hasta más de un millón de contraseñas por segundo.

Uso de las base de datos SQL como almacenamiento con Pyrit

Usando una base de datos SQL en lugar del sistema de archivos le dará algunos beneficios:

  • Copia de seguridad y de equilibrio de características de carga.
  • Múltiples clientes Pyrit pueden operar en la misma base de datos al
    mismo tiempo en la red.
  • Metadatos binarios y (posiblemente) se almacenan independientes uno
    de otro, haciendo más fácil la base de datos para consultar y operar.

Pyrit utiliza SQLAlchemy y se puede utilizar para ello todo tipo de
bases de datos SQL-por su mecanismo de almacenamiento interno: SQLite
tiene todos los beneficios descritos anteriormente (excepto la red de
funcionalidad), MySQL y PostgreSQL requieren alguna configuración, pero
ofrecen más funciones y mejor escala.

Consulte SQLAlchemy documentación para más detalles acerca de las bases
de datos soportadas.

Utilizando una base de datos como almacenamiento es muy fácil, todo lo
que tienes que hacer es proporcionar una cadena de conexión alternativa
en lugar de ‘file://’ que Pyrit usa por defecto (consulte el Manual
para obtener más información acerca de la cadena de conexión).

En el siguiente ejemplo, se utiliza una base de datos SQLite almacena
en el archivo single ‘mydb.db’:

pyrit -u sqlite:///mydb.db -i diccionario.gz import_passwords

Lo que devolvería una salida similar a la siguiente:


Pyrit 0.5.1 (C) 2008-2011 Lukas Lueg - 2015 John Mora

https://github.com/JPaulMora/Pyrit
This code is distributed under the GNU General Public License v3+

Connecting to storage at 'sqlite:///mydb.db'... connected.
10202 lines read. Flushing buffers…
All done.

La creación de una BD MySQL o PostgreSQL está más allá del alcance de este tutorial.

Sin embargo, después de configurar el servidor de base de datos, la creación de una base de datos (vacía) y proporcionar las credenciales necesarias, los pasos necesarios en Pyrit son los mismos que anteriormente.

Por ejemplo, para utilizar la base de datos ‘pyrit’ (ya creada) en un servidor PostgreSQL en 192.168.0.7 con usuario ‘pyrit’ y una contraseña, su línea de comandos podría ser algo como esto:

pyrit -u postgres://pyrit:@192.168.0.7/pyrit -e NombreAP create_essid

Instalar pyrit desde fuentes con soporte para GPU y CUDA o OpenCL

En este vídeo explicamos como instalar pyrit con soporte CUDA y OpenCL enfocado a tarjetas gráficas NVIDIA y la distribución Debian.

Pentesting

Raúl Caro Pastorino

Informático, técnico en sistemas, redes, baja tensión (electricidad) y desarrollador de aplicaciones WEB. Soy un apasionado por GNU/LINUX y el software libre en general desde prácticamente el año 2001-2003 que comencé. Intento usar y trabajar siempre con código libre o abierto de forma profesional. Me apasiona la programación, la micro-electrónica, el diseño gráfico y edición multimedia. Fan de Raspberry y arduino. Programo en bash, python, php y javascript principalmente. Repositorios de código con git: https://gitlab.com/fryntiz https://github.com/fryntiz

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.