Looking for Computer Science  & Information Technology online courses ?
Check my new web site: https://www.yesik.it !

Le routeur TP-LINK TL-WR841ND [ Voir sur Amazon.fr] est un routeur Wi-Fi destiné au marché SOHO (Small Office/Home Office – Un segment de marché qui correspond aux entreprises de 1 à 10 employés.) . Outre la liaison sans-fil, il est équipé de 4 ports LAN Ethernet 100Mbps et d'un port WAN Ethernet 100Mbps.

Le rapport qualité-prix est très bon, et, pour quelques dizaines d'euros, vous disposerez d'un produit performant doté d'un firmware standard relativement complet et pratique. Le tout étant administrable à partir d'une interface HTTP conviviale. Si tout ceci est conforme à la description commerciale du produit, ce qui m’intéresse particulièrement, c'est quelque-chose qui n'est pas mis en avant par le fabriquant: le fait que ce routeur est relativement facile à hacker. Ainsi, dans cet article, nous allons voir comment installer OpenWrt sur le TP-LINK TL-WR841ND à partir de la console série.

Remarque:

Sur un routeur neuf, il est possible – et plus simple – d'installer OpenWrt en utilisant la mise à jour du firmware accessible par l'interface de configuration web. Mais c'est tellement plus amusant et instructif de passer par la console série...

Accessoirement, savoir intervenir de cette manière vous permettra aussi de débriquer un routeur sur lequel vous auriez commis une maladresse ... à condition que U-Boot n'ait pas aussi été écrasé!

Accès au port série

Attention:

Les modifications décrites par la suite impliquent des modifications matérielles et logicielles sur le routeur. Il est à peu près évident que ceci va annuler votre garantie!

TL-WR841ND rear view.png

Démontage du routeur TL-WR841ND — Le démontage du routeur TP-Link TL-WR841ND est des plus faciles: Il suffit de retirer les 4 vis situées sous les pieds de l'appareil. Ensuite les deux parties de la coque peuvent être séparées sans beaucoup d'effort.

Le TL-WR841ND est doté d'un port série TTL. Par contre, celui-ci utilise des tensions TTL, et n'est donc pas compatible électriquement avec le port série RS-232 que l'on trouve derrière certains PC.

Pour accéder au port série de ce routeur, il va donc vous falloir vous munir d'un adaptateur. Le plus simple est de vous diriger vers un adaptateur série TTL/USB comme ceux fabriqués par FTDI. Un tel câble est en vente chez Adafruit (http://www.adafruit.com/products/70) par exemple. Autre avantage, ce câble est basé sur un circuit FTDI FT232RQ USB to Serial UART dont le driver est intégré dans la plupart des distributions Linux modernes.

Tout ceci est très bien, sauf que le port série du TL-WR841ND n'est pas accessible de l'extérieur de l'appareil. En fait, les broches nécessaires pour s'y connecter ne sont même pas mises en place sur la carte du routeur. Il va donc vous falloir ouvrir la bête et vous munir d'un fer à souder pour les y ajouter. Pour ouvrir le boitier, vous devrez deviser les quatre vis cachées sous les pieds en plastique du routeur. Les deux parties de la coque sont clippées, mais très facile à séparer. C'est à dire sans devoir forcer ni les endommager.

Piège:

L'ordre des broches sur la carte du routeur n'est pas le même que sur le câble FTDI! Prévoyez donc le matériel nécessaire pour relier les deux ensemble. Des petits câbles munis d'un grip fil à une extrémité et d'une broche fine de l'autre sont l'idéal (http://www.sparkfun.com/products/9741).

TL-WR841ND Serial port.png

Le routeur Wi-Fi TP-Link TL-WR841ND est doté d'un port série utilisant les niveaux de tension TTL (3,3V). L'emplacement n'est pas muni de connecteur, et vous devrez donc en souder un avant de pouvoir l'utiliser. Laissez la broche +5V de côté, et ne raccordez que la masse (GND), la transmission (TX) et la réception (RX).


Une fois les broches soudées et le port série relié au PC, vous pourrez y accéder avec un émulateur de terminal. Sur mon routeur, un modèle version 5, les paramètres de la communication sont 115200 8N1. Par contre, d'après le site de OpenWrt [1], dans sa version 3.2, le routeur boot à 9600bits/s, puis bascule à 115200 bits/s seulement une fois le kernel est lancé.

Sous Linux et avec un adaptateur série-USB, la commande ci-dessous permet d'accéder à la console du routeur. En branchant le routeur après avoir invoqué screen, je peux suivre tout le processus de boot:

sh$ screen /dev/ttyUSB0 115200 8N1
U-Boot 1.1.4 (Nov 16 2009 - 09:06:24)

AP93 (ar7240) U-boot
...
Starting kernel ...

Booting AR7240(Python)...
Linux version 2.6.15--LSDK-7.3.0.300 gcc version 3.4.4 #90 Tue Nov 17 14:56:38 CST 2009
...
+++ GE0 RX DMA ENABLE

La transcription précédente a été éditée pour plus de clarté. Comme on peut l'observer, le bootloader installé sur le routeur est Das U-Boot (U-Boot). Et le système d'exploitation embarqué est Linux 2.6. Une fois le boot terminé, en pressant return dans la console vous pourrez vous connecter sur le routeur. Le mot de passe root sur mon routeur est 5up. Il semblerait que ce soit le même sur tous les routeurs de ce modèle:

TL-WR841N mips #90 Tue Nov 17 14:56:38 CST 2009 (none)
TL-WR841N login: root
Password: 5up 
Jan  1 00:06:45 login[52]: root login  on `ttyS0'



BusyBox v1.01 (2009.01.06-01:38+0000) Built-in shell (msh)
Enter 'help' for a list of built-in commands.

# 

Vous le voyez, une fois connecté, vous ne disposerez pas d'un shell à part entière ni de l'ensemble des commandes user-mode d'un système Linux traditionnel, mais plutôt de la boîte à outils BusyBox.

Un examen de /etc/shadow montre qu'il est aussi possible de se connecter au système sous l'identité Admin (avec une majuscule) et avec le même mot de passe que root:

# cat /etc/shadow 
root:$1$$zdlNHiCDxYDfeF4MZL.H3/:10933:0:99999:7:::
Admin:$1$$zdlNHiCDxYDfeF4MZL.H3/:10933:0:99999:7:::
...

Je n'ai pas cherché à savoir à quel besoin spécifique correspondait le compte Admin. Mais il existe... Comme il s'agit d'un système Linux, il est possible d'obtenir des informations sur le matériel en examinant les pseudo-fichiers situés dans /proc:

# cat /proc/cpuinfo 
system type             : Atheros AR7240 (Python)
processor       : 0
cpu model       : MIPS 24K V7.4
BogoMIPS        : 265.21
...
# cat /proc/meminfo 
MemTotal:        30692 kB
MemFree:         20548 kB
...

L'examen de ces données vous permettra de déterminer si votre appareil remplit les exigences minimales pour installer la version d'OpenWrt que vous souhaitez. Ici, le modèle en ma possession est pleinement supporté par OpenWrt BackFire. Il est temps de passer à l’installation.

Télécharger OpenWrt par tftp

Il est possible d'installer OpenWrt uniquement via la liaison série. À 115200 bits/s, c'est un peu long. Ceci dit, nous installons un routeur équipé de ports Ethernet permettant d'accéder au réseau à des débits nettement plus intéressants. C'est donc plutôt par cette liaison que nous allons uploader l'image d'OpenWrt.

Pour la suite, vous devrez donc maintenir la liaison série entre votre ordinateur et la carte du routeur, mais en plus interconnecter les deux avec un câble Ethernet.

Serveur tftp

Une fois le routeur et votre PC reliés entre eux à la fois par liaison série et par Ethernet, il vous reste à installer un serveur TFTP sur ce dernier. Et à mettre à disposition dans le répertoire adéquat l'image d'OpenWrt qui vous intéresse. Sur un système Debian cela me conduit aux commandes suivantes:

# Installer le serveur TFTP
sh# apt-get install tftpd
# Créer le répertoire de téléchargement et y placer l'image d'OpenWrt
sh# mkdir /srv/tftpd
sh# cd /srv/tftpd
sh# wget http://downloads.openwrt.org/backfire/10.03.1-rc4/ar71xx/openwrt-ar71xx-tl-wr841nd-v5-squashfs-factory.bin

TFTP ne connait pas la sécurité!

C'est un peu exagéré, mais considérez qu'il n'y a aucune sécurité sur un serveur TFTP: N'importe qui sur le réseau peut télécharger des fichiers depuis votre serveur (download) sans avoir besoin de s'identifier – il suffit que le fichier existe dans le répertoire de téléchargement (/srv/tftp) et qu'il soit disponible en lecture pour tout le monde.

De la même manière, il est possible à n'importe qui de télécharger des fichiers vers votre serveur (upload) – il suffit que le fichier existe déjà dans le répertoire de téléchargement (/srv/tftp) et qu'il soit disponible en écriture pour tout le monde.

Si vous n'en avez plus besoin après l'installation de votre routeur, je vous suggère de supprimer tftpd après cette manipulation.

Installer sur le routeur

Pour la suite des manipulations, il faut accéder à U-Boot sur le routeur. Celui-ci est un bootloader et, comme son nom l'indique, son rôle est de charger puis lancer le système d'exploitation au démarrage de la machine. Autrement dit, U-Boot a le contrôle pendant les premières secondes du démarrage. Puis passe la main à Linux.

Vous sentez bien qu'il va y avoir une manipulation à faire en vitesse, non? effectivement, il va falloir redémarrer le routeur, et, quand le message Autobooting in 1 seconds apparaitra, taper les trois lettres tpl dans la console. Cela interrompra le processus de boot avant le lancement du kernel. Et vous donnera accès à la console de U-Boot. Quand le message apparaitra, vous aurez une seconde pour agir. C'est court. Soyez prêt – et même comme ça, il vous faudra peut-être plusieurs essais...

# Redémarrer le routeur (si vous avez ouvert une session dessus)
# On peut aussi simplement faire un arrêt-marche en débranchant la prise...
# reboot
...
U-Boot 1.1.4 (Nov 16 2009 - 09:06:24)

AP93 (ar7240) U-boot
...
Autobooting in 1 seconds
tpl
ar7240> 

Si vous arrivez à l'invite de commande ar7240>, c'est que vous avez réussi la manipulation. Dans le cas contraire, redémarrez le routeur, et retentez votre chance.

Das U-Boot est très complet, et permet non seulement de booter le routeur, mais aussi de modifier le contenu de la mémoire flash et de télécharger des fichiers par TFTP à partir du réseau. Ce sont ces possibilités que nous allons exploiter.

Tout d'abord, comme le système Linux n'est pas lancé, la configuration éventuelle de votre routeur n'est pas encore chargée. Il va donc falloir lui indiquer à partir de la console du bootloader son adresse IP. Nous allons également fixer l'adresse du serveur TFTP à partir duquel télécharger:

ar7240> setenv ipaddr 10.129.38.244
ar7240> setenv serverip 10.129.38.99

Le routeur n'a pas de disque dur. Donc le fichier téléchargé va devoir être stocké en RAM. Sur ce modèle, c'est à partir de l'adresse 0x80000000. Le fichier à charger est celui mis sur le serveur TFTP à l'étape précédente. Ceci nous donne la commande ci-dessous:

ar7240> tftpboot 0x80000000 openwrt-ar71xx-tl-wr841nd-v5-squashfs-factory.bin
Load address: 0x80000000
Loading: #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         ######################################################
done
Bytes transferred = 3932160 (3c0000 hex)

La taille du fichier téléchargé (3c0000 dans l'exemple ci-dessus) est importante pour la suite. Notez là: elle peut être différente dans votre cas.

Une fois le fichier contenant le firmware téléchargé, il va falloir le placer dans la mémoire non-volatile du routeur. Toujours sur ce modèle, celle-ci se situe à partir de l'adresse 0x9f020000. Nous allons donc effacer dans cette zone un bloc assez grand pour contenir le firmware téléchargé. Puis l'y copier. Dans les commandes ci-dessous, remplacez 0x3c0000 par la taille du fichier téléchargé dans votre cas:

ar7240> erase 0x9f020000 +0x3c0000
Erased 60 sectors
ar7240> cp.b 0x80000000 0x9f020000 0x3c0000
Copy to Flash... write addr: 9f020000

Maintenant, le firmware est stocké dans la mémoire flash du routeur. Il suffit de poursuivre le processus de boot à l'adresse correspondante:

ar7240> bootm 0x9f020000

Starting kernel ...

Linux version 2.6.32.25 (openwrt@ampere) (gcc version 4.3.3 (GCC) ) #1 Fri Nov 19 20:27:50 PST 2010
...
BusyBox v1.15.3 (2010-11-11 22:22:00 PST) built-in shell (ash)
Enter 'help' for a list of built-in commands.

 _______                     ________        __
 |       |.-----.-----.-----.|  |  |  |.----.|  |_
 |   -   ||  _  |  -__|     ||  |  |  ||   _||   _|
 |_______||   __|_____|__|__||________||__|  |___
          |__| W I R E L E S S   F R E E D O M
 Backfire (10.03.1-rc4, r24045) --------------------
  * 1/3 shot Kahlua    In a shot glass, layer Kahlua 
  * 1/3 shot Bailey's  on the bottom, then Bailey's, 
  * 1/3 shot Vodka     then Vodka.
 ---------------------------------------------------
root@OpenWrt:/# 

Et voilà: votre routeur boot sur OpenWrt. Pour vous convaincre que la modification est pérenne, vous pouvez rebooter celui-ci ou le débrancher du secteur. Au redémarrage, ce devrait toujours être OpenWrt qui boote. Le firmware d'origine a bien été remplacé.

Accès par SSH

Avant de terminer (et de refermer votre routeur), nous allons faire deux dernières modifications avec la console série: changer l'adresse IP du routeur et définir un mot de passe root. Ces deux manipulations visent à me permettre de poursuivre l'administration du routeur par ssh – et donc sans plus requérir l'utilisation de la console série:

root@OpenWrt:/# passwd
Changing password for root
New password: *********
Bad password: too short
Retype password: *********
Password for root changed by root
root@OpenWrt:/# vi /etc/config/network
...
config interface lan
        option ifname   eth0
        option type     bridge
        option proto    static
        option ipaddr   10.129.38.244
        option netmask  255.255.255.0
# Sauvegarde dans vi (<ESC>:wq)
root@OpenWrt:/# reboot

Remarque:

Dans Backfire, toute la configuration du routeur se fait à partir des fichiers du dossier /etc/config. Ce dossier est associé à un système de fichiers monté en lecture/écriture. Les modifications enregistrées sont donc directement écrites dans la mémoire flash. Ce qui dispense d'utiliser la commande mtd des versions précédentes.

Après avoir rebooté, si tout vous semble en ordre (à vérifier par exemple avec ifconfig sur la console du routeur), vous pouvez tenter de vous connecter à votre routeur par ssh à partir d'un autre poste du réseau:

sylvain@some_host$ ssh root@10.129.38.244
root@10.129.38.244's password: *********

BusyBox v1.15.3 (2010-11-11 22:22:00 PST) built-in shell (ash)
Enter 'help' for a list of built-in commands.

  _______                     ________        __
 |       |.-----.-----.-----.|  |  |  |.----.|  |_
 |   -   ||  _  |  -__|     ||  |  |  ||   _||   _|
 |_______||   __|_____|__|__||________||__|  |____|
          |__| W I R E L E S S   F R E E D O M 
 Backfire (10.03.1-rc4, r24045) --------------------
  * 1/3 shot Kahlua    In a shot glass, layer Kahlua 
  * 1/3 shot Bailey's  on the bottom, then Bailey's, 
  * 1/3 shot Vodka     then Vodka.
 ---------------------------------------------------
root@OpenWrt:~#

Dorénavant, il est possible d'administrer le routeur par SSH. Vous pouvez déconnecter l'interface série et refermer le routeur. Tout passera désormais par le LAN...

Ressources