Implementación de una red inalámbrica segura usando GNU/Linux y WPA

Imagen de pepo

Espero que podamos aprovechar este HowTo, estuvo por mucho tiempo perdido con otros documentos incompletos que tengo, pero ahora he visto la necesidad de sacarlo no solo porque es una buena práctica el tener aseguradas nuestras redes inalámbricas, pretendo también entregarles una segunda parte donde veremos como una contraseña débil hace inútil el uso de WPA-PSK. En fin, espero les guste.

HOla...

El uso de tecnologías inalámbricas simplifica mucho en cuanto a la infraestructura y topología de una red LAN (e incluso MAN), pero, no debemos descuidar la seguridad sobre estas redes. Es muy común dejar de lado la seguridad en este tipo de redes, sobre todo por parte de esos administradores que deberían dedicarse a limpiar los dispositivos y nada más.

Este documento en ninguna forma pretende explicar detalladamente conceptos y aspectos sobre las redes inalámbricas y/o su seguridad, he incluido algunos conceptos para aquellos que deseen saber un poco más. Talvez en un futuro vaya mejorando el documento con la incorporación de información sobre el tema.

[color=#FF0000][size=30]Descripción:.[/size][/color]

Necesité establecer una red en toda la casa (o edificio) con todos los computadores, decidí usar el protocolo 802.11g que me permite una transmisión de 54Mbps de manera inalámbrica, y, usando los modos especiales de los equipos D-Link puedo usar hasta 128Mbps; más que suficiente ya que la red no es usada para alto tráfico. Además espero poder adquirir sistemas que soporten 802.11n (ahora está en el borrador 2.0) lo que me daría un máximo teórico de alrededor de 248x2Mbps.

[color=#FF0000][size=30]El problema:.[/size][/color]

Conozco muchos de esos "sabios” que dejan sus redes sin ningún tipo de codificación y luego la culpa de un acceso no autorizado la tuvo el sistema. La idea es que todos los sistemas cercanos tengan acceso pero tengamos un control (teórico) sobre cuales son estos dispositivos y ningún otro sistema pueda acceder a esta red o incluso salir hacia Internet por la pasarela de la red.

[color=#FF0000][size=30]La solución:.[/size][/color]

Usaré un sistema GNU/Linux Debian Lenny como Punto de Acceso de la red, en dónde tengo una tarjeta D-Link DWL-G520 que usando Madwifi-ng va de película, para asegurar la transmisión usaré el sistema Hostapd con un intercambio de claves WPA-PSK.

[color=#FF0000][size=20]Estado final de la solución:.[/size][/color]

Un punto de acceso usando Debian; asegurando la transmisión con WPA-PSK una clave compartida tanto en los clientes como en el servidor autentifica a los primeros, el sistema mantendrá una clave diferente por MAC como no deseo dar acceso a direcciones MAC no registradas todas estas serán rechazadas. Para terminar y ya desde capa 3 tendré un servidor DHCP que asignará una dirección IP única a cada MAC.

[color=#FF0000][size=20]¿Qué busco?[/size][/color]

Un estado de seguridad a nivel de capa 2 fuerte, y, por último un pequeño impedimento a nivel de capa 3 al usar DHCP con direcciones estáticas.

[color=#FF0000][size=30]Un poco de bases:.[/size][/color]

[color=#FF0000][size=20]Estándares inalámbricos:.[/size][/color]

La implementación de redes inalámbricas a tenido un gran repunte ya que facilita la vida de aquellos que las están implementando. Según la IEEE la familia de protocolos que regulan o definen las tecnologías de redes de areal local (LAN) son los protocolos 802.X en este caso específico el protocolo 802.11 se encarga de regular la capa física y de enlace de datos en las redes inalámbricas o conocidas como WLAN.

Existen 3 especificaciones más populares dentro del protocolo 802.11 y son: a, b y g.

  • La especificación 802.11a entre otras cosas permite una transmisión máxima teórica de 54Mbps y opera en la banda 5 Ghz.
  • La especificación 802.11b permite una transmisión máxima teórica de 11 Mbps y opera en la banda de 2,4-2,5 Ghz.
  • La especificación 802.11g permite una transmisión máxima teórica de 54 Mbps y opera en la banda de 2,4-2,5 Ghz.

Sin duda estamos esperando el estándar 802.11n que permitiría una transmisión máxima teórica de 248x2Mbps en la banda de 2,4 y/o 5 Ghz; ya existen en el mercado equipos que cumplen con el segundo borrador de este estándar y prometen compatibilidad cuando el estándar sea terminado.

[color=#FF0000][size=20]Seguridad en redes inalámbricas:.[/size][/color]

El gran auge de las redes inalámbricas y su simplicidad han traído consigo una gran debilidad en la seguridad, y no porque esta no pueda ser implementada o sea difícil. Es más bien por una inexplicable confianza sobre todo porque la mayoría de Puntos de Acceso (Access Point – AP) son usados con su configuración predeterminada, la misma que en la mayoría de los casos viene sin ningún tipo de seguridad, pese a que el equipo pueda mantener una fuerte línea de seguridad en nuestra transmisión.

Como cualquier red existen varias formas de asegurar la transmisión de datos, pero veremos dos (o mejor dicho tres) maneras propias del estándar 802.11 que son WEP y WPA (dos versiones).

[color=#FF0000][size=20]Wired Equivalent Privacy – WEP:.[/size][/color]

Este sistema está basado en RC4, Rivest Cipher 4, pero como el nombre de su creador es Ron Rivest al mismo acrónimo se da el significado de Ron's Code 4. Este sistema usa claves de 64 ó 128 bits (en ambos casos usa vectores de inicialización de apenas 24 bits); básicamente se fundamenta en XOR por lo que si tuviéramos dos mensajes con el mismo vector de inicialización (IV) entonces podríamos saber la clave, y esa es la gran falla que hace de WEP (recordemos que el IV es de solo 24 bits) por sí solo un protocolo muy débil. El algoritmo fue publicado anónimamente sin permiso en la lista de correo Cypherpunks y de allí por todo el Internet, RC4 es marca registrada así que cualquier implementación del algoritmo no puede usar el nombre RC4.

[color=#FF0000][size=20]Wi-Fi Protected Access – WPA:.[/size][/color]

Como hemos comentado WEP es un protocolo débil para mantener la seguridad en la transmisión, sobre todo por la reutilización del vector de inicialización; así que era necesario la aparición de un protocolo más robusto, y este es WPA, el cuál implementa la mayoría del estándar 802.11i que es el estándar para la seguridad de las transmisiones WLAN.

WPA aparece porque aún no estaba finalizado el estándar 802.11i y fue creado por la Alianza Wi-Fi (Wi-Fi Alliance). Este protocolo fue diseñado para usar sistemas Radius pero también tiene un esquema de clave pre-compartida (pre-shared key – PSK).

Existen tres grandes diferencias con WEP y son las razones por lo que es mucho más robusto:

  • WPA sigue usando RC4 pero con IV de 48 bits y una clave de 128 bits.
  • WPA implementa un Protocolo de Integridad de Clave Temporal (Temporal Key Integrity Protocol – TKIP), cambiando las claves a medida que se envían tramas.
  • WPA usa MIC en lugar de CRC que es un código de integridad de mensaje evitando la alteración de información y actualización del CRC sin concer la clave.

WPA cuando usa un sistema Radius es conocido como WPA-Enterprise, en cambio cuando usa el sistema de clave pre-compartida es conocido como WPA-Personal.

WPA2, este protocolo es el nombre otorgado a la implementación del estándar 802.11i y usa el algoritmo de cifrado AES (Advanced Encryption Standard).

[color=#FF0000][size=20]Elección de clave:.[/size][/color]

Este es un paso crucial en la seguridad de cualquier sistema, con una clave débil no importará el sistema de cifrado que tengamos y en eso se basa el ataque-0 que se puede hacer a WPA (ese es mi siguiente HowTo). Alguna vez un "experto” en seguridad me comentó como hacer claves fuertes cuando la dimensión de la clave no debe ser muy larga: simplemente usamos las primeras letras y números de una frase que nunca olvidaremos, así:

[b]M[/b]i [b]c[/b]lave [b]t[/b]iene [b]@[/b] [b]y[/b] [b]/[/b] [b]s[/b]on [b]2[/b] [b]s[/b]ignos ==> [b]Mct@y/s2s[/b]

Espero les sirva.

[color=#FF0000][size=30]Esquema a utilizar:.[/size][/color]

A continuación presento un breve diagrama de la topología a utilizar en la red:

WPA-PSK
Figura 1: Topología usando un AP con WPA-PSK

Los AP funcionan en la capa 2 del modelo OSI.

[color=#FF0000][size=30]Hostapd:.[/size][/color]

Este demonio trabaja en espacio de usuario, les recuerdo que existe un espacio de memoria virtual para cada proceso en espacio de usuario, lo que da un gran esquema de seguridad en los sistemas como GNU/Linux.

El demonio de Hostapd no solo soporta la autenticación establecida en el estándar 802.11i, tiene soporte para una gran variedad de formas de autenticación y en realidad no lo hemos usado en conjunto con Radius porque para la descripción del problema presentado no requiere ese grado de complejidad, sin embargo, lo podremos abordar en otra ocasión.

[color=#FF0000][size=20]Fichero de configuración de hostapd[/size][/color]

A continuación presentaré el fichero de configuración /etc/hostapd/hostapd.conf con la indicación de que significan los parámetros más importantes:

[code]
# Definimos el interfaz que usamos para nuestro enlace inalámbrico.
interface=ath0
# Los controladores pueden ser hostap/wired/madwifi/prism54, pero yo uso madwifi-ng para mi tarjeta
driver=madwifi
# Lo siguiente son niveles de información sobre eventos que ocurren con nuestro AP.
logger_syslog=-1
logger_syslog_level=0
logger_stdout=-1
logger_stdout_level=2
# Que tanta información queremos. (He escogido 4 que abarca todo para tener suficiente información)
debug=4
# Archivo core que guardará información cuando el sistema reciba una señal SIGUSR1
dump_file=/tmp/hostapd.dump
# Servirá si tengo un interfaz gráfico que quiera acceder al control
ctrl_interface=/var/run/hostapd
# El grupo que puede modificar la configuración del AP, yo solo lo hago como root (sudo)
ctrl_interface_group=0
# SSID (Service Set Identifier) Es el identificador de nuestra red.
ssid=Pepo
# Modo de operación, he usado 802.11g pero he visto que no hay cambios si uso 802.11b
hw_mode=g
# ¿??
channel=60
# Intervalo de anuncio de nuestra red.
beacon_int=100
# Cuántos DTIM (Delivery Traffic Indication Message) se enviarán hasta enviar un beacon.
dtim_period=2
# Indicador de cuantas estaciones podemos aceptar.
max_num_sta=255
# ¿??
rts_threshold=2347
# ¿??
fragm_threshold=2346
# Aceptamos direcciones MAC a menos que tengamos una lista de denegadas.
macaddr_acl=0
# Uso los dos algoritmos de autenticación: Open System Authentication, Shared Key Authentication.
auth_algs=3
# Enviamos SSID nulos, para no publicar nuestra red. (En realidad siempre la he publicado :()
ignore_broadcast_ssid=1
# Wireless Multimedia Extensions, se supone que habilita QoS en Wi-Fi
wme_enabled=1
# Low priority / AC_BK = background
wme_ac_bk_cwmin=4
wme_ac_bk_cwmax=10
wme_ac_bk_aifs=7
wme_ac_bk_txop_limit=0
wme_ac_bk_acm=0
# Note: for IEEE 802.11b mode: cWmin=5 cWmax=10
#
# Normal priority / AC_BE = best effort
wme_ac_be_aifs=3
wme_ac_be_cwmin=4
wme_ac_be_cwmax=10
wme_ac_be_txop_limit=0
wme_ac_be_acm=0
# Note: for IEEE 802.11b mode: cWmin=5 cWmax=7
#
# High priority / AC_VI = video
wme_ac_vi_aifs=2
wme_ac_vi_cwmin=3
wme_ac_vi_cwmax=4
wme_ac_vi_txop_limit=94
wme_ac_vi_acm=0
# Note: for IEEE 802.11b mode: cWmin=4 cWmax=5 txop_limit=188
#
# Highest priority / AC_VO = voice
wme_ac_vo_aifs=2
wme_ac_vo_cwmin=2
wme_ac_vo_cwmax=3
wme_ac_vo_txop_limit=47
wme_ac_vo_acm=0
# Funcionalidad con WinXP
eapol_key_index_workaround=0
# Por ahora, no usamos un servidor RADIUS
eap_server=0
# Dirección local del AP.
own_ip_addr=127.0.0.1
# Los algoritmos que serán usados por WPA: yo uso WPA y IEEE 802.11i/RSN (WPA2)
wpa=3
# *Fichero donde grabaremos las MAC permitidas y sus contraseñas.
wpa_psk_file=/etc/hostapd/macs_wpa_psk
# Como haremos el manejo de llaves.
wpa_key_mgmt=WPA-PSK
# Sistemas de encriptación para las llaves:
# CCMP = AES in Counter mode with CBC-MAC [RFC 3610, IEEE 802.11i/D7.0]
# TKIP = Temporal Key Integrity Protocol [IEEE 802.11i/D7.0]
wpa_pairwise=TKIP CCMP
[/code]

La configuración del AP está casi lista, ahora debemos crear el fichero [b]/etc/hostapd/macs_wpa_psk[/b]. Recordemos que el sistema es pequeño así que tendremos todas las MAC permitidas en este fichero, junto con sus respectivas claves:

[code]
00:11:22:FF:EE:DD [color=#FF0000]entradas[/color]
33:44:55:CC:BB:AA [b]C14v3 Mct@y/s2s[/b]
[/code]

Recordemos como podríamos elegir las contraseñas, la segunda es una buena contraseña en tanto que la primera es sumamente débil y a pesar de usar WPA podría ser crackeada con un ataque de diccionario y un ataque 0 (Ese será mi siguiente HowTo ;))

En el fichero [b]/etc/hostapd/macs_wpa_psk[/b] podríamos agregar una línea al final para permitir el acceso a todas la MAC.

[code]
00:00:00:00:00:00 clave
[/code]

[color=#FF0000][size=20]Configuración de la interfaz de red inalámbrica[/size][/color]

Teniendo lista la configuración del AP, ahora debemos preparar la interfaz inalámbrica de nuestro Debian, para eso editamos el fichero [b]/etc/network/interfaces[/b]

[code]
auto ath0
iface ath0 inet static
pre-up wlanconfig ath0 destroy
pre-up wlanconfig ath0 create wlandev wifi0 wlanmode ap
pre-up iwconfig ath0 channel 6
post-down wlanconfig ath0 destroy
wireless-mode master
address 192.168.1.1
netmask 255.255.255.0
network 192.168.1.0
#gateway 192.168.1.1
[/code]

La mayoría de AP usan el canal 6, sin embargo, recuerdo haber leído que es mejor el canal 9, ustedes prueben el que mejor les resulte.

[color=#FF0000][size=20]DHCP:.[/size][/color]

Casi hemos terminado, ahora lo que yo tengo es el fichero [b]/etc/dhcp3/dhcpd.conf[/b] configurado para asignar direcciones IP fijas a MACs establecidas, esto es una seguridad muy pero muy básica, y, en lo personal me sirve para controlar con iptables, iproute y otros, el ancho de banda así como los servicios permitidos:

[code]
# El demonio DHCP solo entregará direcciones sobre la interfaz inalámbrica.
INTERFACES="ath0";
ddns-update-style none;
# DNS de mi red.
option domain-name-servers 111.222.333.0, 111.222.333.1;
default-lease-time 600;
max-lease-time 7200;
log-facility local7;
subnet 192.168.1.0 netmask 255.255.255.0 {
range 192.168.1.4 192.168.1.4;
option domain-name-servers 111.222.333.0, 111.222.333.1;
option domain-name "nadie.org";
option routers 192.168.1.1;
default-lease-time 600;
max-lease-time 7200;
}
host alfa {
hardware ethernet 00:11:22:FF:EE:DD;
fixed-address 192.168.1.3;
option domain-name-servers 111.222.333.0, 111.222.333.1;
option domain-name "nadie.org";
option routers 192.168.1.1;
}
host beta {
hardware ethernet 33:44:55:CC:BB:AA;
fixed-address 192.168.1.2;
option domain-name-servers 111.222.333.0, 111.222.333.1;
option domain-name "nadie.org";
option routers 192.168.1.1;
}
[/code]

Listo, nuestro AP estará listo para atender las peticiones de nuestra red.

[color=#FF0000][size=30]Configuración de clientes:.[/size][/color]

[color=#FF0000][size=20]Win2 :([/size][/color]

Para la configuración en win2, nos vamos por:

[code]
Inicio >
Conectar a >
Mostrar todas las conexiones
[/code]

En el menú izquierdo vamos a Ver redes inalámbricas, escogemos nuestra red y tratamos de conectarnos, nos deberá pedir la contraseña y eso es todo porque nuestro DHCP asignará las direcciones que necesitamos.

[color=#FF0000][size=20]GNU/Linux[/size][/color]

Existen muchas interfaces gráficas para configurar WPA en GNU/Linux, yo prefiero NetworkManager. Sin embargo, como nos gusta hacerlo chévere usaremos wpa_supplicant, obtenemos lo necesario:

[code]
sudo apt-get install wpasupplicant
[/code]

Y para obtener la el SSID y contraseña cifrados, ejecutamos como root:

[code]
wpa_passphrase Pepo entradas >> /etc/wpa_supplicant/wpa_supplicant.conf
[/code]

Con eso tenemos casi listo el fichero [b]/etc/wpa_supplicant/wpa_supplicant.conf[/b] con los datos necesarios para el acceso usando WPA, debemos modificarlo un poco para indicar el algoritmo:

[code]
network={
ssid="Pepo"
proto=WPA
key_mgmt=WPA-PSK
#psk="entradas"
psk=234f5f8a7582d88a956af4dcdb39d8bb43cfef32e84d2ae193f77604438d7a33
}
[/code]

Lo probamos con:

[code]
sudo wpa_supplicant -iath0 -c/etc/wpa_supplicant/wpa_supplicant.conf -Dmadwifi -w
[/code]

Listo, ahora modificamos el fichero [b]/etc/network/interfaces[/b] para que nuestra interfaz cargue la configuración de wpa_supplicant:

[code]
auto ath0
iface ath0 inet dhcp
wpa-driver madwifi
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
[/code]

Comentarios

Muy interesante, justo ahora

Imagen de Monkito

Muy interesante, justo ahora estoy en un proyecto para investigar algo de WPA con servidores Radius para unos 30 clientes, usando un ap Qpcom de 200mw...

muy buen howto, gracias...

counter.li.org

Cogito Ergo Sum

------------
counter.li.org

Cogito Ergo Sum

Muy bueno el tutorial, una

Imagen de juank6_66

Muy bueno el tutorial, una inquietud tengo un Ap(senao) al cual engancho clientes hasta distancias de dos kilometros con antenas de 2.4, solo las macs autorizadas pueden conectarse al ap, pero se que se puede clonar mcas, entonces le puse a mas de la autentificacion seguridad WPA pero al momento de usar las dos al mismo tiempo mis enlaces presentan perdidas y por mas que cambie de canal y trasmision no hay mejoria, al parecer no pueden los dos metodos de seguridad trabajar a la vez.
Que metodo se seguridad WPA es mejor que autentificar con macs o como puedo hacer para trabajar con esos dos metodos a la vez?? que tan seguro es enlazar equipos a distancias largas usando como seguridad el WPA

Juank

Si hay perdidas

Imagen de pepo

Cuando usas WPA si hay pérdidas, esto se da por el CPU de la tarjeta imagínate que debe encriptar/desencriptar las tramas enviadas/recibidas lo que le da mucha carga; esta es la razón por la posible pérdida; pero que el filtrado no funcione con WPA no es correcto, como verás en este documento he puesto como hacerlo.

Como comentaba en el ejemplo uso el canal 6: Cada canal tiene un rango de 22MHz y una separación uno del otro de 5MHz. Con esto tenemos que los canales 1, 6, 11 son canales que no se sobreponen (según el European Telecommunications Standards Institute-ETSI son usados 1, 7, 13) podrías elegir uno de ellos talvez no tengas tanta interferencia.

El AP ponlo en la parte más alta que puedas sobre todo si esperas llegar a esas distancias, si todos los equipos usan 802.11g entonces usa ese protocolo y 802.11b si los equipos son mixtos. El umbral RTS también puede ayudarte, podrías alterar la variable rts_threshold=2347 hasta que tengas mejores resultados.

Un reflector o una mejor antena también podrías ayudar.

Por otro lado efectivamente las MAC se pueden duplicar, estoy terminando la segunda parte de este documento donde hacemos un ataque por diccionario y luego de desvincular a un cliente tomamos su MAC, su IP, su CONTRASEÑA y solo nos falta tiempo para su MUJER :D

------------------------------------------------
Linux User Registered #232544
Jabber : pepo@jabberes.org
Ekiga : pepo@ekiga.net
ICQ : 337889406
GnuPG-key : www.keyserver.net

------------------------------------------------
Linux User Registered #232544
Jabber : pepo@jabberes.org
Ekiga : pepo@ekiga.net
GnuPG-key : www.keyserver.net

Mi experiencia en WPA no fue

Imagen de Monkito

Mi experiencia en WPA no fue muy satisfactoria al principo porque cuando conectaba mas de 5 clientes en el mismo AP con la misma clave "shared key" presentaba pérdidas de hasta un 30% en todos los clientes, e incluso en ocaciones excluía de la red a unos cuantos, supongo que el problema es por la fata de capacidad (memoria) para manejar las autentificaciones en el AP, es por eso que ahora estoy intentando configurar un servidor radius con freeradius en centos 5.

por lo pronto tengo clave WEP con mac filtering...

counter.li.org

Cogito Ergo Sum

------------
counter.li.org

Cogito Ergo Sum

ADemas de WEP, WAP, filtrado

Imagen de damage

ADemas de WEP, WAP, filtrado por mac en el AP, yo uso el famoso ip neigh, por partida doble osea filtro en el linux las mac de las tarjetas de red del cliente y las mac de los CPE y las relaciono con las ip asignadas a ese equipo en particular.

Keep The Fire Burning.....
Stryper 1988
http://counter.li.org/

No es WAP

Imagen de pepo

Suele ser común, pero vale el caso aclarar que una cosa es WAP (Wireless Application Protocol) y otra muy distinta (en cuanto a seguridad) es WPA (Wi-Fi Protected Access)

------------------------------------------------
Linux User Registered #232544
Jabber : pepo@jabberes.org
Ekiga : pepo@ekiga.net
ICQ : 337889406
GnuPG-key : www.keyserver.net

------------------------------------------------
Linux User Registered #232544
Jabber : pepo@jabberes.org
Ekiga : pepo@ekiga.net
GnuPG-key : www.keyserver.net

Estimados amigos, estuve

Estimados amigos, estuve revisando información acerca de implementar un servidor en modo Access Point a partir de una tarjeta de red inalámbrica (D-Link dwl-g520), con la utilización del demonio Hostapd. Estoy siguiendo el Howto que encontre en la página de Madwifi, http://madwifi-project.org/wiki/UserDocs/ath5kAccessPoint, para levantar un AP a partir de el driver ath5k, ya que con este controlador al momento tengo operativa mi wireless en modo cliente. La distribución que estoy utilizando es CentOS 5.2.
El problema que tengo es que al momento que hago un make del hostapd me devuelve unos errores:
driver_nl80211.c: Aviso, declaración implicita de la función 'genl_family_p'
driver_nl80211.c: Aviso, declaración implicita de la función 'nl_cache_free'
driver_nl80211.c: Aviso, declaración implicita de la función 'nl_handle_des'
make:***[driver_nl80211.o] Error 1
De antemano les quedo agradecido si me puede ayudar aclarar este problema.
Saludos