Reventando la autenticación de sistema abierto WEP

El objetivo de este post es ver cómo se obtiene la clave de una red WiFi protegida por autenticación de sistema abierto (Open System Authentication) mediante un ataque de fragmentación.

En primer lugar, voy a configurar el punto de acceso para que emplee este tipo de seguridad, adicionalmente, para estas pruebas iniciales, voy a quitar el filtrado MAC que, por otra parte, se cómo saltármelo.

Accedo al punto de acceso a través de la interfaz web de gestión y veo las opciones de seguridad:

Imagen20

Las opciones de seguridad tienen que ver, no sólo con la autenticación sino con el cifrado de la comunicación. Voy a establecer la opción WEP Open System y a definir la clave de acceso:

Imagen21

Como se ve voy a usar una clave de 40 bits (5 bytes) bien sencillita. Lo bueno que tiene LuCi es que, según vas escribiendo la clave, el color es rojo y se pone en negro cuando es una clave válida. Salvo y aplico la nueva configuración.

image

Como se ve, la configuración aplicada es cifrado WEP de sistema abierto empleando una clave de 40-bits.

En un post anterior, vimos la secuencia de autenticación y asociación de 802.11, voy a echarle un ojo a las tramas intercambiadas. Para ello, voy a conectarme con el cliente legítimo (Raspberry PI) y voy a capturar la secuencia de paquetes intercambiados con Wireshark.

image

La solicitud de autenticación:

image

La respuesta a autenticación desde el punto de acceso:

image

En la interfaz de administración del punto de acceso, vemos el cliente asociado a la WiFi:

image

Naturalmente, para el resto del ejercicio vamos a asumir que conocemos el BSSID, ESSID y canal del punto de acceso así como lo relativo a las características del cifrado y autenticación empleadas. Hemos visto cómo obtener esta información en posts anteriores.

Lo primero que hago es poner la interfaz en modo monitor en el canal del punto de acceso. Una vez configurada la interfaz lo que voy a hacer es una autenticación falsa con el punto de acceso. Recordemos que el mecanismo de autenticación es Open System lo que, en esencia, significa que no hay autenticación.

image

Para hacer esta autenticación falsa voy a utilizar el comando aireplay-ng con la opción 1 (autenticación falsa):

Screenshot from 2016-11-27 20-09-36

Los parámetros proporcionados al comando aireplay-ng significan:

-1. Autenticación falsa

0. Tiempo de re-asociación (en segundos)

-e HACKME_001. ESSID de la WiFi.

-a <bssid>. Dirección MAC del punto de acceso (BSSID).

-h <MAC>. Dirección MAC de la interfaz WiFi de la máquina atacante.

wlan1mon. Interfaz en modo monitor.

Y vemos, en el punto de acceso, que la estación atacante queda asociada:

image

La estación atacante ya está autenticada con el punto de acceso y asociada al mismo. Para intentar determinar la clave WEP, voy a empezar con un ataque de fragmentación (ya haré un post con la teoría). Para ello, utilizamos el comando aireplay-ng:

image

El resultado del ataque nos indica que hemos obtenido 1500 bytes del PRGA mediante el envío de fragmentos de un paquete. El keystream correspondiente se almacena en el fichero indicado.

Vamos a crear un paquete ARP y cifrarlo con el keystream obtenido en el paso anterior. Para ello usamos el comando packetforge-ng y vamos a cifrarlo (flag –y) con el PRGA obtenido en el paso anterior.

image

Una vez que tenemos el paquete ARP (arp-req) procedemos a inyectarlo en la red. En una nueva ventana de terminal, lanzo el comando airodump-ng para capturar las respuestas a los paquetes ARP que voy a ir inyectando:

image

image

Lanzamos, en la primera ventana de terminal, el comando aireplay-ng para inyectar los paquetes ARP en la red:

image

Vemos que se va incrementando el contador de paquetes enviados y, en la salida del comando airodump-ng (segunda ventana), que aumenta el número de paquetes lanzados por nuestra estación.

Finalmente, abrimos una tercera ventana de terminal y lanzamos el comando aircrack-ng para intentar obtener la clave WEP empleada para el cifrado a partir del fichero de capturas obtenido por airodump-ng:

image

Hemos tenido éxito. Comprobamos que la clave funciona conectándonos a la WiFi desde Kali.

image

image

El cifrado WEP

En el post anterior proporcioné una introducción a la seguridad WEP en redes inalámbricas, en este post vamos a ver el detalle de cómo funciona el cifrado WEP y cuáles son las vías para atacarlo. El cifrado WEP se basa en el algoritmo RC4.

RC4 es un cifrador de flujo (stream cipher) muy simple que emplea dos algoritmos: un algoritmo de planificación de claves (KSA por sus siglas en inglés) y un generador de números seudoaleatorios (PRGA por sus siglas en inglés).

Sin entrar en muchos detalles de funcionamiento, el generador de números seudo-aleatorios se inicializa empleando la clave que es un secreto compartido entre los dos extremos de la comunicación. El cifrado se realiza mediante una operación de disyunción exclusiva (XOR) entre los bytes del mensaje y los bytes seudo-aleatorios de la secuencia generada por el algoritmo RC4. El descifrado en el extremo opuesto se realiza haciendo la operación XOR entre los bytes del mensaje cifrado y la secuencia de bytes seudo-aleatorios generados por el algoritmo RC4 en el extremo receptor que deberá ser la misma que la empleada en el extremo emisor.

El cifrado WEP se aplica, exclusivamente, a la porción de datos contenidas en las tramas de datos 802.11. Las cabeceras y las tramas de gestión se envían en claro. Tal y como vimos, WEP emplea un secreto compartido de 40 bits o 104 bits. A este secreto compartido se le prepone un vector de inicialización (IV) de 24 bits y el conjunto se utiliza como semilla para la inicialización del algoritmo de planificación de claves (KSA) de RC4.

En el cifrado de los datos de las tramas de datos 802.11 se calcula una suma de comprobación (CRC32) sobre los datos a retransmitir y los cuatro bytes resultantes se añaden al final de los datos. El conjunto de datos y suma de comprobación se cifra mediante una operación de disyunción exclusiva (XOR) entre los datos originales (incluyendo la suma de comprobación) y la secuencia de bytes que se obtiene del PRGA de RC4. El descifrado se hace de forma análoga, al descifrar se emplea la suma de comprobación para verificar que el proceso de descifrado ha sido correcto.

Resultado de imagen de WEP Encryption

En teoría, ambos extremos de la comunicación tienen que conocer tanto el secreto compartido como los vectores de inicialización para poder reconstruir el mensaje original.

image

El vector de inicialización viaja en claro en cada trama codificada con WEP mientras que el secreto compartido se establece durante la configuración inicial de los puntos de acceso y estaciones.

Sin embargo, en la práctica, lo que se usa para cifrar son las secuencias de números seudoaleatorios generados por el PRGA por lo que si somos capaces de obtenerlas, podremos descifrar el tráfico de la red sin necesidad de conocer el secreto compartido. El obtener los PRGA es, por lo tanto, uno de los objetivos en los ataques al cifrado WEP.

Para cifrar, lo que se hace es una operación XOR entre los bits del mensaje y los bits generados por el PRGA. En el caso de las operaciones XOR existen las siguientes relaciones:

image

Por lo tanto, si conocemos un texto en claro y el mismo texto cifrado, podemos obtener el PRGA empleado para el cifrado mediante una simple operación XOR. Una vez conocido el PRGA, podremos descifrar los mensajes cifrados con el vector de inicialización usado.

El problema es, por lo tanto, ser capaces de conseguir el suficiente número de PRGAs para poder descifrar las tramas intercambiadas y esto, como veremos, requiere el conocimiento de los mensajes en claro y la obtención de los correspondientes mensajes cifrados.

En los siguientes posts veremos algunas técnicas para obtener esta información.

Esnifando tramas 802.11

Con el entorno ya montado, lo primero que voy a hacer va a ser capturar información de las tramas 802.11 que circulan en el espacio radioléctrico de mi casa. Por supuesto, me voy a limitar a mis propios puntos de acceso (redes WLAN domésticas y la WLAN de lab) ya que, de otra forma, estaría incurriendo en una ilegalidad flagrante. Espero que si alguien lee esto, sea consciente de la responsabilidad que adquiere al montar un entorno como éste.

Por otra parte, dado que voy a estar jugando con estos temas un tiempo he decidido substituir la interfaz USB Belkin Wireless G F5D7050 por una más moderna Alfa AWUS036H con antena de 5dBi:

31vwECQvXoL

Una vez conectada y realizada la configuración básica de red con la interfaz instalada como wlan1, tenemos lo siguiente:

Screenshot from 2016-11-01 13-08-34

Voy a probar las capacidades de escaneo de la nueva interfaz mediante el comando iwlist. Lo que veo es que capta muchas redes WiFi próximas:

Screenshot from 2016-11-01 13-13-24

Por último, antes de meternos en mayores profundidades, conviene recordar los detalles de las tramas 802.11 que vamos a capturar. El estándar 802.11 define tres tipos de tramas (más detalles aquí):

a) Tramas de gestión

Se encargan de la gestión de la comunicación entre los puntos de acceso y los clientes. Existen distintos tipos de tramas para controlar aspectos tales como la autenticación, las solicitudes de asociación y desasociación de puntos de acceso, tramas de faro (beacon) de los puntos de acceso, etc. En estas es en las que vamos a estar, en general, más interesados para la penetración en la red.

b) Tramas de control

Se encargan de asegurar el intercambio apropiado de datos entre los clientes y los puntos de acceso, permitiendo arbitrar el acceso al medio compartido.

c) Tramas de datos

Son las que transportan los datos intercambiados por los clientes.

La estructura de campos de las tramas 802.11 se presenta en la siguiente imagen:

802dot11_frame

Para empezar a capturar tramas, vamos a poner la interface (wlan1) en modo monitor. Para ello vamos a utilizar el script airmon-ng de la suite de herramientas aircrack-ng. En, primer lugar, vamos a comprobar si la interfaz que vamos a utilizar para captura es visible para airmon-ng ejecutando el script sin argumentos:

Screenshot from 2016-11-01 19-54-15

Vemos que aparece la interfaz wlan1, vamos a ponerla en modo monitor. Para ello, lanzamos el comando airmon-ng start wlan1:

Screenshot from 2016-11-01 19-56-57

El script crea una nueva interface en modo monitor (wlan1mon), esto se puede ver volviendo a ejecutar el script airmon-ng sin argumentos y, por supuesto, mediante el comando iwconfig.

Screenshot from 2016-11-01 19-59-48

Bien, ya tenemos la interface configurada en modo monitor, ahora, lo que tenemos que hacer es empezar a capturar los paquetes para analizarlos.

Para hacer la captura voy a utilizar el archiconocido programa Wireshark. Lanzamos desde la línea de comandos la ejecución del programa en segundo plano (wireshark &) y nos aparece la ventana principal del programa:

Screenshot from 2016-11-02 07-44-39

Seleccionamos la interface a través de la que se van a capturar los paquetes (wlan1mon) y pulsamos la aleta de tiburón azul de la parte superior izquierda para empezar la captura:

Screenshot from 2016-11-02 07-44-59

En pocos momentos, se puede capturar una gran cantidad de paquetes, sobre todo si hay distintas WLAN y éstas tienen una gran cantidad de tráfico. Vamos a emplear la funcionalidad de filtrado de Wireshark para ver sólo los paquetes de nuestro punto de acceso (BSSID = 00:11:50:86:64:ab):

Screenshot from 2016-11-02 08-09-29

Ahora vamos a ver sólo las tramas de gestión. Las tramas de gestión tienen el subcampo campo ‘type’ del campo Frame Control (fc) a 0:

Screenshot from 2016-11-02 08-13-25

Modificando el filtro podemos ir viendo los distintos tipos de tramas.

Ahora vamos a iniciar el ejercicio de capturar las tramas de la WLAN lab. Voy a asumir que, lo único que conozco es el SSID de la red (que es “HACKME_001”). Para capturar las tramas de esa WLAN necesito dos cosas:

  • El BSSID de la red (dirección MAC del punto de acceso).
  • El canal radio que emplea.

Lo primero que hago es poner la tarjeta en modo monitor:

Screenshot from 2016-11-04 15-37-50

A continuación lanzo el comando airodump-ng wlan1mon para ver las redes que detecta mi tarjeta y obtener la información precisa de la red cuyas tramas quiero capturar:

Screenshot from 2016-11-04 15-40-06

De la salida del comando puedo obtener el BSSID y el canal (9 en mi caso). Ahora sintonizo la monitorización a ese canal:

Screenshot from 2016-11-04 15-50-46

Lanzo una serie de pings desde la raspberry para generar tráfico en la red y lanzo Wireshark:

Screenshot from 2016-11-04 16-03-46

Ahora puedo ver las tramas que el punto de acceso devuelve a otros clientes de la red (en este caso la Raspberry) puedo obtener información interesante como las direcciones IP y direcciones MAC de los clientes y todo esto de forma silenciosa, sin hacer notar mi presencia. Esto era fácil porque el punto de acceso está completamente abierto y no emplea cifrado.

Empleando a fondo las capacidades de Wireshark, podríamos reconstruir conversaciones TCP y capturar información relevante intercambiada.

Preparando un lab para pen-testing WiFi

Tras haber conseguido que la Raspberry Pi consiga hablar con una máquina virtual Kali y sea capaz de capturar las tramas 802.11 y enviarlas para su análisis al Kali, voy a empezar a auto-educarme en pruebas de penetración en redes inalámbricas. Para ello, voy a montar un entorno de lab sobre la base de la cacharrería que tengo por casa.

En primer lugar, como punto de acceso WiFi voy a utilizar mi viejo router Belkin F5D7632-4. El router lo he reseteado a los settings por defecto y lo configuraré para que haga de punto de acceso inalámbrico.

DCP_1498

Como máquina atacante voy a emplear un viejo Dell Latitude E6400 con la batería estropeada al que le he añadido una interfaz wireless adicional USB que tenía por casa (una Belkin Wireless G F5D7050) ésta la voy a usar para comunicarme con el equipo y la tarjeta wireless interna (PCI) la usaré para monitorizar la red. Al equipo le voy a montar un Kali Linux que arranque desde un pincho USB en el que grabé la imagen con Rufus.

dell-e6400

Belkin_F5D7050_Wireless_G_USB_Network_470079

Finalmente, la máquina atacada va a ser la Raspberry Pi Model B:

Pi2ModB1GB_-comp

Voy a ir relatando los pasos que voy a seguir para configurar el entorno de pruebas para que cuando tenga que volver a hacerlo, poder emplear este post como referencia.

1. Configuración del Router

Empecemos con el router. Para arrancar limpiamente, he reseteado el router al estado inicial de fábrica , me conecto con un cable ethernet y arranco la interfaz de administración (en el caso del Belkin hay que conectarse a la IP 192.168.2.1).

Lo primero que hago es establecer una contraseña de administrador y, a continuación, configuro los parámetros de la LAN incluyendo la configuración de DHCP. Para el lab, voy a emplear la clase C privada 192.168.200.0/24.

Imagen4b

Al aplicar los cambios necesito volver a conectarme (he cambiado la red y la dirección del router). Hago login con mi nueva contraseña y paso a configurar la WiFi. Establezco el SSID (HACKME_001) y el canal (9) de forma que no haya conflictos con otras WiFis de los alrededores:

Imagen2b

Inicialmente quito la seguridad:

Imagen3b

2. Configuración del PC

Voy a configurar ahora el PC. Como ya comenté antes, mediante el programa Rufus, cree una imagen arrancable de Kali (version 2016-2) en un pincho USB. Los pasos que sigo son:

  1. Configurar la BIOS para que el PC arranque desde un puerto USB
  2. Conectar el pincho con la imagen arrancable a un puerto USB.
  3. Conectar, a otro puerto USB, la tarjeta WLAN.

Una vez completado esto, pulso el botón de ON y, el PC arranca y aparece el desktop de Kali.

Imagen5a

A continuación, voy a ver qué interfaces tiene el PC. Debería tener dos interfaces wireless LAN. Para verlo, lanzo el comando ifconfig.

Screenshot from 2016-07-25 19-59-34

Efectivamente, aparecen dos interfaces: wlan0 y wlan1 pero ahora necesito saber cuál es cuál. Empleando los comandos lsusb y lspci averiguo que la interfaz interna es una Intel Corporation WiFi Link y que la conectada en el puerto USB es una Belkin F5D7050 Wireless G Adapter pero sigo sin saber cuál es wlan0 y cual wlan1. Otros comandos (iwconfig, dmesg) siguen sin aclararme las dudas pero, finalmente, yendo al directorio /sys/class/net consigo aclararme, parece que wlan0 es la interfaz PCI y wlan1 la interfaz USB.

Screenshot from 2016-07-25 20-05-04

Screenshot from 2016-07-25 20-05-33

Screenshot from 2016-07-25 20-23-25

Le echo un ojo a lo que dice iwconfig. Voy a usar wlan0 para hacer de monitor y wlan1 para conectarme a la red doméstica y, por lo tanto, a Internet.

Screenshot from 2016-07-25 20-25-36

Ahora toca configurar las interfaces de red. Esto lo hago a través de la interfaz gráfica. La interfaz wlan1 (la que voy a usar para conectarme al mundo) la configuro con una dirección IP estática (me facilita la vida para conectarme al equipo por SSH) y la interfaz wlan0 usará una dirección IP dinámica obtenida del router Belkin:

Imagen6

Pruebo que haya conexión a todos lados:

Imagen7

Instalo el servidor open-ssh para poder acceder en remoto, lo configuro y compruebo que accedo:

Screenshot from 2016-07-25 21-16-34

Imagen5b

Rearranco y … ¡cagada!, arranqué la imagen como Live (amd64) y debería haberla arrancado como Live USB Persistence (amd64), toda la configuración realizada se fue al garete. ¡Suerte que tengo todos los pasos documentados!, no tengo más que repetir lo que acabo de hacer.

Segunda cagada, necesito seguir las instrucciones que dicen como crear una imagen persistente de Kali así que, de nuevo, a repetir todo el proceso.

Finalmente, a la tercera fue la vencida, ya se mantienen los settings entre arranques aunque queda por configurar que pida contraseña al arrancar y cambiar la contraseña de root. Para hacer esto, sigo los pasos que se identifican aquí y me pide usuario y contraseña para entrar.

El último aspecto que dejo para más adelante es el de la fecha y hora. El portátil no la mantiene y es un rollo tener fecha de hace seis meses.

Conseguida la configuración de la máquina atacante.

3. Configuración de la Raspberry Pi

Aquí la configuración a realizar debería ser, simplemente, la relacionada con la tarjeta WiFi. Como esto no parece muy complicado, empiezo intentando encontrar una forma de cambiar de conectarme a distintas redes WiFi sin necesidad de tocar ficheros de configuración ni rearrancar el aparato. En casa tengo dos puntos de acceso (router de banda ancha y repetidor WLAN) y, además, los de los routers que utilizo para pruebas y si salgo fuera, necesito poder configurar las WiFi de forma fácil.

Hay bastantes respuestas en Internet para cambiar de WiFi automáticamente pero no consigo encontrar una que me permita hacerlo de forma manual. Lo que consigo es liarme y perder tres días jugando con los ficheros de configuración. Finalmente he decidido mantener distintos juegos de ficheros de configuración y reemplazarlos y rearrancar cuando sea necesario. Sin embargo, me queda buscar una solución para esto y lo anoto como una tarea a futuro.

He configurado que la Rasp tenga una dirección IP estática dentro del rango de la clase C del lab. En concreto, la 192.168.200.2. A continuación pongo los fragmentos de los ficheros de configuración que he tenido que tocar:

  • Fichero: /etc/network/interfaces

Imagen8

  • Fichero /etc/dhcpcd.conf

Imagen9

  • Fichero /etc/wpa_supplicant/wpa_supplicant.conf

Imagen10

Rearranco la Rasp y vamos a ver qué configuración tiene y si hay conectividad con los restantes elementos de la WiFi:

Imagen11

Imagen12

Imagen13

Vamos a probar que hay conectividad desde el Kali a la Rasp:

Imagen14

¡Conseguido!