BSSID Finder

En este post veremos que sólo 20 líneas de python son las necesarias para complementar el comportamiento de un sniffer y lograr que éste cumpla con nuestras necesidades. No obstante, el objetivo principal es proporcionar una introducción práctica a la librería scapy.

Este script resulta útil cuando en las auditorías wifi se requiere el conocimiento de los distintos AP de la organización que están a nuestro alcance. Un objetivo claro puede ser, por ejemplo, suplantar la identidad de los puntos de acceso para el envío de paquetes de desautenticación a las estaciones clientes.

Evidentemente esta tarea se puede realizar de forma manual, simplemente lanzado airodump-ng y anotando los bssid de interés, y cruzando los dedos para que no existan demasiados puntos de acceso. No obstante, contemplar las posibilidades del script resulta interesante, ya que son muy extensas. Por ejemplo, con pocas líneas es posible automatizar el envío de los paquetes de desautenticación y al final, todo se reducirá en un cd y un enter.

Para hacer uso del script, como siempre, debemos disponer de nuestra tarjeta en modo monitor:

monitor_mode

La sentencia “airmon-ng check kill” nos permite matar los procesos que pueden interferir con nuestro modo monitor de la tarjeta. Es muy recomendable usar esta sentencia, ya que nos podemos ahorrar la posibilidad de obtener un comportamiento no deseado de la misma, y en consecuencia, una situación de confusión.

Hablando del modo monitor, aprovecho para añadir con las siguientes líneas una explicación y una pequeña comparación con su compatriota modo promiscuo.

Ya sabemos que de forma predeterminada, cuando una tarjeta recibe un paquete comprueba si éste le va dirigido y si no es así, lo descarta. Este comportamiento se conoce como modo managed. En cambio, cuando se habilita el modo promiscuo, la tarjeta capturará todos los paquetes que reciba y que sean provenientes de tarjetas que se encuentran asociadas al mismo punto de acceso que ésta, ya sean paquetes destinados a la propia tarjeta o al resto de tarjetas asociadas. Esto es posible porqué en la cabecera de las tramas 802.11 se incluye el BSS ID sobre el que se encuentra asociado cada tarjeta.

Por otro lado, el modo monitor permite a un computador con una tarjeta inalámbrica monitorizar todo el tráfico que recibe sin ningún tipo de filtro. A diferencia del modo promiscuo, el modo monitor permite capturar paquetes de distintos puntos de acceso o de redes Ad-Hoc sin una previa asociación a la red por parte de la tarjeta, es decir, un adaptador inalámbrico en modo promiscuo sólo subministrará los paquetes relacionados con el BSS ID del AP al que se ha unido, mientras que en modo monitor subministrará todos los paquetes de los distintos BSS ID que tiene a su alcance. Este modo sólo puede ser aplicado a las tarjetas de red inalámbricas, mientras que el modo promiscuo puede ser usado en ambas (también en las no inalámbricas). De alguna forma, podemos decir que el modo monitor es una extensión específica del modo promiscuo para las tarjetas wireless.

En resumen, el modo promiscuo no es lo mismo que modo monitor. ¿Sorprendido? Es cierto que en muchos sitios se dan por igual. Pero, ¡Pruébalo tú mismo! A continuación siguen algunos comandos que pueden resultarte de interés:

ifconfig wlan0 promisc

ifconfig wlan0 –promisc

 

ifconfig wlan0 down

iwconfig wlan0 mode Monitor

ifconfig wlan0 up

 

ifconfig wlan0 down

iwconfig wlan0 mode Managed

ifconfig wlan0 up

Captura paquetes con las distintas configuraciones de la tarjeta y verás los resultados. ¡Wireshark Power!

Sin más, vamos a ver el script mencionado. Esta vez, en lugar de tratar en primera instancia con el código fuente, primeramente veremos cuál es el resultado que nos muestra por pantalla:

execution_of_script

Notamos que en el ejecutable le indicamos la interfaz que debe utilizar, wlan0mon, el número de segundos que debe estar sniffando, 60, y finalmente el ESSID del cual nos interesa recolectar sus BSSIDs, eduroam. Con estos parámetros nos dará una lista de las direcciones MAC correspondientes a los puntos de acceso que ofrecen el SSID “eduroam”. Para los más curiosos, se introduce el SSID entre comillas (“”) para indicarle a python que interprete todo su contenido, en este caso, como sys.argv[3]. Nos resultará útil en el caso que el SSID contenga espacios.

Finalmente, vamos a ver el código fuente del script y comprobaremos que es extremadamente simple:

script_code

En la línea 23 se hace uso de la función sniff, en la cual se le indica la interfaz que debe utilizar, la función que se aplicará a cada paquete capturado, inspect_packet, y el número de segundos que debe estar sniffando.

La función inspect_packet primeramente comprueba si se trata de un beacon frame, mediante la línea 9. Si es cierto se procede a capturar el BSSID, correspondiente a la dirección 2 de la cabecera, source address. Una vez extraído, si éste no pertenece a los BSSIDs objetivo que ya han sido analizados, se procede a capturar su SSID para posteriormente compararlo con el que se ha introducido por parámetro, línea 13. Finalmente, en el caso de una correcta coincidencia, se añade a la lista de targets y se muestra por pantalla.

Quizás la línea más interesante del código es la número 12. Se le está indicando a python que queremos del paquete la capa beacon y su data. Es decir, se requiere de la capa beacon “hacia arriba”, ignorando la encapsulación de capas inferiores (capa 802.11 y demás). A partir de aquí, con payload se le indica que se requiere la siguiente capa (Information Element). Por último, se pide el campo info de ésta, el cual contiene el SSID de la red inalámbrica.

Espero que haya sido de vuestro interés.

Un saludo a todos.

Ferran Verdés