Foro de elhacker.net

Seguridad Informática => Hacking Wireless => Mensaje iniciado por: xustyx en 6 Abril 2016, 01:35 am



Título: Mock IV's (.cap, .ivs) genuinos. (Resuelto)
Publicado por: xustyx en 6 Abril 2016, 01:35 am
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 (https://github.com/aircrack-ng/aircrack-ng/blob/master/src/aircrack-ng.c#L3139)
Código
  1. int check_wep_key( unsigned char *wepkey, int B, int keylen ){
  2. unsigned char x1, x2;
  3. unsigned long xv;
  4. int i, j, n, bad, tests;
  5.  
  6. unsigned char K[64];
  7. unsigned char S[256];
  8.  
  9. if (keylen<=0)
  10. keylen = opt.keylen;
  11.  
  12. pthread_mutex_lock(&mx_nb);
  13. nb_tried++;
  14. pthread_mutex_unlock(&mx_nb);
  15.  
  16. bad = 0;
  17.  
  18. memcpy( K + 3, wepkey, keylen );
  19.  
  20. tests = 32;
  21.  
  22. // printf("keylen: %d\n", keylen);
  23. // if(keylen==13)
  24. // printf("%02X:%02X:%02X:%02X:%02X\n", wepkey[8],wepkey[9],wepkey[10],wepkey[11],wepkey[12]);
  25.  
  26. if(opt.dict) tests = wep.nb_ivs;
  27.  
  28. if(tests < TEST_MIN_IVS) tests=TEST_MIN_IVS;
  29. if(tests > TEST_MAX_IVS) tests=TEST_MAX_IVS;
  30.  
  31. for( n = 0; n < tests; n++ )
  32. {
  33. /* xv = 5 * ( rand() % wep.nb_ivs ); */
  34. xv = 5 * n;
  35.  
  36. pthread_mutex_lock( &mx_ivb );
  37.  
  38. memcpy( K, &wep.ivbuf[xv], 3 );
  39. memcpy( S, R, 256 );
  40.  
  41. for( i = j = 0; i < 256; i++ )
  42. {
  43. j = ( j + S[i] + K[i % (3 + keylen)]) & 0xFF;
  44. SWAP( S[i], S[j] );
  45. }
  46.  
  47. i = 1; j = ( 0 + S[i] ) & 0xFF; SWAP(S[i], S[j]);
  48. x1 = wep.ivbuf[xv + 3] ^ S[(S[i] + S[j]) & 0xFF];
  49.  
  50. i = 2; j = ( j + S[i] ) & 0xFF; SWAP(S[i], S[j]);
  51. x2 = wep.ivbuf[xv + 4] ^ S[(S[i] + S[j]) & 0xFF];
  52.  
  53. pthread_mutex_unlock( &mx_ivb );
  54.  
  55. // printf("xv: %li x1: %02X  x2: %02X\n", (xv/5), x1, x2);
  56.  
  57. if( ( x1 != 0xAA || x2 != 0xAA ) &&
  58. ( x1 != 0xE0 || x2 != 0xE0 ) &&
  59. ( x1 != 0x42 || x2 != 0x42 ) &&
  60. ( x1 != 0x02 || x2 != 0xAA ) ) //llc sub layer management
  61. bad++;
  62.  
  63. if( bad > ((tests*opt.probability)/100) )
  64. return( FAILURE );
  65. }
  66.  
  67. opt.probability = (((tests-bad)*100)/tests);
  68. key_found(wepkey, keylen, B);
  69.  
  70. return( SUCCESS );
  71. }
  72.  

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


Título: Re: Mock IV's (.cap, .ivs) genuinos.
Publicado por: xustyx en 8 Abril 2016, 11:49 am
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.

Código
  1. int check_wep_key( unsigned char *wepkey, int B, int keylen ){
  2. //Declaracion de variables de la funcion.
  3. unsigned char x1, x2;
  4. unsigned long xv;
  5. int i, j, n, bad, tests;
  6.  
  7. //Array donde se guardara el IV + KEY.
  8. unsigned char K[64];
  9.  
  10. //Array donde se copiara un vector de 0 a 255 inicializado y se aplicara RC4...
  11. unsigned char S[256];
  12.  
  13. if (keylen<=0)
  14. keylen = opt.keylen;
  15.  
  16. pthread_mutex_lock(&mx_nb);
  17. nb_tried++;
  18. pthread_mutex_unlock(&mx_nb);
  19.  
  20. //Numero de intentos fallidos.
  21. bad = 0;
  22.  
  23. //Copiamos la clave wep a probar a partir del 3 byte. Dejamos 3 bytes iniciales para el IV.
  24. memcpy( K + 3, wepkey, keylen );
  25.  
  26. tests = 32;
  27.  
  28. //printf("keylen: %d\n", keylen);
  29. //if(keylen==13)
  30. //printf("%02X:%02X:%02X:%02X:%02X\n", wepkey[8],wepkey[9],wepkey[10],wepkey[11],wepkey[12]);
  31.  
  32. if(opt.dict) tests = wep.nb_ivs;
  33.  
  34. if(tests < TEST_MIN_IVS) tests=TEST_MIN_IVS;
  35. if(tests > TEST_MAX_IVS) tests=TEST_MAX_IVS;
  36.  
  37. //Empiezan las pruebas.
  38. for( n = 0; n < tests; n++ )
  39. {
  40. /* xv = 5 * ( rand() % wep.nb_ivs ); */
  41. //Posicion a coger del buffer de IVS. 3 bytes del IV + 2 bytes iniciales del paquete.
  42. xv = 5 * n;
  43.  
  44. pthread_mutex_lock( &mx_ivb );
  45.  
  46. //Copiamos el IV en los 3 bytes iniciales.
  47. memcpy( K, &wep.ivbuf[xv], 3 );
  48.  
  49. //Copiamos el array inicializado de 0 a 255.
  50. memcpy( S, R, 256 );
  51.  
  52. //Aplicamos RC4 (Key setup)
  53. for( i = j = 0; i < 256; i++ )
  54. {
  55. j = ( j + S[i] + K[i % (3 + keylen)]) & 0xFF;
  56. SWAP( S[i], S[j] );
  57. }
  58.  
  59. //Aplicamos RC4(Keystream generation) para el primer byte.
  60. i = 1;
  61. j = ( 0 + S[i] ) & 0xFF;
  62. SWAP(S[i], S[j]);
  63.  
  64. //Desciframos el primer byte de datos aplicando XOR al primer byte del keystream.
  65. x1 = wep.ivbuf[xv + 3] ^ S[(S[i] + S[j]) & 0xFF];
  66.  
  67. //Aplicamos RC4(Keystream generation) para el segundo byte.
  68. i = 2;
  69. j = ( j + S[i] ) & 0xFF;
  70. SWAP(S[i], S[j]);
  71.  
  72. //Desciframos el segundo byte de datos aplicando XOR al segundo byte del keystream.
  73. x2 = wep.ivbuf[xv + 4] ^ S[(S[i] + S[j]) & 0xFF];
  74.  
  75. pthread_mutex_unlock( &mx_ivb );
  76.  
  77. //printf("xv: %li x1: %02X  x2: %02X\n", (xv/5), x1, x2);
  78.  
  79. //Comparamos si los dos bytes descifrados concuerdan con valores del (LLC header)
  80. //Url https://en.wikipedia.org/wiki/IEEE_802.2#LLC_header
  81. if( ( x1 != 0xAA || x2 != 0xAA ) &&
  82. ( x1 != 0xE0 || x2 != 0xE0 ) &&
  83. ( x1 != 0x42 || x2 != 0x42 ) &&
  84. ( x1 != 0x02 || x2 != 0xAA ) ) //llc sub layer management
  85. bad++;
  86.  
  87. //Si la probabilidad es superada por los fallos no es la key.
  88. if( bad > ((tests*opt.probability)/100) )
  89. return( FAILURE );
  90. }
  91.  
  92. //Tenemos una probable key :)
  93. opt.probability = (((tests-bad)*100)/tests);
  94. key_found(wepkey, keylen, B);
  95.  
  96. return( SUCCESS );
  97. }
  98.