Cómo habilitar ssh en La Fonera

  Información recopilada por Víctor Escudero        

Basado en el excelente trabajo de Stefan 'Tommie' Tomanek


Actualmente  los routers inalámbricos que FON está comercializando, conocidos coloquialmente como 'foneras' utilizan una software de gestión basado en el sistema operativo Linux, más en concreto en un firmware denominado OpenWrt destinado a pequeños dispositivos de consumo. Básicamente se trata de un sistema Linux completamente funcional con un pequeño tamaño de tan sólo entre 4 y 8 MB.

FON ha aplicado pequeñas modificaciones a este firmware para asegurarse que los usuarios lo utilicen "correctamente" para compartir su acceso a internet,  por lo que ha deshabilitado muchas funcionalidades que el firmware OpenWrt traía de serie de tal forma que la única interfaz para el usuario con su fonera está limitado a la gestión del router vía web o bien a través del perfil de fonero que el propietario tenga almacenado en la web de FON. Es una verdadera lástima que esta interfaz web no permita exprimir al máximo todas las capacidades que la fonera es capaz de dar gracias al potente Linux que tiene debajo.

Entre otras muchas cosas, la fonera puede ser configurada como un simple punto de acceso para compartir internet a través de FON, para analizar el tráfico inalámbrico que pase a través suya vía analizadores de protocolos como 'tcpdump', para identificar el alcance y la potencia de otras redes cercanas a la fonera mediante programas como 'kismet', como servidor de vpn con 'openvpn' como repetidor de alguna otra señal inalámbrica que ya recibamos en nuestra casa o como una simple tarjeta inalámbrica haciendo las funciones de una tarjeta wifi pci, pcmcia o una llave usb-wireless, pero con la ventaja de no precisar de drivers de ningún tipo.

Sin embargo todas estas funcionalidades requieren que sea el usuario quien retome el control de la fonera, mediante el empleo de la línea de comandos, para lo cual ha de habilitarse el acceso mediante ssh que FON se ha preocupado de deshabilitar en las foneras que comercializa. Dado que ha sido deshabilitado intencionadamente por FON, no hay posiblidades de habilitarlo vía web como sería lo lógico por otra parte, sino que hay que explotar alguna vulnerabilidad del firmware que viene por defecto de fábrica.

A marzo del 2007, la última versión de firmware preinstalado con el que se estaban comercializando las foneras es el 0.7.1-1 y en algunos casos el 0.7.1-2, los cuales son de nuevo vulnerables. Afortunadamente un grupo de estudiantes alemanes han proporcionado los métodos para simplificar este trabajo, proporcionando para para el primer firmware un simple script en perl llamado fondue, y un servidor de DNS "envenenado" en el segundo caso para ser utilizado para los firmwares 0.7.1-2 y anteriores.

Requisitos previos:

    • Comprobar la versión de firmware de la fonera (Esto se ve en el menú status del portal web del router , por ejemplo 0.7.1-1 ó 0.7.1-2).
    • La Fonera se actualiza automáticamente a la última versión de firmware en cuanto se conecta a internet, por lo que se debe de mantener desconectado el cable ethernet de la fonera hasta haber concluído este procedimiento.
    • Si por un casual, ya se ha conectado a internet, lo cual sería lo lógico se puede resetear para que vuelva a la versión de firmware original con el que venía de fábrica de la siguiente forma:
      1. Desenchufar la fonera,
      2. Pulsar en el botón de reset que viene en la parte de abajo de la fonera con un objeto punzante
      3. Manteniendo pulsado este botón de reset, poner el cable de power a la fonera
      4. Esperar con el reset pulsado al menos 15 segundos
      5. Soltar el botón de reset
      6. Esperar varios minutos (aunque el proceso podría durar entre 1 y 2 minutos, aunque por experiencia propia recomiendo esperar al menos 10-15 minutos, pues existe un bug por el cual en circunstancias un tanto especiales la actualización del firmware lleva ese tiempo).
      7. Desenchufar y volver a enchufar la fonera.
      8. Comprobar de nuevo la versión de la fonera, pues tras el flasheo debería haber vuelto a la versión que venía de fábrica.
  • PASO 1:

    • Opción 1: (Válido hasta la versión 0.7.1-2, recomendado por su simplicidad)
Para hackear y habilitar el puerto ssh en la fonera, temporalmente cambiar el servidor de DNS a la dirección 88.198.165.155, perteneciente al servidor  kolofonium.datenbruch.de, el cual redirige a un servidor radius falso (que no es propiedad de FON) el cual se encarga de enviar los cambios adecuados al router.

DNS redirection
Figura 1: Modificación de DNS

Para seleccionar el servidor DNS, se debe seleccionar explicitamente la opción de IP estática y seleccionar una IP fija dentro del rango de IPs que nuestro router nos asignaría. Una vez asignados estos valores y cambiado el servidor de DNS, debemos reiniciar y esperar a que la fonera se conecte a internet durante unos minutos. Si todo ha ido bien, al conectarnos al puerto de ssh veremos que ahora si está habilitado, aunque tan solo lo estará temporalmente por lo que deberemos seguir el resto de los pasos para habilitarlo permanentemente.
    • Opción 2: (Válido hasta la versión 0.7.1-1, solo recomendado si la opción 1 no funciona)
Abrir una regla en el firewall de la fonera para habilitar la entrada mediante ssh y después cargar el demonio de ssh llamado dropbear (un ssh mínimo de tan solo unos pocos kbytes):

localhost@localdomain % echo -e '/usr/sbin/iptables -I INPUT 1 -p tcp --dport 22 -j ACCEPT\n/etc/init.d/dropbear' | perl fondue.pl 192.168.10.1 admin
By your command...
Injecting command »/usr/sbin/iptables -I INPUT 1 -p tcp --dport 22 -j ACCEPT«...
Injecting command »/etc/init.d/dropbear«...
Code has been injected.
%

Como se puede ver, el ataque gracias a este simple script en perl que podeis descargar aquí tan solo se debe ejecutar el script de perl indicando la dirección de la fonera que por defecto es la 192.168.10.1 y el password que por defecto también es admin. De esta forma se inyecta el código necesario para permitir habilitar el ssh temporalmente.  Nota para usuarios de Windows: Para ejecutar scripts de perl es necesario disponer de algún entorno Perl no incluído por defecto en ninguna de las versiones de Windows, por lo que se puede optar por descargar de ActiveState (y luego añadir con el gestor de paquetes que tiene integrado el módulo WWW-Mechanize) o descargar el perl que viene con el entorno Cygwin.

  • PASO 2:

  • Fase  2.1:

Conectarse mediante ssh a la fonera con el usuario root  (password por defecto admin), para hacer que los cambios sean permantentes, pues de lo contrario al rebotarla se perderían. Para ello se descomentan las dos reglas del firewall que habilitan el acceso al puerto 22 del ssh:

root@OpenWrt:~# vi /etc/firewall.user
...

### Open port to WAN
## -- This allows port 22 to be answered by (dropbear on) the router
iptables -t nat -A prerouting_rule -i $WAN -p tcp --dport 22 -j ACCEPT
iptables        -A input_rule      -i $WAN -p tcp --dport 22 -j ACCEPT

 ...
  • Fase  2.2: 

Renombrar el demonio de ssh para que se arranque automáticamente la próxima vez:

root@OpenWrt:~# mv /etc/init.d/dropbear /etc/init.d/S50dropbear
  • Fase  2.3:

Deshabilitar cualquier cambio que FON envía a las foneras automáticamente.
Con comentar la última línea del fichero /bin/thinclient sería suficiente, pero dado que nos puede resultar interesante mantener un histórico de los cambios que  se envían desde FON, es preferible mantener varias versiones. Las comprobaciones de checksum son para asegurarse de que no saturamos la capacidad de almacenamiento de la fonera con ficheros en donde no se han producido cambios.

root@OpenWrt:~# vi /bin/thinclient

...
#. /tmp/.thinclient.sh                                                                  ( <= Comentar esta línea y añadir lo que viene a continuación )

#.- Don't let FON 'automagically' update 'our' router
if [ -s /tmp/.thinclient.sh ];  then
for f in /tmp/thin* ; do
:
done
if [ -f "$f" ]; then
if [ $(md5sum /tmp/.thinclient.sh | cut -d ' ' -f 1) != $(md5sum `ls $f` | cut -d ' ' -f 1) ] ; then
cp /tmp/.thinclient.sh /tmp/thinclient-$(date '+%Y%m%d-%H%M')
fi
else
cp /tmp/.thinclient.sh /tmp/thinclient-$(date '+%Y%m%d-%H%M')
fi
fi
  • PASO 3:

Rebotar la fonera, o bien mediante línea de comandos o bien quitando el cable y volvíendolo a enchufar:

root@OpenWrt:~# reboot
  • PASO 4:

Tras unos minutos tras rebotar para que la fonera arranque de nuevo, comprobar que el acceso a ssh ya es permanente y funciona tras nuestros cambios:

session snapshot
                                                              Figura 2: Entrando a la fonera
  • PASO 5:

Ahora que ya tenemos ssh habilitado, puede resultarnos interesante aplicar las últimas actualizaciones que la fonera se habrá descargado automáticamente al conectarse a internet. Antes de aplicar estos cambios conviene asegurarse de que no afectan a ninguna de nuestras modificaciones, no vaya a ser que FON intente cerrarnos el acceso a nuestro juguetito.

Las actualizaciones vendrán marcadas por el fichero /tmp/.thinclient.sh o bien las versiones antiguas que se vayan guardando temporalmente en /tmp/thinclient-*:

root@OpenWrt:~# cat /tmp/.thinclient.sh
cd /tmp
wget http://download.fon.com/firmware/update/0.7.1/1/upgrade.fon       (<- En modo automático se hubiese descargado este upgrade)
/bin/fonverify /etc/public_fon_rsa_key.der /tmp/upgrade.fon                       (<- comprobaría si está firmado por FON y lo aplicaría si es así)

rm -f /tmp/.thinclient.sh

exit

Ahora descargamos la actualización
root@OpenWrt:~# cd /tmp
root@OpenWrt:~# wget http://download.fon.com/firmware/update/0.7.1/1/upgrade.fonConnecting to download.fon.com[213.134.45.191]:80
upgrade.fon          100% |*****************************| 19192       00:00 ETA

Pero antes comprobaremos que es lo que tiene el upgrade, no vaya a ser que lo apliquemos y perdamos el acceso vía ssh que hemos abierto. El fichero de actualización tiene 520 Bytes de cabecera y firma digital que debemos ignorar y después extraer el resto que es simplemente un fichero .tar.gz.

root@OpenWrt:~# cat upgrade.fon | tail -c +520 - | tar zxvf -
upgrade_0712.tgz
upgrade
hotfix

Veamos que es lo que dice que tiene el upgrade:

root@OpenWrt:~# cat hotfix
# FON hotfix header
# $Id$
Name: upgrade_0712
Version: 0.7.1
Arch: fonera
Depends: nothing
Incompatible: nothing

El script de upgrade no hace nada más que lo esperado:
root@OpenWrt:~# cat upgrade
#!/bin/sh
# $Id$
VERSION=$( cat /etc/fon_version )
REVISION=$( cat /etc/fon_revision )

if [ $VERSION = "0.7.1" ] && [ $REVISION -lt 2 ];
then
        echo Upgrading...
        tar xzvvf upgrade_0712.tgz -C / >/dev/null 2>/dev/null
        exit 0
else
        exit 1
fi

Ahora entonces ya podemos ver que efectivamente la nueva versión descargada es una pequeña actualización de unos pocos ficheros, pero no una nueva actualización de firmware completa:

root@OpenWrt:~# tar zxvf upgrade_0712.tgz
etc
etc/fon_revision
etc/init.d
etc/init.d/N45ntpclient
etc/banner
usr
usr/bin
usr/bin/haserl
usr/lib
usr/lib/webif
usr/lib/webif/validate.awk
www
www/cgi-bin
www/cgi-bin/webif
www/cgi-bin/webif/connection.sh
www/cgi-bin/webif/upgrade.sh
www/cgi-bin/webif/adv_wifi.sh
www/cgi-bin/webif/private.sh
www/cgi-bin/webif/public.sh
www/cgi-bin/webif/adv_pf.sh
www/cgi-bin/webif/adv_net.sh
www/cgi-bin/webif/password.sh
www/cgi-bin/webif/language.sh

Ahora chequearíamos las actualizaciones, pero en principio dado que no se tocan los ficheros /etc/firewall.user, /etc/init.d/S50dropbear ni /bin/thinclient podemos tener una cierta tranquilidad para aplicarlo.

root@OpenWrt:~# /bin/fonverify /etc/public_fon_rsa_key.der /tmp/upgrade.fon
This is a FON hotfix v2 archive
Verified OK
Upgrade name: upgrade_0712
Upgrading...

Ya está aplicado y ahora tan solo queda rebotar

root@OpenWrt:~# reboot
Connection to 192.168.10.1 closed by remote host.

Dado que el fichero de banner ha sido modificado con la actualización, ya se reflejará el nuevo cambio al volver a entrar por ssh o ver el status del router vía web.
_______  _______  _______
|   ____||       ||   _   |
|   ____||   -   ||  | |  |
|   |    |_______||__| |__|
|___|

 Fonera Firmware (Version 0.7.1 rev 2) -------------