Python & Scapy: Modo monitor.

Hola:

logo

python & scapy = WLAN Hacking!

Vamos a utilizar la sencillez de python con el potencial de scapy para trabajar con redes inalámbricas de área local (WLAN). Para esta ocasión crearemos un script para poner nuestra interfaz inalámbrica en modo MONITOR o RFMON para no depender de la suite aricrack-ng ni de los complejos comandos del sistema GNU/Linux. ¿Que os parece?

1. Introducción.

Aprovechando las vacaciones de verano, estos días me encuentro probando algunas cosas con la Raspberry Pi para un proyecto que tengo entre manos… si no se tuercen las cosas creo que más adelante podré hablaros sobre el… Pero por ahora no quiero adelantar acontecimientos y dar pistas…

Ahora mismo me interesa ir cogiendo soltura con la automatización de ciertas tareas o procesos en lo que a un test de intrusión, auditoria o pentest se refiere, para estudiar su comportamiento y comprobar si me sirven para alguna de las ideas que tengo en mente.

A día de hoy son muchísimas las herramientas que existen para «jugar» con las redes LAN a través de Ethernet (IEEE 802.3), sin embargo, cuando hablamos de las redes WLAN (IEEE 802.11) la cosa cambia… sobre todo si dejamos a un lado la todopoderosa Suite Aircrack-ng… Por lo que voy a intentar realizar un viaje a través de los bosques de la programación en Python combinada con Scapy para poder probar algunas cositas contra las redes WLANs, de la que no existe mucha información al respecto.

El primer paso, para poder aventurarse en este viaje, no es otro que poder poner la tarjeta en modo monitor o RFMON.

Pero, antes de empezar, ¿Que es eso de modo MONITOR o RFMON?

El modo MONITOR o RFMON es un modo de funcionamiento en el que pueden trabajar algunas interfaces inalámbrica para poder «capturar» todos los paquetes que viajan por el medio (el aire), que sean alcanzables y que estén o no estén destinados a ellas.

Creo importante remarcar varias palabras de esta definición; algunas, capturar, medio, alcanzables, destinados, puesto que con ellos más a entender y comprender mejor este modo de trabajo tan peculiar de las tarjetas inalámbricas.

Algunas. No todas las tarjetas inalámbricas soportan este modo de funcionamiento. Que una tarjeta inalámbrica concreta entre en modo monitor va a depender de varios factores: El sistema operativo donde se ejecute, el chipset del dispositivo y sus controladores. Todos tienen que ser compatibles entre si.

NOTA: Prefiero no profundizar en el tema de las compatibilidades de las tarjetas. Es algo con lo que ya he tenido que lidiar en su momento en el Taller Hack Wi-Fi en la desaparecida revista @rroba. A parte, que hoy en día no es como antes, donde conseguir una tarjeta inalámbrica que fuese compatible con el modo monitor, con la inyección de paquetes, compatible con GNU/Linux y MS Windows y fuese portable era casi misión imposible. Con unas cuentas búsquedas en google podéis conseguir tarjetas compatibles o buscar información al respecto sobre todo esto.

Capturar. Difícil expresión para explicar… Por definición, una tarjeta de red, ya sea Ethernet o Wi-Fi, está configurada para que solo pueda recibir los paquetes que están destinados única y exclusivamente a ella y descartar todo lo demás. Con capturar me refiero al hecho ilegitimo de atrapar algo en contra de su voluntad, en este caso, capturar algo a lo que no se debería de tener acceso.

Medio. El medio en el que nos encontramos para poder propagar los paquetes. Sea cable en Ethernet o el aire en Wireless. Como es obvio, que el medio sea el aire permite que cualquiera pueda estar capturando todo el tráfico que enviamos, limitado tan solo por la distancia y el área de cobertura. No sucede lo mismo en red cableadas, donde para ello es necesario tener acceso físico a un punto de la red.

Alcanzables. Lo que decía en el punto anterior, que tengamos la tarjeta en modo monitor no quiere decir que vayamos a capturar todos los paquetes de todas las redes cercanas. Eso dependerá del canal utilizado, de la calidad de la señal, la distancia con el punto de acceso, zona de cobertura, etc. Por eso, en estos casos, dependiendo de lo que se busque un ataque de hombre en el medio o MITM (Man in the midle) puede resultar crucial para no perder ningún paquete.

NOTA: Seguramente muchos no le acabéis de encontrar sentido a esto. ¿Un ataque de MITM en un medio compartido como el aire?. Pues si, tiene mucho sentido. Imagínate que quieres realizar un sniffing de un determinado host que se encuentra más próximo al AP que el atacante. Incluso que el atacante se encuentre en una zona de cobertura lo bastante pobre como para no poder capturar todos los paquetes que se intercambian el AP y el hosts. Si realizamos un ataque de MITM todos los paquetes pasarán por el atacante y serán reenviados al host, si un paquete destinado al host no alcanza al atacante se tendrá que volver a enviar hasta que el atacante lo reciba, puesto que los paquetes enviados al host deben de pasar al por el atacante gracias al MITM.

Destinados. Lo que comentábamos antes, el funcionamiento habitual de una tarjeta de red es aceptar los paquetes que van destinados a ella y descartar todo lo demás. Por ejemplo, cuando estamos en una red de área local (LAN – Ethernet), en un medio compartido, utilizando un Hub, cuando un host A envia una paquete como destino el host B, lo que sucede es lo siguiente.

El host A genera un paquete con origen host A y destino host b.

El host A transmite el paquete a través de un tarjeta de red.

El hub recibe el paquete por una de sus bocas. Realiza copias de ese paquete y las transmite por todas las bocas a excepción de las bocas sin vida y la del emisor del paquete (host A).

El hots C, D, E, F… N reciben el paquete, comprueban el destino y descartan el paquete por que no va destinado a ninguno de ellos.

El host b, recibe el paquete porque va destinado a el.

Cuando nosotros ponemos una tarjeta de red en modo promiscuo, lo que estamos haciendo es aceptar todos los paquetes que vayan o no vayan destinados a nosotros.

A modo de curiosidad, en un medio conmutado, cuando utilizamos switches, el escenario cambia, los paquetes no viajan por todas las bocas, tan solo por la boca que tiene por destino, gracias a una tabla cache MAC-PORT que genera el switch. La única manera de poder realizar un snifing en este medio es a través de un MITM.

Vamos, que el modo monitor/rfmon es lo mismo que el modo promiscuo de una tarjeta de red… ¡A ver empezado por ahí!

Pues resulta que no. Es algo parecido en concepto, pero no es lo mismo a la hora de la verdad.

Cuando ponemos una tarjeta en modo promiscuo, podemos seguir conectados a la red para recibir y enviar paquetes, establecer conexiones,… y al mismo tiempo capturar todos los paquetes que con otros destinos.

En el modo monitor/frmon no ocurre lo mismo. No podemos estar conectados a la red y capturar paquetes. O una cosa o la otra, pero no es posible realizar las dos al mismo tiempo. A través del modo monitor, como dijimos, podemos capturar todo el tráfico Wi-Fi dentro del área de cobertura de la tarjeta, incluido el de otras redes Wi-Fi no relacionadas. Cuando estamos en este modo, depende del la tarjeta como comentamos anteriormente, también podemos inyectar paquetes.

Estás son las diferencias más significativas entre el modo monitor y el modo promiscuo.

 

2.- Modo monitor.

Existen varias maneras de poner una tarjeta inalámbrica en modo monitor, dependiendo del controlador o chipset de nuestra tarjeta inalámbrica. En todos los casos es imprescindible hacerlo como root (#).

2.1.- “WEXT” (Wireless Extensions).
Son unas de las extensiones del kernel de GNU/Linux más viejas para manejar interfaces inalámbricas.

Si nuestra interfaz inalámbrica es wlan0.

El proceso para poner la interfaz wlan0 en modo monitor es el siguiente:

  1. ifconfig wlan0 down. Bajamos la interfaz. La desactivamos.
  2. iwconfig wlan0 mode monitor. Ponemos la tarjeta inalámbrica en modo monitor.
  3. ifconfig wlna0 up. Levantamos la interfaz. La activamos.

Utilizaremos el mismo proceso para poner la tarjeta en modo estación o cliente, simplemente se sustituye mode monitor por mode managed.

 

2.2.- nl80211 – Paquete iwutils.
Son las nuevas extensiones inalámbricas de GNU/Linux que llegan para sustituir a las anteriores (año 1997).

A través del comando iw ponemos la interfaz mon0 en modo monitor a partir de wlan0.

  1. iw dev wlan0 interface add mon0 type monitor. Creamos la interfaz virtual mon0 a partir de wlan0.
  2. ifconfig mon0 up. Levantamos la interfaz mon0.

 

2.3.- Mediante armon-ng de la Suite Aircrack-ng.
Como sabéis también podemos poner la tarjeta en modo monitor a través de la Suite aircrack-ng.

airmon-ng start wlan0

Para eliminar el modo monitor:

airmon-ng stop mon0

 

2.4.- Nuestro script para el modo monitor.
Nosotros vamos a crear nuestro propio script para poner la tarjeta en modo monitor sin depender de la Suite aircrack-ng.

Pero antes, por curiosidad, vamos a ver «como lo hace» airmong-ng.

2.4.1.- ¿Como lo hace airmon-ng?
Si echamos un ojo al código de armon-ng podremos ver como hace el script para poner las tarjetas en modo monitor.

Código de arimon-ng desde Git Hub:
https://github.com/aircrack-ng/aircrack-ng/blob/master/scripts/airmon-ng#L507

Estas son las partes del código donde sucede la magia.

2

Mediante WEXT – iwconfig

 

1

Mediante wl – broadcom

 

4

Mediante iw – nl80211

 

3

Filtro de airmon-ng

Se puede concluir entonces que airmon-ng utiliza tres formas diferentes de poner una tarjeta en modo monitor.

2.4.2.- Nosotros a lo nuestro. modo_monitor.py.
Tenéis en el repositorio Git Hub del blog el script: modo_monitor.py.

En breve pondré una explicación.

Si tenéis alguna duda no dudéis en publicar todas vuestras inquietudes a través del sistema de comentario del post.

 

Referencias:
Linux Wireless Extensions (WEXT):
Documentación: https://hewlettpackard.github.io/wireless-tools/Linux.Wireless.Extensions.html

nl80211:
Documentación: https://wireless.wiki.kernel.org/en/users/documentation/iw

Publicado en Artículos, Netting, Python + Scapy + WLAN, Seguridad Informática
4 comments on “Python & Scapy: Modo monitor.
  1. qoixiop dice:

    El modo monitor y el modo promiscuo no son lo mismo :O
    Gracias por el articulo, esperare con ansia el siguiente

  2. […] toda la problemática. De todas formas, os dejo un enlace, donde hablo un poco sobre todo esto, a modo de introducción, seguro que os sirve si queréis repasar conceptos. También, a lo largo del presente artículo, os […]

  3. Jorge S. dice:

    Hola, soy nuevo en esto y estoy interesado en desarrollar herramientas con python, Mi preguntas es si quisiera usar este scrip para otros SO (Windows y Mac) que parte deberia modificar o que comandos deberia usar???.

  4. netting dice:

    Hola Jorge.

    Es una buena pregunta.

    Cada Sistema Operativo funciona de una forma diferente, cada tarjeta inalámbrica tiene su correspondiente controlador (drivers) y unas características concretas que permiten realizar ciertas cosas….

    Si te fijas, en este artículo utilizo GNU/Linux como sistema operativo. No es una decisión tomada a la ligera. Es un sistema operativo que nos permite un buen control sobre todo. Además las extensiones del sistema operativo permiten un buen control sobre el manejo de las interfaces inalámbricas, puesto que son compatibles con la mayoría de los controladores de las tarjetas inalámbricas y con suma facilidad nos permiten poner la tarjeta inalámbrica en modo MONITOR/RFMON. Aquí hay que recordar que no es un modo habitual de las tarjetas inalámbricas, que se utilice en su estado habitual…. por lo que algunos controladores oficiales no implementan esta funcionalidad…

    Cuando hablamos de otros sistemas operativos como MS Windows no existen unas extensiones o herramientas nativas del OS que nos permitan manejar directamente la tarjeta inalámbrica para ponerla en modo MONITOR/RFMON. Para ello es necesario utilizar software de terceros (la mayoría privados y de pago) o según el controlador que utilice la tarjeta inalámbrica buscar controladores o herramientas que nos permitan hacer estas cosas. Es decir, no existe una herramienta universal que valga para todas las tarjetas… más bien en función del chipset de la tarjeta y de su controlador, se busca una herramienta que permita manejarla como nos interesa. En el blog, se habla un poco sobre esto en algún post de hace tiempo…

    En otras palabras, en MS Windows habría que conocer el chipset de tu tarjeta inalámbrica, el controlador que utiliza, buscar la herramienta que nos permite poner la tarjeta en modo monitor y estudiar como funciona para después desde un lenguaje de programación lanzar las ordenes pertinentes. Pero si no me equivoco, siempre vas a tener un control limitado en función de lo que permite la herramienta… Otra opción más compleja es desarrollar un controlador propio para manejar a más bajo nivel la tarjeta inalámbrica…

    Referente a MAC, su cercanía a GNU/Linux (Ambos están basados en UNIX) nos permite un mejor manejo de los interfaces inalámbricas… Pero desconozco a que nivel, su compatibilidad, etc. Por lo que habría que estudiarlo también a parte.

    Este artículo no pretende ser una guía definitiva sobre el manejo de extensiones inalámbricas. Tan solo pretende mostrar al lector como se maneja una tarjeta inalámbrica a través de un OS determinado, utilizando unas herramientas nativas del OS que nos permiten un buen control sobre la interfaz para poder automatizarlas a nuestro gusto.
    Es decir, se explica como hacen las herramientas actuales para escuchar el aire y poner la tarjeta en modo monitor y poder escuchar todos los canales…
    Digamos que es una especie de análisis de como hacen las herramientas conocidas para poner la tarjeta en modo monitor y escuchar los diferentes canales.

    Un saludo.
    PD: Espero haberte aclarado algo.

Deja un comentario

Nº de visitas:
  • 205.816 Visitas

Cita celebre:
- Todos recaerán en la necesidad de conocer la única y presumible verdad que el gran embudo emana. (Sire Netting).