Practicando DoS en 802.11

Posted by Star | Posted in | Posted on 21:55

1.- La base de los programas que usaremos.
2.- Creación de un esnifer sencillo
3.- Envío de tramas de desautenticación/disociación
4.- Inundación RTS/CTS con duración manipulada

1.- La base de los programas que usaremos.

Vamos a usar “parte” del código fuente de la suite de aircrack-ng para adaptarlos a nuestros ejemplos, así el trabajo “duro” ya está hecho y de paso, vamos comprendiendo cómo esta gente llegó a donde ha llegado…

Estos scripts no son nada modulares ni “exportables”, no contemplan los numerosos errores de programación que seguro que tienen, igualmente seguro que “sobran” porciones de código, pero caray!! Que esto no es un curso de C, así que perdonad por la falta de rigor en la programación y centrémonos en su funcionamiento…

Usaremos airodump-ng para “husmear” el medio y luego iremos afinando los ejemplos que nos ocupan.

También es [b]conveniente [/b]que estés familiarizado con algún esnifer.

Lo primero nos descargaremos la suite de aircrack-ng y la instalamos

Código:
tar xvfz aircrack-ng-1.0-rc3.tar.gz cd  aircrack-ng-1.0-rc3 cd src make unstable=true
En este punto ya podemos usarla… pero veamos nuestro primer programa:

2.- Crear un pequeño esnifer para examinar el tráfico. Programa wifiesnif.c

En este ejemplo haremos lo siguiente:
    • Abrir la tarjeta inalámbrica para poder capturar y enviar paquetes (el envío en este ejemplo no está implementado) • Capturar paquetes en el aire • Mostrar los paquetes capturados • Analizar el campo Frame Control de la cabecera MAC
Este mismo script podríamos usarlo para ir “mas allá”, para analizar todo el paquete, los datos, el tipo de cifrado, etc… pero para que no sea muy largo lo dejé tan sólo en:
    • Obtener los bytes de FC • Mostrar si se trata de un FromDS, toDS, WDS ó ad-hoc • Mostrar el tipo de trama: Administración Datos o Control • Averiguar si se trata de un paquete cifrado o no
Se podrían implementar nuevas consultas, todas la que desees, luego te “pongo deberes

Te recuerdo que existirán líneas del tipo #include, #define y otras que pueden no ser necesarias, están porque poco a poco irá creciendo el programa y se necesitarán más adelante.

Veamos lo “básico” del código:

Función dump_packet 


Código:
void dump_packet(unsigned char* packet, int len) // volcado de paquetes a pantalla {     int i=0;    printf("\n");     for(i=0; i     {         if(i>0 && i%4 == 0)printf(" ");         if(i>0 && i%16 == 0)printf("\n");         printf("%02X ", packet[i]);     }     printf("\n"); }
La utilizaremos para mostrar por pantalla el/los paquetes capturados

Código:
int read_packet(void *buf, size_t count, struct rx_info *ri) // leer paquetes Wifi {     struct wif *wi = _wi_in; /* XXX */     int rc;     rc = wi_read(wi, buf, count, ri);     if (rc == -1) {         switch (errno) {         case EAGAIN:                 return 0;         }         perror("wi_read()");         return -1;     }     return rc; }
Se encarga de capturar el tráfico y retorna como valor el tamaño del paquete leído

Estas dos funciones anteriores son prácticamente las mismas que usan la suite de aircrack.

Función captura_datos_FC




int captura_datos_FC( int caplen) // captura de datos WiFi, comprobaciones y guardar paquete .cap
{
    char elegido[1];
    int otromas, estado;
    caplen=0;
    while( 1 )
    {
   caplen = read_packet( h80211, sizeof( h80211 ), NULL );
   if(caplen <= 0) continue; // si la longitud no es válida. no se capturaron paquetes
   dump_packet (h80211,caplen);
   printf( "\nPulsa Ctrl+C para cancelar el análisis. Analizar este paquete (s/n) ?" );
        otromas=0;
        while(otromas==0) otromas = scanf( "%s", elegido );

   usleep(300);

   if( elegido[0] != 's' && elegido[0] != 'S' ) continue;

   printf ("\n\tFrame Control: %02X:%02X\n", h80211[0],h80211[1]); //muestra los 2 bytes de FC
   estado=h80211[1] & 0x3; // Valores de FromDS y toDS (0,1,2,3)
   switch (estado) {
      case 0:   // comunicacions adhoc y tramas de control/administración
         printf ("\t......FromDS  : 0\n");
         printf ("\t......toDs    : 0\n");
         break;
      case 1:   // paquete con dirección HACIA el sistema de districubión
         printf ("\t......FromDs  : 0\n");
         printf ("\t......toDS    : 1\n");
         break;
      case 2:   // paquete enviado DESDE el sistema de distribución
         printf ("\t......FromDs  : 1\n");
         printf ("\t......toDS    : 0\n");
         break;
      case 3:   // paquete enviado en WDS
         printf ("\t......FromDS  : 1\n");
         printf ("\t......toDs    : 1\n");
         break;
      }

   // Comprobamos el tipo de trama (datos, administración o control)
   if ((h80211[0] & 0x0C) == 0x08)
      printf ("\t......Trama   : de DATOS\n");

   if ((h80211[0] & 0x0C) == 0x00)
      printf ("\t......Trama   : de ADMINISTRACION\n");

   if ((h80211[0] & 0x0C) == 0x04)
      printf ("\t......Trama   : de CONTROL\n");

   // Averiguamos si se trata de un paquete con el bit de cifrado activado
   if ((h80211[1] & 0x40) == 0x40) {
      printf ("\t......Cifrado:  SI\n");
      }
   else
      {
      printf ("\t......Cifrado : NO\n");
          }
   }

    return( caplen );
}

Esta función analiza el paquete capturado mediante read_packet usando un array llamado h80211[4096] como contendor de los bytes en hexadecimal que se han leído.

De esta forma, por ejemplo, los valores de Frame Control estarán en h80211[0] y en h80211[1], la duración en h80211[2] y h80211[3], etc…

Creo que con los comentarios incluidos en el propio código fuente es suficiente para que lo comprendamos a estas alturas, no??

Y por último, la función main que es el inicio del programa:

int main( int argc, char *argv[] ) // inicio del programa
{
    int caplen;

//Comprueba el paso de parámetros
   if( argc != 2 ) {
       printf("\nUso: wifiesnif interface\n\nEjemplo: wifiesnif 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() );

/***************************************/
/* Llamada al esnifer                  */
/***************************************/
caplen=0;
caplen=captura_datos_FC(caplen);

exit(0);
}

Vamos, está claro lo que hace, no??

No hay que preocuparse de si sabemos lenguaje C o no, vamos no importa tanto cómo abrir la interface wifi, pero sí es importante que comprendas bien la función captura_datos_FC y cómo se averiguan los estados de toDS, FromDS, wep, etc…

El código completo lo tienes aquí: http://www.megaupload.com/?d=0SMDIKFJ

Guárdalo junto con los otras fuentes de aircrack (así será mas fácil compilarlo) por ejemplo con el nombre wifiesnif.c

gcc -g -W -Wall -Werror -O3 -D_FILE_OFFSET_BITS=64 -D_REVISION=0  -Iinclude   -c -o wifiesnif.o wifiesnif.c

gcc -g -W -Wall -Werror -O3 -D_FILE_OFFSET_BITS=64 -D_REVISION=0  -Iinclude wifiesnif.o common.o crypto.o -o wifiesnif -Losdep -losdep   -lssl -lcrypto


y ya está, lo lanzamos::

bt src # wifiesnif eth1

Pulsa Ctrl+C para cancelar el análisis. Analizar este paquete (s/n) ?n

08 41 1C 00  00 16 B6 41  03 5D 00 17  9A C3 D6 B9
00 16 B6 41  03 5B 80 88  2A 21 00 00  13 F5 7C F2
C5 E5 15 9D  CA 7C B1 17  09 25 84 05  1D 55 92 59
F0 95 43 2B  54 1F A2 41  B1 24 E1 F8  A5 47 7D 58
04 6C A4 AF  AB BC 27 C2  D9 31 E2 03  6E 7B CC F1
24 AE D0 0B  D9 F1 1A 25  E4 2D EE DC  0B C9 45 48
55 6D 58 55

Pulsa Ctrl+C para cancelar el análisis. Analizar este paquete (s/n) ?s

Frame Control: 08:41
......FromDs : 0
......toDS   : 1
......Trama  : de DATOS
......Cifrado: SI

D4 00 00 00  00 17 9A C3  D6 B9

Pulsa Ctrl+C para cancelar el análisis. Analizar este paquete (s/n) ?s

Frame Control: D4:00
......FromDS : 0
......toDs   : 0
......Trama  : de CONTROL
......Cifrado: NO

….
….





Comments (0)

Publicar un comentario