Sustituir Router Casero Raspberry Pi

Esta nueva entrada del blog es relativa al grupo de publicaciones que pretenden demostrar que una Raspberry Pi se puede utilizar como una herramienta de seguridad. En ella vamos a utilizar nuestra Raspberry Pi como router SOHO (Small Office, Home Office), a veces también considerado como router casero.

Este tipo de routers son enviados por los ISP o proveedores de servicio como Telefónica, Vodafone y Orange para que los clientes puedan conectarse a Internet desde su casa o su oficina. Este tipo de routers pueden presentar algunos de los siguientes problemas:

  • Tienen iniciados servicios que no se usan (ftp, UPnP, Twonky, etc.). En algunos casos no se pueden deshabilitar.
  • Presentan credenciales por defecto que no se pueden modificar porque están harcodeadas / escritas en el código. Este tipo de cuentas suelen estar ocultas para los usuarios.
  • Tienen vulnerabilidades de secuestro de DNS (DNS Hijacking) tras realizar un Cross Site Request Forgery.
  • Presentan problemas de Cross Site Scripting (XSS) persistentes y permiten añadir a la configuración web del router algún fichero javascript malicioso.
  • Permiten la divulgación de información (Information Disclosure), permitiendo a un atacante ver toda la configuración del router.
  • No permiten modificar las DNS y nos obligan a utilizar las DNS proporcionadas por ellos. Esto puede ser un problema cuando tengamos un servidor DNS y queramos que las peticiones pasen por ahí, por ejemplo, para filtrar contenido.
  • Las opciones de firewall desplegados en este tipo de routers son muy limitadas permitiendo abrir algún puerto, pero sin desplegar toda la funcionalidad de otros firewalls, por ejemplo, iptables (integrado en el kernel de Linux).

Algunas de las vulnerabilidades anteriores son descritas con ejemplos explicativos en la siguiente charla realizada en la CyberCamp 2015 que se realizó en Madrid:

https://cybercamp.es/videos/soho-routers-swords-and-shields

Los problemas analizados anteriormente han motivado la creación de esta publicación donde el lector aprenderá a configurar un router OpenWRT en una Raspberry Pi. En muchas ocasiones no podremos eliminar el router enviado por el proveedor de servicios (ISP), pero podremos ubicar la Raspberry Pi con OpenWRT justo detrás. Entonces, aunque un atacante comprometa el router casero proporcionado por el proveedor de servicios, no podrá saltarse el router OpenWRT instalado en la Raspberry Pi. La siguiente imagen muestra la configuración que se desplegará:

 Esquema Router Soho

El dispositivo Raspberry Pi tiene únicamente 1 conector RJ45, pero como se ve en la imagen anterior la raspberry pi necesitará 2: un cable entre la Raspberry Pi y el router casero proporcionado por el ISP y otro segundo cable entre la Raspberry pi y el hub o switch que se utilizará para conectar los dispositivos de la casa que se conecten por cable. El dispositivo seleccionado para conseguir una segunda conexión RJ45 a través de un puerto USB ha sido el TP-Link UE300, ya que aparece como compatible con la Raspberry Pi en:

http://elinux.org/RPi_USB_Ethernet_adapters

TP-Link UE300

Adicionalmente, la Raspberry Pi utilizará un adaptador para proporcionar conexión Wireless a la red interna de la casa (TP-LINK WP-722n). Este dispositivo fue descrito en la publicación:

Raspberry como herramienta de seguridad

La versión de raspberry que se va a utilizar es la Raspberry Pi 2, ya que desde la Web oficial, aunque han sacado firmware y soporte para la Raspberry Pi 3, aún no existe una imagen oficial con todo configurado. Seguramente, en las próximas semanas o meses sacarán la imagen oficial para la Raspberry Pi 3, y los pasos para su funcionamiento serán similares a los que os detallamos a continuación. Por tanto, los pasos para la configuración de una Raspberry Pi 2 como router SOHO han sido los siguientes:

Cargar OpenWRT dentro de una Raspberry Pi 2

  1. El primer paso es cargar el sistema operativo OpenWRT en una tarjeta micro SD (en nuestro caso hemos utilizado una tarjeta de 8GB ya que este sistema operativo no ocupa excesiva memoria), para ello podéis utilizar la siguiente publicación de éste mismo blog:

    Raspberry como herramienta de seguridad

    Por otra parte, el sistema operativo OpenWRT lo podéis descargar de la página oficial de OpenWRT:

    http://downloads.openwrt.org/chaos_calmer/15.05/brcm2708/bcm2709/

    El fichero que hemos descargado de la página oficial ha sido el siguiente, que es el que se deberá cargar en la Raspberry Pi:

    openwrt-15.05-brcm2708-bcm2709-sdcard-vfat-ext4.img

  2. En este punto, se deberá insertar la tarjeta micro SD en el interior de la raspberry, y tras conectarla asegurarnos que tenemos un cable de red conectado hacia el router. Además, será necesario conectarla a una pantalla mediante HDMI. Finalmente, en la parte de USB será necesario conectar un teclado (que aparecerá en inglés por defecto), el dispositivo TP-LINK WP-722n para proporcionar acceso Wireless, y el dispositivo TP-Link UE300 que se deberá conectar a un hub o switch para proporcionar acceso a los diferentes dispositivos de la casa que se conecten por cable.

Configurar OpenWRT insertado en la Raspberry Pi 2

  1. Proporcionar Internet a la raspberry configurando la interfaz wan. Para realizar este paso en el fichero /etc/config/network, se deberá cambiar la red LAN estática que viene por defecto por la siguiente configuración:

    Raspberry_router_soho_interfaz_wan

  2. Reiniciar las interfaces de red mediante el siguiente comando:

    /etc/init.d/network restart

    Y en este momento deberemos tener acceso a Internet desde nuestra Raspberry Pi 2.

  3. Cambiar el password con el comando passwdEs necesario tener cuidado con los caracteres especiales porque el teclado es inglés.

  4. Se habilitará la aplicación Dropbear, para proporcionarnos acceso mediante SSH y poder trabajar más cómodo. Además, cambiaremos el puerto de la aplicación en el siguiente fichero de configuración /etc/config/dropbear. Por ejemplo, en nuestro caso concreto hemos establecido el puerto 2233.

    Raspberry_router_soho_dropbear

  5. Se deberá reiniciar dropbear para aplicar los cambios utilizando el siguiente comando:

    /etc/init.d/dropbear restart

    Más adelante, tras realizar toda la configuración se puede parar el servicio de SSH mediante el siguiente comando:

    /etc/init.d/dropbear stop

  6. En este momento ya tendremos acceso por SSH, el problema es que el firewall de OpenWRT nos impide el acceso. Por tanto, deberemos añadir en el fichero /etc/config/firewall, la siguiente regla para permitir la conexión por SSH.

    Raspberry_router_soho_rule_SSH

  7. Entonces, tras reiniciar el firewall utilizando el siguiente comando, ya tendremos acceso mediante SSH a nuestra Raspberry Pi 2:

    /etc/init.d/firewall restart

  8. Seguidamente se deberá acceder mediante SSH, por ejemplo, con la aplicación Putty que está disponible en la siguiente página Web:

    http://www.putty.org/

    Raspberry_router_soho_rule_putty

    Las credenciales para entrar serán:

    Usuario: root

    Contraseña: (la contraseña establecida previamente)

  9. En este punto, será necesario instalar una serie de paquetes para que funcionen los dispositivos externos USB insertando los siguientes comandos:

    • opkg update
    • opkg install usbutils
    • opkg update
    • opkg install kmod-usb-net kmod-usb-net-rndis kmod-usb-net-cdc-ether usbutils udev
  10. Seguidamente, vamos a instalar un paquete que facilitará la configuración de la contraseña WIFI para el posterior acceso de los clientes Wireless porque no será necesario crear un fichero wpa_supplicant:

    • opkg update
    • opkg install wpad-mini
  11. A continuación, vamos a instalar todos los paquetes necesarios para poder controlar el router OpenWRT desde un navegador, de la misma forma que se gestiona un router casero:

    Instalación de los paquetes necesarios

    • opkg update
    • opkg install px5g uhttpd-mod-tls

    Instalación del navegador y los paquetes de español

    • opkg update
    • opkg install luci
    • opkg install luci-i18n-base-es
    • opkg install luci-i18n-firewall-es

    Arranque del servidor Web para controlar el router

    • /etc/init.d/uhttpd start
    • /etc/init.d/uhttpd enable

    Añadir las siguientes reglas al fichero /etc/config/firewall para permitir el acceso por el puerto seguro 443, y únicamente desde cualquiera de las redes locales LAN (lan y lan2). Por tanto, el acceso a la web del router siempre se realizará por https.

    Raspberry_router_soho_rule_HTTPS

    El acceso a la Web del router se realizará estando conectado a cualquiera de las redes LAN (lan o lan2), utilizando las siguientes direcciones a partir de que las redes estén configuradas:

  12. En este momento, se van a instalar los drivers necesarios para para que funcione la tarjeta de red WIFI insertada previamente en la Raspberry Pi:

    • opkg update
    • opkg install kmod-ath9k-htc
  13. Y seguidamente, se va a configurar el fichero /etc/config/wireless que es el encargado de la configuración de las redes WIFI. Primero se deberá crear el fichero con el siguiente comando:

    • wifi detect > /etc/config/wireless

    Y además se deberá modificar ligeramente el fichero cambiando el nombre de la red wireless, el tipo de cifrado y la contraseña que utilizará esa red. Además es muy importante eliminar la línea de option disabled 1, porque de lo contrario no funcionará la interfaz wireless:

    Raspberry_router_soho_file_wireless

  14. Además, en el fichero /etc/config/network donde aparecen definidas todas las interfaces de red, se deberá incluir la interfaz de red Wireless (que es la interfaz de red lan) como se describe en la siguiente imagen:

    Raspberry_router_soho_interfaz_wan_y_lan

  15. Y tras reiniciar las interfaces de red con el comando visto anteriormente tendremos las redes lan y wan configuradas correctamente:

    /etc/init.d/network restart

Aunque la navegación a través de la WIFI es más segura al estar detrás de este router OpenWRT, en este punto el objetivo es configurar una nueva red mediante el adaptador TP-Link UE300, para que a través de un hub o switch todos los dispositivos de red que utilicen cable también estén seguros detrás de nuestro router OpenWRT.

  1. El primer paso es añadir una nueva interfaz lan2 y para eso se deberán añadir las siguientes líneas al fichero /etc/config/network:Raspberry_router_soho_interfaz_lan2

  2. Seguidamente, deberemos modificar el fichero de configuración del DHCP añadiendo las siguientes líneas para que la nueva red también reparta direcciones IP:

    Raspberry_router_soho_file_dhcp_lan2

  3. A continuación, se deberán añadir las siguientes reglas al fichero /etc/config/firewall para que pueda filtrar paquetes entre redes. La configuración de esta red lan2 debe ser la misma que para la red lan. Esto se debe a que las reglas por defecto de la red lan ya aparecen definidas, pero las de la red lan2 no porque la hemos creado nueva:

    Raspberry_router_soho_file_firewall_rules_lan2

    Adicionalmente, las siguientes reglas se utilizan para el reenvío de paquetes entre las redes lan y lan2:

    Raspberry_router_soho_file_firewall_rules_lan_lan2

  4. Por último, será necesario reiniciar el servicio de DHCP, las reglas del firewall y las interfaces de redes configuradas para que se apliquen los últimos cambios realizados:

    • /etc/init.d/odhcpd restart
    • /etc/init.d/firewall restart
    • /etc/init.d/network restart
  5. Para verificar que todo está correctamente configurado ejecutaremos el comando ifconfig para ver las interfaces de red configuradas y nos debería salir algo parecido a lo siguiente:

    Raspberry_router_soho_Ifconfig

Para finalizar, me gustaría detallar cuáles son los 4 ficheros de configuración más importantes dentro de OpenWRT:

  • /etc/config/network: Es el fichero donde se declaran las interfaces de red. En este fichero, entre otras cosas, se especifica si cada interfaz de red obtiene la IP por DHCP o por el contrario su IP es estática. En la siguiente imagen se muestra el fichero /etc/config/network tras realizar toda la configuración explicada anteriormente:

    Raspberry_router_soho_file_network

    Como se vio anteriormente el comando utilizado para reiniciar las interfaces de red es:

    /etc/init.d/network restart

 

  • /etc/config/wireless: Es el fichero donde se detallan los enlaces radio de las redes Wireless. Los datos más destacados de este fichero pueden ser:

    • El canal utilizado
    • El nombre de la red Wireless (SSID)
    • El tipo de cifrado que usaremos en esta red
    • La contraseña de la red WIFI

    Gracias al módulo wpad-mini instalado previamente, la contraseña de nuestra red WIFI se puede configurar directamente en este fichero.

    En la siguiente imagen se muestra el fichero /etc/config/wireless tras realizar toda la configuración explicada anteriormente:

    Raspberry_router_soho_file_wireless

    En este caso, si hacemos algún cambio en el fichero anterior deberemos reiniciar las interfaces de red para que se apliquen los cambios con el mismo comando que para las modificaciones en el fichero /etc/config/network:

    /etc/init.d/network restart

 

  • /etc/config/firewall: Es el fichero donde se detallan las reglas del firewall que impedirán o permitirán que los paquetes pasen de una red a otra. En las siguientes imágenes se muestra el fichero /etc/config/firewall con todas las reglas configuradas tras realizar toda la configuración explicada anteriormente:

    Raspberry_router_soho_file_firewall1
    Raspberry_router_soho_file_firewall_rules_lan2_lan
    Raspberry_router_soho_file_firewall2Raspberry_router_soho_file_firewall3Raspberry_router_soho_file_firewall4Raspberry_router_soho_file_firewall5

    Como se vio anteriormente el comando utilizado para aplicar las reglas del firewall definidas en el fichero anterior es el siguiente:

    /etc/init.d/firewall restart

 

  • /etc/config/dhcp: Es el fichero donde aparece configurado la configuración del servidor DHCP. En él se especifican las redes definidas en el fichero /etc/config/network donde el router OpenWRT debe proporcionar conexión mediante DHCP. Además, se definen algunos datos adicionales:

    • Cuándo caducan las IP
    • Cuál es la IP inicial para repartir direcciones
    • Cuál es la IP final para repartir direcciones

    En la siguiente imagen se muestra el fichero /etc/config/dhcp con toda la configuración del DHCP realizada anteriormente:

    Raspberry_router_soho_file_firewall5

    En este caso para aplicar los cambios realizados en el fichero de configuración del DHCP se deberá ejecutar el siguiente comando:

    /etc/init.d/odhcpd restart