Capturar beacons

dagavi

Buenas, estoy realizando un proyecto en los que tengo que capturar los beacons de las redes 802.11 (sería en un programa, así que posiblemente tendría que usar libpcap).

No tengo ningún tipo de experiencia en esto, así que para empezar he decidido mirar que cosas son capturadas con wireshark (en Ubuntu).

Lo primero que me he encontrado es que al darle a la interfaz "wlan0" en Options e indicarle que capture en modo Monitor no lo activa, de hecho al iniciar wireshark con: wireshark -i wlan0 -I -L indica el error de que no puede poner la tarjeta en modo monitor.

Opté por cambiar el modo a mano: iwconfig wlan0 mode monitor
Donde se cambia correctamente (al menos si hago "iwconfig" indica Mode: Monitor), aunque para ello tengo que desactivar previamente el NetworkManager de Ubuntu (en redes inalámbricas) ya que me deja bloqueado el dispositivo.

Con esto al entrar en wireshark sigo sin poder activar el modo monitor en el menú opciones, pero he visto que si voy cambiando el canal con el iwconfig, ej:

iwconfig wlan0 mode monitor channel 13

Al llegar a un canal con paquetes el wirshark los captura, voy viendo los beacons.

Así que de aquí surgen algunas dudas:

1) Si quiero ver todos los canales (como el típico programa que te muestra todas las redes disponibles) ¿Tengo que ir canal por canal capturando algunos beacons? ¿hay algo que diga: todos los canales?

2) Alguien sabe a nivel de código (usando librerías por ejemplo) de como establecer una interfaz en modo monitor?

3) Me han comentado que se pueden crear interfaces virtuales que salen de una interfaz wifi0, eso sirve para poder crear una interfaz en modo monitor y otra en managed, por ejemplo, todo ello con una sola tarjeta. ¿Tenéis alguna referencia respecto a esto? ¿Algo que pueda buscar?

Markitos_182

#2 Con la suite aircrack-ng tienes el programa airmon-ng, que te permite crear un interfaz virtual monitor. Yo creo haber tenido algún problema al haber usado el mismo interfaz en monitor y managed a la vez, en plan que el monitor no recoge paquetes mientras el managed lo conecto a otra red, pero tu prueba.

El comandito de marras sería este:

# airmon-ng start wlan0

Y te crea el interfaz mon0 en modo monitor. ¡Suerte!

1
LOc0

Medio respondiendo a la primera pregunta, si mal no recuerdo por ejemplo airodump-ng para pillar de todos los canales va "saltando" de uno a otro. Creo que no es físicamente posible escuchar a la vez de todos (debe de ser algo así como sintonizar varios canales de la tele a a la vez...).

Salu2 ;)

1
dagavi

El profesor ya me ha confirmado que no se pueden leer todos los canales, por lo que tendré que hacer algo en plan ves cambiando de canal o, en su defecto, seleccionar manualmente el canal.

El airmon-ng va bien, lo que me gustaría que fuera código que pudiera insertar en el programa, aunque fuera llamando a la iwlib.
airmon-ng es un script que llama a iwconfig, aunque a primeras supongo que lo utilizaré haciendo algo en plan "obtener interfaces" y por cada una hacer un system("airmon start..." ) lo suyo sería al final que no dependiera del script (aunque si lo hiciera de la librería iwlib)

A ver que va saliendo xD Que esto me vale también como proyecto final de carrera.

15 días después
dagavi

Refloto el post por algo que me deriva de lo anterior.

En el proyecto que estoy realizando debo de capturar las beacons y estas las tendré que guardar para procesarlas y obtener unas métricas (no guardaré toda la beacon, solo la info que necesite).

Estas métricas tienen que ser por redes, por lo que había pensado generar una estructura que identifique una red y asociarla con otra que guarde sus beacons, aquí está mi duda de como debería ser la mejor forma de realizar esto.

En un programa de prueba, solo para listar las redes que encuentro (sin guardar las beacons ni nada, solo nombre de la red y BSSID) he creado un map, mi intención es tener un rápido acceso a un elemento concreto y el map me lo da. Además también me va bien que se autocree si no existe, ya que solo se consultarán redes y, si estas no existen, se crearán.

Así pues, no me parece una mala idea tener un map para añadir las redes y obtenerlas rápido.

Para guardar las beacons, que vendrán en orden pero no se cuantas puede capturar, creo que lo mejor será usar list, el mapa de las redes pues podría ser:

map<{estructura RED}, list<{estructura Beacon}> > redes;

Mi pregunta es: ¿Que os parece? ¿Tenéis algún otro consejo?

Mi idea principal era meter la lista de beacons dentro de estructura red, pero desaprovecharía el resultado del map de forma idiota. Ahora bien, el map me impide modificar cualquier valor de la key (estructura red), lo que podría llegar a ser interesante para, por ejemplo, añadirle un campo "tiempoUltimoPaquete" que podría modificar por cada inserción para saber cuando se ha recibido el último (obviamente, siempre podría calcularlo obteniendo la lista de paquetes y cogiendo el último). Esto podría hacer que fuera más interesante usar otras estructuras que no me bloqueen esta estructura como podría ser un vector o list y meter la lista de beacons como otro atributo de la información de la red.

El programa haría algo tal que (usando pcap para capturar paquetes):

void paqueteRecibido(paquete) {
    EstructuraRed er = generarEstructuraRed(paquete);
    EstructuraBeacon eb = generarEstructuraBeacon(paquete);

// asociar eb con er, si er es una nueva red, pues se añade de alguna forma
// ejemplo con el map descrito:
redes[er]->push_back(eb);
}

Usuarios habituales

  • dagavi
  • LOc0
  • Markitos_182