Todos seguramente nos sorprendimos cuando FON comenzó a crecer. Hace un tiempo ofrecía routers Linksys por un precio irrisorio (cuando cuestan algo así como 150 U$D). No conformes con eso, siguieron creciendo y expandiéndose. Ahora tienen su propio router: La Fonera, un router con un firmware controversial ya que está licenciado bajo una licencia libre pero tiene DRM que impide su modificación o reemplazo.
Recuerdo que Franco había dicho tener un router FON activo en Córdoba pero no lo encontré. Lo que sí es impersionante la cantidad que hay en Buenos Aires y Capital Federal. Pueden ver dónde están en todo el mundo gracias a los Mapas FON que funcionan sobre Google Maps
En estos días, FON estuvo regalando Foneras en Alemania y Austria bajo la condición que éstos fuesen conectados y utilizados como puntos de acceso FON. He aquí que unos muchachos, estudiantes alemanes, encontraron la forma de entrar al sistema sobre el que trabaja la Fonera y publicaron cómo. Obviamente, la publicación fue en inglés… ahora también en el idioma de cervantes
Las razones
Debido al revuelo causado, los autores han publicado un breve artículo explicando porqué lo hicieron. Dejan muy claro que no pretenden que se usen los routes para otra cosa, boicotear una propuesta como la de FON - que nos beneficia a todos - es simplemente estúpido. Los fundamentos sobre porqué lo hicieron son muy claros; entre ellos:
- Tener control sobre nuestra red: la Fonera procesa y transfiere todos nuestros datos en nuestra red. Un hacker que ingrese a FON podrá meter código arbitrario (como un sniffer) en nuestro router.
- Verificación: FON publicó el código fuente; pero no hay forma de comprobar que dicho código fuente es el que hace funcionar la Fonera (por cuestiones de DRM).
- Seguridad: Todas las Foneras tienen la misma autoridad, con sólo el nombre de usuario y contraseña de la cuenta FON podemos insertar todo lo que queramos dentro de la Fonera de esa persona… inclusive un programa que saque los nombres de usuarios y contraseñas de los usuarios FON que se conecten a nuestro router.
- Inevitabilidad: pretender que la Fonera iba a ser una caja negra permanentemente es una ilusión que nosotros demostramos errada. El que alguien lo hiciera con posibles intenciones maliciosas era una cuestión de tiempo.
Notas de Traducción
- El artículo fue traducido y publicado con permiso por escrito (via un comentario) de uno de sus autores: Stefan Tomanek y Michael Kebe
- Es muy probable que los links conduzcan a sitios en inglés
- Artículo original: Hacking the La Fonera
- Vía Slashdot
La traducción
¿Cómo se configura?
La Fonera es un sistema bloqueado: la configuración normalmente no se hace en el dispositivo sino que éste toma los datos de configuración del servidor FON. Por lo que para configurar los parámetros de red como el ESSID público y prvado y la clave WPA, te logueas en tu cuenta FON y cambias los parámetros desde su sitio web. Durante el proceso de arranque, La Fonera se contacta con el servidor FON y toma su configuración de red. Sin embargo, una interfaz web en el router para configurarlo también existe.
FON también hizo imposible el pisarle el firmware ya que los binarios del mismo están firmados: aquellos archivos del Firmware que no tengan las firas digitales correctas son rechazados por el sistema. Si bien FON publicó el código fuente para el software que corre el router, no son obligados a liberar la clave necesaria para correr el software en su dispositivo. Esto es considerado libre según la GPLv2 pero es uno de los principales aspectos que conciernen a la versión 3 de la licencia GPL.
Por lo tanto, cambiar el firmware no es una opción ya que no hay forma de subir una imagen funcional de firwmware sin poseer la clave criptográfica correcta. Esto es el mismo problema con la grabadora de video digital TiVo.
Mirando el proceso de configuración
Durante su arranque (y en intervalos regulares), La Fonera “llama a casa” para verificar si los datos de configuración fueron modificados. Esto es realizado utilizando una conexión SSH a download.fon.com al puerto 1937. Puedes chequearlo vos mismo:
stefan@nano:~$ telnet download.fon.com 1937 Trying 213.134.45.191... Connected to download.fon.com. Escape character is '^]'. SSH-2.0-OpenSSH_3.8.1p1 Debian-8.sarge.4El router continúa enviando información para identificarse, incluyendo su dirección MAC y versión de software:
mode='start' wlmac='WIRELESS MAC' mac='LAN MAC' fonrev='4' firmware='0.7.0' chillver='1.0' thclver='1.0' device='fonera'Como respuesta, FON envía instrucciones de consola, incluyendo instrucciones para configurar los dispositivos inalámbricos (ESSIDs y contraseñas WPA).
SSH es una opción elegante desde el punto de vista de FON ya que es relativamente sencillo de instalar en un contexto no interactivo y provee de una forma elegante de evitar suplantación de identidad. Como la clave de acceso a download.fon.com está almacenada en el router, no podemos simplemente decir ser dicho servidor al que se intenta conectar y proveer al nuestro router con nuestros propios instrucciones de consola.
La autenticación se realiza con una clave secreta almacenada en cada router y en el código fuente. Sin embargo, se necesita el cliente Dropbear SSH para utilizarla, OpenSSH pide por una contraseña por razones desconocidas mientras que Dropbear no lo hace. Utilizando dbclient es lo suficientemente sencillo establacer una conexión con el servidor FON y obtener los datos de configuración para nuestra Fonera:
echo "mode='start' wlmac='' mac='' fonrev='4' firmware='0.7.0' chillver='1.0' thclver='1.0' device='fonera'" | dbclient -T -i key -p 1937 openwrt@download.fon.comNo hay respuesta alguna ya que dejamos ambas direcciones MAC vacías. De haber utilizado la dirección de una Fonera probablemente hubiésemos recibido:
rm -f /tmp/.thinclient.sh exitEl archivo /tmp/.thinclient.sh es la ubicación donde se almacena la salida y donde es luego ejecutada por el script de actualización. como FON decidió que no hay nada para hacer, el script se borra a sí mismo y finaliza.
En caso de modificar algunos valores en la interfaz web de tu Fonera antes de recibir los datos, las cosas se verían diferente. Si cambiaste el ESSID, la instrucción para hacerlo son transmitidas al router por un par de instrucciones de consola:
# begin # setssidprivate awk -v cfgfile="/etc/config/fon" -v "updatestr=private.essid=YOURPRIVATEESSID" -f /usr/lib/webif/uci-update.awk -f - > /etc/config/fon.new <<EOF BEGIN { cfg = read_file(cfgfile) print update_config(cfg, updatestr) } EOF if [ $? -eq 0 ]; then mv /etc/config/fon.new /etc/config/fon ifup lan else rm /etc/config/fon.new fi # end # set ssid fonera # begin # set ssid fonera awk -v cfgfile="/etc/config/fon" -v "updatestr=public.essid=YOURPUBLICESSID" -f /usr/lib/webif/uci-update.awk -f - > /etc/config/fon.new <<EOF BEGIN { cfg = read_file(cfgfile) print update_config(cfg, updatestr) } EOF if [ $? -eq 0 ]; then mv /etc/config/fon.new /etc/config/fon iwconfig ath0 essid FON_'YOURPUBLICESSID' else rm /etc/config/fon.new fi # end # set ssid fonera rm -f /tmp/.thinclient.sh exitCódigo similar es transferido para modificar contraseñas WPA.
¿Cómo inyectamos código?
Como pueden ver, FON tomó ciertas precauciones para evitar que se inyecte código: los parámetros están contenidos en comillas simples para evitar sustituciones de cualquier tipo. El ingreso de caracteres extraños está prohibido por la interfase web y, aún si lograras insertar una comilla simple en tu ESSID, sería “desarmado” al escaparlo con una barra invertida antes de él.
El tipo de ataque de inyección que estamos intentando es muy similar a inyecciones SQL. Nuestro objetivo es poner datos en el sistema que terminen la instrucción en curso (esto es la llamada a iwconfig) y luego comience una nueva instrucción.
iwconfig ath0 essid FON_'YOURPUBLICESSID'Para poder utilizar esta línea como punto de entrada necesitamos sustituir YOURPUBLICESSID con algo que termine el entorno de parámetro para iwconfig. Para cadenas rodeadas por comillas simples, el único caracter para ello es ‘, sólo una comilla simple que lo cierre. Aún un retorno de línea es incapaz de finalizar la instrucción y será tomada como un parámetro de iwconfig.
Desafortunadamente, FON simplemente reemplaza cualquier ‘ con la cadena \’ para evitar dicho tipo de inyecciones. El agregar una barra invertida a un caracter con un significado especial anula dicho sifnificado; por lo que el peligro de ingreso de intrusos es revertido.
Momento ¿será así? Me sorprendió bastante el consultar la página de manual de bash:
Rodear caracteres con comillas simples preservan el valor literal para cada caracter dentro de las comillas. Una comilla simple no puede ocurrir entre comillas simple, aún cuando sean precedidas por una barra invertida.
Por lo que una comilla simple siempre cierra una cadena rodeada de comillas simples, antecedida por una barra invertida o no. Puedes verificarlo por tí mismo ejecutando esta pequeña instrucción en tu consola:
stefan@nano:~$ echo 'foo\'bar' >En lugar de imprimir foo\’bar, bash sigue esperando una cuarta comilla simple ya que la cadena comenzada por la comilla al final de la línea aún no está cerrada.
Realmente logramos inyectar código de esta forma. Todo lo que tienes que hacer es incluir una comilla simple y un retorno de línea en el campo ESSID. Por supuesto, esto no es posible con un navegador, ya que FON intenta proteger su interfaz utilizando Javascript e ingresar un retorno de línea en un campo input puede ser bastante complicado. Existe, sin embargo, un módulo de Perl llamado WWW::Mechanize que le permite a un script comunicarse con un sitio web tal como si fuese un usuario. Utilizando este script, fue finalmente posible ingresar comandos arbitrarios en el script obtenido del servidor FON.
Utilizamos esta ventana abierta para abrir el puerto 22 y activar el servidor SSH Dropbear, lo que nos proveía con acceso total a una consola en el router.
Trepando la ventana y abriendo la puerta principal
El resultado de nuestros experimientos es un script Perl llamado shellfon.pl. Toma como parámetros tu dirección de e-mail y contrasñea FON de la línea de comandos y lee las instrucciones de consola a ser ejecutados en el router de la entrada estándar. Luego se loguea a FON e inserta el ESSID manipulado. Todo lo que debes hacer luego es reiniciar tu Fonera.
Para arrancar y abrir SSH necesitarás la siguiente línea de comandos, que abrirá el firewall en el puerto 22 y lanzará el servidor Dropbear:
echo -e '/usr/sbin/iptables -I INPUT -p tcp --dport 22 -j ACCEPT\\n/etc/init.d/dropbear' | perl shellfon.pl email passwordLuego de eso, sigue la guía en este sitio para activar permanentemente el acceso de consola. No te olvides de revisar la interfase web nuevamente para configurar tu SSID a algo significativo nuevamente.
Evitando que FON ejecute código en el router
Como ya dijimos, La Fonera recibe instrucciones desde FON desde el enlace SSH. Esto es realizado por el script /bin/thinclient:
[...] . /tmp/.thinclient.shSi quieres prevenir que La Fonera ejecute el código que recibe, podrías querer cambiar las líneas finales a:
### Don't execute code from FON # . /tmp/.thinclient.shComo puede llegar a haber correcciones de bugs útiles de tiempo en tiempo, podrías tambier copiar o mover los scripts enviados a algún otro lugar para que escrutarlos manualmente luego:
cp /tmp/.thinclient.sh /tmp/thinclient-$(date '+%Y%m%d-%H%M')De esta forma, puedes revisarlos de tanto en tanto para saber qué es lo que trama FON.
3 Comments
WOW….. simplemente una exquisitez. Hacía mucho tiempo que no veía un hack de este calibre. Gracias mati por esta joyita. Un verdadero lujo !!!
Me mato lo de la injección, lo de iptables, buenísimo !!
Ya esta en el buffer de la impresora
Hi everybody. I wrote a script that transforms La Fonera as a Repeater and Access Point, you can find it at http://www.blogin.it/fonera4.php
Hope you enjoy …and improve
–
Antonio
gracias amigo x ayudarme a loguear en la fonera no tenia ni idea de como hacerlo… tu m has resuelto la vida :D…