Primero explicar que es un diccionario hexadecimal y porque usarlos:
Un diccionario hexadecimal es igual que un diccionario normal pero en vez de definir palabras ASCII definimos el valor de los bytes de una palabra en hexadecimal (separamos los bytes con un separador, el más común y el que usa aircrak-ng es : ). Destacar que aunque cada linea representa una palabra hexadecimal los valores (0-F) estan escritos en ASCII, por lo que los diccionarios ocupan mucho más de lo que deberían, por ejemplo una palabra de 4 bytes ocupa 11 bytes en un diccionario hexadecimal. Un diccionario hexadecimal visualizado con un editor de texto cualquiera tendria este estilo:
Código:
24:35:1A:4E:20:01
D4:35:1A:4E:56:02
A2:24:1D:4E:20:06
...
¿Por que se usan este tipo de diccionarios? Pues basicamente nos permite representar todas las combinaciones posibles, mientras que las palabras ASCII incluyen solo a un pequeño grupo de carácteres. Hay gente que define las contraseñas en modo hexadecimal, si un byte de esa contraseña es por ejemplo 6, es muy dificil que encontremos la contraseña con un diccionario ordinario puesto que no es un carácter representable.
Vale, ahora pasemos a aircrack-ng. Verdaderamente los diccionarios hexadecimales son utiles para ataques con diccionarios a routers con claves predeterminadas, muchos fabricantes establecen las contraseñas por defecto en modo hexadecimal. Para definir en aircrack-ng un diccionario hexadeximal hay que especificar h: antes de la ruta del diccionario y siempre debemos especificar con -n el tamaño en bits de las claves del diccionario:
Código:
aircrak-ng -n 64 -w h:"ruta_diccionario.txt" captura.cap
Pero ahora nos encontramos un problema, aircrack-ng tiene un bug conocido y con la solución en el tracker de web pero aun sin corregir en el programa. Para información detallada: http://trac.aircrack-ng.org/ticket/685.
Para solucionarlo tenemos que modificar el código del source aircrack-ng.c.
El problema consiste en que no se libera memoria que se reserva dinamicamente, por lo que el sistema envia una señal KILL a aircrack-ng, en windows produce directamente un error. Para solucionarlo debemos ir al final de la función next_key (aproximadamente linea 4326), donde veamos este código:
Código:
free(tmp);
tmp=NULL;
debemos cambiarlo por:
Código:
free(tmp2);
tmp2=NULL;
Así ya tenemos solucionado este problema.
Sin embargo existen aun más complicaciones en el código, esta vez en la función crack_wep_dict (aproximadamente linea 4377). El problema se encuentra en esta parte del codigo casi al principio de la función:
Código:
i = strlen( key );
origlen = i;
while(i<opt.keylen)
{
key[i] = key[i - origlen];
i++;
}
key[i] = '\0';
Como sabreis las contraseñas WEP son de tamaño fijo, es decir son de 64bits (5bytes), 128bits(13bytes), etc...
Como en los diccionarios las contraseñas pueden tener diferente tamaño, lo que hace aircrack es duplicar el contenido, por ejemplo si encuentra en un diccionario la palabra "hola" y esta analizando contraseñas de 128bits, cambiara la palabra "hola" por "holaholaholah". Para esto detecta el final de la palabra cuando encuentra el caracter nulo '\0', y aqui esta el error. En un diccionario hexadecimal podriamos tener la palabra 12:34:00:53:2A y debido a lo comentado anteriormente, aicrack-ng solo nos leera los dos primeros bytes 12:34 y rellenara el resto, con lo que nos estropea cualquier palabra que tenga algun byte 00 (muy común en muchas contraseñas hexadecimales para rellenar).
Realmente este relleno no es para nada necesario, si utilizamos diccionarios para ataques WEP deben ser del tamaño justo a una clave WEP para que el resultado sea efectivo. Sabiendo esto modificaremos el codigo para que no rellene la contraseña. Reservaremos memoria con calloc para rellenar automaticamente con caracteres nulos, tambien eliminaremos la definición de la variable origlen que ya no es necesaria (podria darnos errores con make). En la función crack_wep_dict eliminamos directamente el código citado anteriormente. Y en esa misma función al principio modificamos el codigo:
Código:
int i, origlen, keysize;
char *key;
key = (char*) malloc(sizeof(char) * (opt.keylen + 1));
por:
Código:
int i, keysize;
char *key;
key = (char*) calloc(1,sizeof(char) * (opt.keylen + 1));
Con estos cambios aplicados, ahora solo tenemos que compilar de nuevo y ya tenemos nuestro aircrack-ng parcheado para que funcione con diccionarios hexadecimales. Yo recomiendo que esta nueva compilación se use solo para esto, para utilizar diccionarios hexadecimales en claves WEP. Para el resto de funciones mejor utilizar la versión compilada original (seguramente ofrezca un mayor rendimiento por las optimizaciones). Para compilar podeis utilizar el Makefile que traen los propios sources mediante make -f Makefile
Una aclaración importante: cuando utilizamos ataque de diccionario para contraseñas WEP debemos especificar con el parametro -n la longitud de la clave. Por defecto establece la longitud a 128bit, si estamos utilizando un diccionario de 64bits debemos especificarlo con -n 64 o no funcionará correctamente.
Bueno, para los vagos aqui os pongo una versión del aircrack-ng 1.1 modificada como explique anteriormente para que funcione con diccionarios hexadecimales. Van el source modificado y el ejecutable (Linux y Windows). Compilado con gcc versión 4.2.2 en Linux, y gcc 4.3.4 mediante Cygwin para Windows (junto al ejecutable de Windows incluyo las librerias de cygwin necesarias para que funcione):
Mirror 1: http://www.fileden.com/files/2006/9/18/225525/aircrack-ng-parchedhexdictionaries.zip
Mirror 2: http://www.megaupload.com/?d=0CLDYUI8
Estos archivos los he compilado yo con gcc (tal y como indico arriba). Desconozco como compilaron los binarios originales, pero seguro que lo hicieron con mejores optimizaciones. Es por esto que no recomiendo substituir los binarios originales por estos ejecutables que he compilado yo porque seguramente sean algo más lentos. Lo óptimo sería utilizar los binarios originales siempre que se pueda, excepto cuando necesitemos utilizar un diccionario hexadecimal, que será cuando hechemos mano de nuestra versión recompilada.
Espero que les sirva de ayuda.
Saludos