Mock IV's (.cap, .ivs) genuinos. (Resuelto)

Iniciado por xustyx, 6 Abril 2016, 01:35 AM

0 Miembros y 1 Visitante están viendo este tema.

xustyx

Buenas!

Estoy intentando hacer pruebas con AP's "simulados" y para hacerlo más real me gustaría simular que sueltan paquetes (IV's) acordes a la contraseña asignada, claramente con cifrado WEP.

Para eso necesito poder crear ficheros (.cap, .ivs) con IV's genuinas para después pasarlas por aircrack y ver si las descifra correctamente.

Actualmente no tengo mucho tiempo para hacer reversing a ese tipo de ficheros, pero me he mirado el source de aricrack en concreto esta función, pero el bucle for me explota la cabeza...

https://github.com/aircrack-ng/aircrack-ng/blob/master/src/aircrack-ng.c#L3139

int check_wep_key( unsigned char *wepkey, int B, int keylen ){
unsigned char x1, x2;
unsigned long xv;
int i, j, n, bad, tests;

unsigned char K[64];
unsigned char S[256];

if (keylen<=0)
keylen = opt.keylen;

pthread_mutex_lock(&mx_nb);
nb_tried++;
pthread_mutex_unlock(&mx_nb);

bad = 0;

memcpy( K + 3, wepkey, keylen );

tests = 32;

// printf("keylen: %d\n", keylen);
// if(keylen==13)
// printf("%02X:%02X:%02X:%02X:%02X\n", wepkey[8],wepkey[9],wepkey[10],wepkey[11],wepkey[12]);

if(opt.dict) tests = wep.nb_ivs;

if(tests < TEST_MIN_IVS) tests=TEST_MIN_IVS;
if(tests > TEST_MAX_IVS) tests=TEST_MAX_IVS;

for( n = 0; n < tests; n++ )
{
/* xv = 5 * ( rand() % wep.nb_ivs ); */
xv = 5 * n;

pthread_mutex_lock( &mx_ivb );

memcpy( K, &wep.ivbuf[xv], 3 );
memcpy( S, R, 256 );

for( i = j = 0; i < 256; i++ )
{
j = ( j + S[i] + K[i % (3 + keylen)]) & 0xFF;
SWAP( S[i], S[j] );
}

i = 1; j = ( 0 + S[i] ) & 0xFF; SWAP(S[i], S[j]);
x1 = wep.ivbuf[xv + 3] ^ S[(S[i] + S[j]) & 0xFF];

i = 2; j = ( j + S[i] ) & 0xFF; SWAP(S[i], S[j]);
x2 = wep.ivbuf[xv + 4] ^ S[(S[i] + S[j]) & 0xFF];

pthread_mutex_unlock( &mx_ivb );

// printf("xv: %li x1: %02X  x2: %02X\n", (xv/5), x1, x2);

if( ( x1 != 0xAA || x2 != 0xAA ) &&
( x1 != 0xE0 || x2 != 0xE0 ) &&
( x1 != 0x42 || x2 != 0x42 ) &&
( x1 != 0x02 || x2 != 0xAA ) ) //llc sub layer management
bad++;

if( bad > ((tests*opt.probability)/100) )
return( FAILURE );
}

opt.probability = (((tests-bad)*100)/tests);
key_found(wepkey, keylen, B);

return( SUCCESS );
}


Bueno, si alguien me puede ayudar a generar las IV's o conoce la existencia de algún programa para hacerlo, se lo agradecería mucho.

Saludos

xustyx

He encontrado la solución y dentro de la suite... makeivs-ng xD.

De paso, intento comentar el código de como aircrack intenta descifrar el IV.
No estoy totalmente seguro de si es correcto, así que si me equivoco corregidme.


int check_wep_key( unsigned char *wepkey, int B, int keylen ){
//Declaracion de variables de la funcion.
unsigned char x1, x2;
unsigned long xv;
int i, j, n, bad, tests;

//Array donde se guardara el IV + KEY.
unsigned char K[64];

//Array donde se copiara un vector de 0 a 255 inicializado y se aplicara RC4...
unsigned char S[256];

if (keylen<=0)
keylen = opt.keylen;

pthread_mutex_lock(&mx_nb);
nb_tried++;
pthread_mutex_unlock(&mx_nb);

//Numero de intentos fallidos.
bad = 0;

//Copiamos la clave wep a probar a partir del 3 byte. Dejamos 3 bytes iniciales para el IV.
memcpy( K + 3, wepkey, keylen );

tests = 32;

//printf("keylen: %d\n", keylen);
//if(keylen==13)
//printf("%02X:%02X:%02X:%02X:%02X\n", wepkey[8],wepkey[9],wepkey[10],wepkey[11],wepkey[12]);

if(opt.dict) tests = wep.nb_ivs;

if(tests < TEST_MIN_IVS) tests=TEST_MIN_IVS;
if(tests > TEST_MAX_IVS) tests=TEST_MAX_IVS;

//Empiezan las pruebas.
for( n = 0; n < tests; n++ )
{
/* xv = 5 * ( rand() % wep.nb_ivs ); */
//Posicion a coger del buffer de IVS. 3 bytes del IV + 2 bytes iniciales del paquete.
xv = 5 * n;

pthread_mutex_lock( &mx_ivb );

//Copiamos el IV en los 3 bytes iniciales.
memcpy( K, &wep.ivbuf[xv], 3 );

//Copiamos el array inicializado de 0 a 255.
memcpy( S, R, 256 );

//Aplicamos RC4 (Key setup)
for( i = j = 0; i < 256; i++ )
{
j = ( j + S[i] + K[i % (3 + keylen)]) & 0xFF;
SWAP( S[i], S[j] );
}

//Aplicamos RC4(Keystream generation) para el primer byte.
i = 1;
j = ( 0 + S[i] ) & 0xFF;
SWAP(S[i], S[j]);

//Desciframos el primer byte de datos aplicando XOR al primer byte del keystream.
x1 = wep.ivbuf[xv + 3] ^ S[(S[i] + S[j]) & 0xFF];

//Aplicamos RC4(Keystream generation) para el segundo byte.
i = 2;
j = ( j + S[i] ) & 0xFF;
SWAP(S[i], S[j]);

//Desciframos el segundo byte de datos aplicando XOR al segundo byte del keystream.
x2 = wep.ivbuf[xv + 4] ^ S[(S[i] + S[j]) & 0xFF];

pthread_mutex_unlock( &mx_ivb );

//printf("xv: %li x1: %02X  x2: %02X\n", (xv/5), x1, x2);

//Comparamos si los dos bytes descifrados concuerdan con valores del (LLC header)
//Url https://en.wikipedia.org/wiki/IEEE_802.2#LLC_header
if( ( x1 != 0xAA || x2 != 0xAA ) &&
( x1 != 0xE0 || x2 != 0xE0 ) &&
( x1 != 0x42 || x2 != 0x42 ) &&
( x1 != 0x02 || x2 != 0xAA ) ) //llc sub layer management
bad++;

//Si la probabilidad es superada por los fallos no es la key.
if( bad > ((tests*opt.probability)/100) )
return( FAILURE );
}

//Tenemos una probable key :)
opt.probability = (((tests-bad)*100)/tests);
key_found(wepkey, keylen, B);

return( SUCCESS );
}