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:
- Desenchufar la fonera,
- Pulsar en el botón de reset que viene en la parte de
abajo de la fonera con un objeto punzante
- Manteniendo pulsado este botón de reset, poner el
cable de power a la fonera
- Esperar con el reset pulsado al menos 15 segundos
- Soltar el botón de reset
- 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).
- Desenchufar y volver a enchufar la fonera.
- 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.
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.
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
...
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
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
Rebotar la fonera, o bien mediante
línea de comandos o bien quitando el cable y volvíendolo
a enchufar:
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:
Figura 2: Entrando a la fonera
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) -------------