[ARCHIVE] Modifier firmware Cisco RV016 RV042 RV042G RV082

Ici vous trouverez divers tutoriels pour Windows
Etre_Libre
Administrateur
Messages : 681
Inscription : 13 novembre 2012, 21:44

[ARCHIVE] Modifier firmware Cisco RV016 RV042 RV042G RV082

Message par Etre_Libre » 26 janvier 2013, 17:17

To read English version of that tutorial, click here (Pour voir ce tutoriel en Anglais, cliquer ici).

Note : ce tutoriel est mis en archive, il n'y a plus aucune aide apportée sur le sujet à part ce qui est contenu dedans.

Dans ce tutoriel, je vais expliquer comment télécharger et modifier le firmware des routeurs Cisco suivants, qui font partie de la série "Small Business" :

- RV016 V3
- RV042 V3
- RV042G (c'est comme un RV042 V3 avec des ports Gigabit Ethernet)
- RV082 V3


Toute version plus ancienne n'est pas prise en charge.

En fait, le firmware est le même pour ces 4 modèles, et ensuite selon le matériel détecté il y a plus ou moins de fonctionnalités activées.

L'intérêt de modifier le firmware a été pour moi :
- Accès telnet (ce qui n'était pas possible avec le firmware d'origine, car mot de passe inconnu)
- Accès SSH (logiciel ajouté)
- Support de ether-wake (Wake On Lan)

D'autres ajouts ou modifications sont possibles, à votre guise ;)

Télécharger ici un firmware modifié basé sur la version 4.2.3.07 (c'est la dernière version en début 2016)
Ce firmware a Telnet et SSH activés par défaut, et le mot de passe root défini à : cisco2016*
Si vous souhaitez créer votre propre firmware ou voir dans les détails les modifications que j'ai apporté, alors lisez la suite (à la fin j'ai indiqué les modifications exactes du firmware fait maison).


Important : le firmware open source fourni semble contenir les sources des parties GPL utilisées.
Par contre, tout ce qui est fait maison par Cisco est sous forme déjà compilée (binaire).


Firmware utilisé pour ce tutoriel : 4.2.3.07

Chez Cisco, pour obtenir le code source du firmware, on peut en faire la demande en téléchargeant un PDF du type :
"RV0xx-V3_4-2-3-x_OSD.pdf" sur leur site dans les téléchargements.

Dedans, on apprend qu'il faut leur envoyer un email à external-opensource-requests _at_ cisco.com avec un numéro de référence indiqué dans le PDF (ici ce fut 78EE117C99-113235201 pour le firmware le plus récent utilisé).

Dans mon cas, à chaque demande (chaque nouveau firmware = nouvelle demande) cela a pris quelques jours pour recevoir le firmware GPL.

On obtient un lien ou un accès FTP temporaire, qui peut fonctionner quelques heures à quelques jours.

Le fichier obtenu dans mon cas est : RV0XX-v4.2.3.07-GPL-20151110-2.tar.gz

Autrement, je propose le téléchargement direct du firmware :
--> cliquer ici pour le 4.2.3.07

Pour compiler ce firmware, je conseille Fedora 6 x86, même si depuis un firmware récent Cisco propose Fedora 8 x86_64.

Etant donné que c'est une très ancienne version de Fedora, j'ai supposé que si le firmware était
développé pour supporter un Fedora récent, cela pourrait demander beaucoup de développement.
En pour le bon fonctionnement, 2ème supposition : Cisco a sûrement adapté son firmware avec ses propres
besoins, donc un ancien Fedora ne semble pas si gênant.

Pour télécharger Fedora 6 x86, je propose 2 liens :

- Télécharger Fedora 6 x86 depuis la France (OVH)
- Télécharger Fedora 6 x86 depuis les archives officielles de Fedora (peut être plus lent)

Afin de vous faciliter la vie, je recommande d'installer Fedora 6 en machine virtuelle (VMware Workstation, VirtualBox, Xen, Parallels, etc...).

Fedora 6 pour Cisco RV042 V3 :

Durant l'installation, choisir de "personnaliser maintenant" (customize now) les paquets.

Ensuite, décocher tout ce qui est interface graphique, car ça ne sera d'aucune utilité.

On garde par exemple :

- Applications --> Editors --> vim-enhanced
- Applications --> Texte-based Internet --> elinks
- Development --> Development Libraries
- Development --> Development Tools
- Base System --> Base (quelques paquets ne serviront pas, comme les dictionnaires, et d'autres au choix)


Ensuite, installer le rpm "gperf" (il est dans le DVD de Fedora 6).

Si on a un fichier de type "RV0XX-v4.2.3.07-GPL-20151110-2.tar.gz", on peut le décompresser avec :

tar xfz RV0XX-v4.2.3.07-GPL-20151110-2.tar.gz

Si c'est par contre au format RAR, Fedora 6 ne le prend pas forcément en charge, on peut toujours décompresser avant (il y a juste quelques fichiers dedans) puis l'envoyer dans le Fedora via SFTP par exemple.

On obtient un dossier "GPL" contenant quelques fichiers compressés, et un "README", important à lire.

Dans le script "GPL_Make.sh" il y a juste une petite erreur (non bloquante) à la 1ère ligne :

Code : Tout sélectionner

!/bin/sh
Il manque juste un "#" au début, pour donner :

Code : Tout sélectionner

#!/bin/sh
Exemple du contenu complet de GPL_Make.sh :

Code : Tout sélectionner

#!/bin/sh

rm -fr /usr/local/cavium
rm -fr /tmp/*

echo "############# toolchain #############"
tar zxf octeon_toolchain-4.1.tar.gz
cd octeon_toolchain-4.1
make linux_release
mkdir -p /usr/local/cavium
cp -rf tools /usr/local/cavium/tools-gcc-4.1
cd ..

echo "############# RV SOURCE #############"
tar zxf RV0XX-v4.2.3.07-GPL.tar.gz
cd CI005-ipv6
cd linux/embedded_rootfs/pkg_addon/iptables-1.3.7
make clean; make clean; make clean; make clean
cd -
./RUN.sh
cd ..

echo "############## u-boot ###############"
tar zxf u-boot-gpl.tar.gz
cd trunk
./nk_config.sh
cd ..
Attention : la 1ère partie, dédiée à la compilation du toolchain (entre autres le compilateur cross-plateform pour compiler vers une machine avec processeur Cavium octeon, à architecture MIPS64) peut être longue.

A la fin s'affiche : "Image build success!"

Si à la fin, il y a ensuite une erreur avec la commande "cp -f bootimage /tftpboot/" ce n'est pas grave, c'est une étape optionnelle si jamais on voulait envoyer l'image en TFTP, et qui ne sert pas ici.

Pour la suite, au niveau des chemins de fichiers, pour information j'ai tout placé dans /root/ :

Et donc le fichier .bin obtenu avec la compilation :
/root/GPL/CI005-ipv6/linux/kernel_2.6/linux/code.bin

Ce fichier "code.bin" est le firmware final, à envoyer dans votre routeur Cisco.

Seulement, pour l'instant, le firmware reste non modifié, mais il fallait tester au moins une fois
pour vérifier le bon fonctionnement de départ.
Aussi, avec une modification qui sera faite, le toolchain n'aura pas besoin d'être recompilé à chaque fois,
seul le firmware le sera (c'est bien plus rapide).



Commençons les modifications :

Dans /root/GPL/GPL_Make.sh j'ai commenté plusieurs lignes afin que le toolchain ne soit pas recréé à chaque
fois, et que le firmware ne soit pas décompressé à chaque fois non plus :

Code : Tout sélectionner

#!/bin/sh

#rm -fr /usr/local/cavium
rm -fr /tmp/*

echo "############# toolchain #############"
#tar zxf octeon_toolchain-4.1.tar.gz
#cd octeon_toolchain-4.1
#make linux_release
#mkdir -p /usr/local/cavium
#cp -rf tools /usr/local/cavium/tools-gcc-4.1
#cd ..

echo "############# RV SOURCE #############"
#tar zxf RV0XX-v4.2.3.07-GPL.tar.gz
cd CI005-ipv6
cd linux/embedded_rootfs/pkg_addon/iptables-1.3.7
make clean; make clean; make clean; make clean
cd -
./RUN.sh
cd ..

echo "############## u-boot ###############"
tar zxf u-boot-gpl.tar.gz
cd trunk
./nk_config.sh
cd ..

Ainsi en exécutant à nouveau "GPL_Make.sh" seul le firmware est compilé à nouveau.


Telnet et mot de passe root

J'ai été confronté à une chose : bien que le serveur telnet puisse être activé temporairement via une url précise (http://ip_de_votre_routeur/sysinfo123.htm?ConsoleSimulation=1), le mot de passe root est inconnu (contrairement à d'anciens RV0XX connus sous la marque Linksys).
Note : l'url indiquée est valide une fois identifié sur le routeur via l'interface web.

Dans ce cas, on peut modifier le fichier /etc/shadow du firmware, dans le dossier :
/root/GPL/CI005-ipv6/linux/embedded_rootfs/etc-files

Ici se trouvent les fichiers "shadow" et "shadow-cisco", je ne sais pas pourquoi il y en a deux,
qui d'ailleurs ne semblent pas contenir le même mot de passe chiffré, mais autant changer les deux à la fois.

Par défaut, j'obtiens de ces fichiers :

[root@localhost etc-files]# more shadow
root:$1$9vy.Pgyx$.wDfqHPt/t7/6Q65kKScK0:13782:0:99999:7:::
[root@localhost etc-files]# more shadow-cisco
root:$1$QjtTLjmy$UPj.FGmd6DvpSFfH0YAfH0:13782:0:99999:7:::

Pour changer ce mot de passe, je propose une méthode simple :
Créer un compte Linux dans Fedora, attribuer un mot de passe, et copier / coller le contenu
de ce mot de passe chiffré dans les fichiers shadow du firmware cisco.

Commandes :
useradd jaimelesrouteurs
passwd jaimelesrouteurs


On obtient :
passwd: all authentication tokens updated successfully.

Puis en lisant /etc/shadow, il y a une ligne du type :
jaimelesrouteurs:$1$GJA0Dcnz$3q8j/VnT9M/zv6mIGakKO0:16809:0:99999:7:::

Dans ce cas, la partie qui nous intéresse est après les deux points ":" du nom d'utilisateur, et termine
dès qu'on rencontre un autre caractère deux points ":".

La partie est donc pour ce cas : $1$GJA0Dcnz$3q8j/VnT9M/zv6mIGakKO0

Et dans les fichiers shadow et shadow-cisco du firmware, on peut remplacer la chaîne similaire qui démarre
après le nom "root".

Cela donne pour le mot de passe "cisco2016*" :
root:$1$GJA0Dcnz$3q8j/VnT9M/zv6mIGakKO0:13782:0:99999:7:::

Et voilà, ainsi quand telnet sera activé (ponctuellement ou non), le mot de passe "root" sera connu.

De plus, via une commande dévoilée par la suite dans ce tutoriel, il sera possible de modifier le mot de
passe "root" sans modifier le firmware à chaque fois.

Si vous le souhaitez (pour tester), compiler le firmware à nouveau (GPL_Make.sh).


Une fois le firmware flashé, s'identifier sur le routeur, puis rentrer l'adresse :
http://ip_du_routeur/sysinfo123.htm?ConsoleSimulation=1

"ip_du_routeur" est à remplacer par l'adresse IP de votre routeur.

Ainsi, le serveur telnet s'active temporairement, et on doit pouvoir rentrer par cette porte.

Note : avec cette url, rien ne s'affiche, mais le serveur telnet est bien lancé sur le LAN.


On doit obtenir :
my-router login: root
Password:


BusyBox v1.2.1 (2016.01.09-17:59+0000) Built-in shell (ash)
Enter 'help' for a list of built-in commands.

~ #
Jusque là, le firmware obtenu en recompilant permet déjà un accès telnet ponctuel (à activer via l'url indiquée précédemment), et le mot de passe root est connu.


Modifications supplémentaires :

1) Busybox
Par défaut, le busybox fourni ne contient pas certains logiciels, comme :
ether-wake, ftpget/ftpput, wget, etc...

Attention : modifier busybox peut affecter le système Linux embarqué :
Je conseille de ne pas désactiver quelque chose, mais ajouter seulement ce qui vous semble nécessaire.

La configuration se trouve dans le fichier :
/root/GPL/CI005-ipv6/linux/embedded_rootfs/storage/busybox.config

Dans le même dossier, il y a aussi "busybox-1.2.1.tar.bz2" qu'on doit décompresser pour la configuration.

Rentrer dans le dossier "busybox-1.2.1" qui s'est créé.

Copier /root/GPL/CI005-ipv6/linux/embedded_rootfs/storage/busybox.config vers :
/root/GPL/CI005-ipv6/linux/embedded_rootfs/storage/busybox-1.2.1/.config

via "make menuconfig" modifier les options etc... (pour revenir d'un cran en arrière dans les menus, touche Echap).

Après, prendre le .config obtenu et remplacer le busybox.config de tout à l'heure (dans le dossier parent).

Puis, supprimer le dossier /root/GPL/CI005-ipv6/linux/embedded_rootfs/storage/busybox-1.2.1
et enfin supprimer le dossier /root/GPL/CI005-ipv6/linux/embedded_rootfs/build/busybox-1.2.1 à chaque modification de la configuration de Busybox.

2) Activer telnet par défaut, et utiliser un script sans reflasher le firmware à chaque fois :

Avec l'accès telnet temporaire, via "ps" on peut voir le processus lancé :
/usr/sbin/telnetd -l /bin/login

Ainsi, en modifiant le firmware (par exemple le fichier démarrage rc.local), on pourra lancer le serveur
telnet au démarrage.

Dans le routeur directement, le fichier se trouve dans : /sbin/rc.local

Dans Fedora avec le firmware open source, j'ai trouvé 3 fichiers :
/root/GPL/CI005-ipv6/linux/embedded_rootfs/etc-files/rc.local
/root/GPL/CI005-ipv6/linux/embedded_rootfs/pkg_addon/vendor/web_ui_Base/root/sbin/rc.local
/root/GPL/CI005-ipv6/linux/embedded_rootfs/pkg_addon/vendor/web_ui_Data/Model_sbin/RV0XX_CRAMFS/rc.local


Pour trouver le bon, je propose de lire le /sbin/rc.local du routeur et comparer avec les 3 fichiers.

Si des fichiers se ressemblent trop, on peut modifier les 3 fichiers, même si pour ma part c'est un des 2 derniers,
avec un RV042 V3.

Si on souhaite un seul firmware pour tous les routeurs Cisco indiqués au départ, autant modifier les 3.

Pour activer telnet par défaut, il suffit d'ajouter la ligne :
/usr/sbin/telnetd -l /bin/login

Note : par défaut il semble que telnet soit disponible uniquement sur le réseau local.
Pour accéder à distance à telnet, on peut créer une redirection de port vers l'IP locale du routeur ou ouvrir le port TCP 23 dans le Firewall du routeur.

Pour ce qui est du script dont j'ai parlé dans le titre, voici l'objectif :
Pouvoir modifier une partie du fonctionnement du routeur facilement, sans recompiler et reflasher le
routeur à chaque modification.


Pour cela, il est bon de savoir une chose :
Dans le routeur Cisco, un dossier bien spécial /etc/flash contient une petite mémoire Flash accessible
en écriture.
Il est utilisée entre autres pour les logs, la configuration et des certificats.

Avec la commande "df -h" j'ai pu lire :
/dev/mtdblock3 1.0M 524.0k 500.0k 51% /etc/flash
En plus clair, c'est une mini mémoire Flash de 1 Mo, et déjà pleine à un peu plus de la moitié.

La marge de manoeuvre est donc faible, mais largement suffisante pour insérer un script de démarrage.

Aussi, une chose intéressante est que ce routeur a de la RAM en stock, dont une partie pour /tmp :
none 50.2M 1.2M 49.0M 2% /tmp
On peut voir qu'il y a presque 50 Mo utilisables en RAM.

Dans ce cas, pourquoi pas un script de démarrage dans /etc/flash qui serait appelé par le /sbin/rc.local et en cas de modification du script de démarrage de /etc/flash on peut le faire directement via Telnet ou SSH et aucun flashage du firmware n'est nécessaire.

Attention à ne pas saturer la mémoire Flash de 1 Mo car il faut un peu de marge pour les logs, donc je propose de mettre le minimum dans cet endroit, et tout le reste est soit placé dans le firmware avant flashage, soit téléchargé via FTP (ftpget) ou SCP en compressé, puis décompressé en RAM dans /tmp et utilisé à cet endroit.

Avec ça, on a une meilleure marge de manoeuvre, et permet d'ajouter quelques programmes dont un serveur SSH.

Exemple : j'ai créé un dossier /etc/flash/perso et dedans un fichier "startup".
Je l'ai rendu exécutable via "chmod +x startup" et dedans j'ai écrit :

Code : Tout sélectionner

#!/bin/sh
sleep 20
/usr/sbin/telnetd -l /bin/login
Ainsi le script attend 20 secondes au démarrage du routeur, pour ne pas gêner le reste.
Ensuite, il lance le serveur telnet.
Cela permet de ne pas modifier trop le rc.local, car on pourrait ajouter uniquement une exécution du fichier /etc/flash/perso/startup et seulement s'il existe.

Voici un exemple basique de contenu à ajouter dans le rc.local avant de recompiler le firmware :

Code : Tout sélectionner

CUSTOMSCRIPT="/etc/flash/perso/startup"
if [ -e "$CUSTOMSCRIPT" ]
then
        $CUSTOMSCRIPT
fi
Ainsi, le script ne va s'exécuter que si le fichier existe, et on garde une bonne souplesse.


Fermer automatiquement un programme non souhaité :
"licensecheck" semble servir à certains services optionnels payants du routeur.
Si vous ne vous en servez pas, on peut fermer le programme en ajoutant dans le script de démarrage :

kill `pidof licensecheck`

et si on ne se sert pas du VPN du routeur :
kill `pidof nk_quickvpnd`
kill `pidof quickvpn_dos_prevent`


Et le module optionnel payant de filtrage d'url :
kill `pidof urlfilter`

J'ai aussi remarqué que même si dans le routeur on choisit un serveur NTP précis, en réalité le routeur en utilise toujours un 2ème (codé en dur).
Dans les processus (ps) on peut voir :
ntpclient -h fr.pool.ntp.org -l -s
ntpclient -h 218.75.4.130 -l -s


Ici, fr.pool.ntp.org est le serveur NTP choisi volontairement.

"218.75.4.130" n'a pas été choisi, il est là sans qu'on le sache au départ.

Code : Tout sélectionner

ps | grep "218.75.4.130" | sed -n '/grep/!p' | cut -d"r" -f1
--> retourne le PID du programme ntpclient de l'IP codée en dur : 218.75.4.130

Et pour fermer ce programme en une commande :

Code : Tout sélectionner

kill `ps | grep "218.75.4.130" | sed -n '/grep/!p' | cut -d"r" -f1`

Pour remplacer le mot de passe root (sans flasher à nouveau le firmware) :

Définir une 1ère fois un mot de passe dans Fedora 6 et noter celui qu'on voit dans /etc/shadow ou le faire dans le routeur pour root, et le noter.
Pour l'instant, il change si on redémarre le routeur, il est restauré par celui du routeur.

Créer une copie de votre /etc/shadow du routeur qui est prêt et modifié, et l'envoyer dans le dossier /etc/flash/perso par exemple.
cp /etc/shadow /etc/flash/perso/shadow_new

Au démarrage, il n'y aura qu'à faire remplacer ce fichier, via la commande :
cp -f /etc/flash/perso/shadow_new /etc/shadow


Compiler un logiciel pour le routeur, par exemple un serveur SSH dropbear

Dans le routeur Cisco RV0XX il y a un processeur à architecture MIPS64, donc différente du X86 utilisé dans Fedora 6 installé pour les modifications.

Il faut donc compiler tout logiciel avec le toolchain fourni par Cisco, qui se trouve dans :
/usr/local/cavium/tools-gcc-4.1

Dans le dossier "bin" on peut d'ailleurs trouver le compilateur :
mips64-octeon-linux-gnu-gcc
mips64-octeon-linux-gnu-cpp
mips64-octeon-linux-gnu-c++



Voici donc un exemple de logiciel que j'ai eu envie d'ajouter : dropbear

Il s'agit d'un serveur SSH minimaliste, et qui compile facilement (il ne fait pas appel à OpenSSL) pour différentes architectures.

Version utilisée de dropbear : dropbear-2015.71

Tout d'abord, télécharger les sources de dropbear, décompresser, et ajouter le compilateur mips64 via la commande :
export PATH=/usr/local/cavium/tools-gcc-4.1/bin:$PATH

Lancer le ./configure suivant (ou autre selon vos réglages) :
./configure --host=mips64-octeon-linux-gnu CFLAGS=-mabi=64 LDFLAGS=-mabi=64 --disable-zlib --disable-lastlog

Et le make adapté :
make PROGRAMS="dropbear dbclient dropbearkey scp"

Ainsi, on obtient les 4 programmes "dropbear dbclient dropbearkey scp" dans le dossier de dropbear, il n'y a plus qu'à les envoyer dans le routeur.

On peut soit les intégrer au firmware directement (et il faudra flasher à nouveau, j'en parlerai ensuite), ou alors monter un serveur FTP, et depuis le routeur récupérer les 4 fichiers via ftpget.

Pour la méthode via FTP, je me suis placé dans le dossier /tmp/perso (dossier créé), puis ai utilisé ce type de commandes :

Code : Tout sélectionner

ftpget -u identifiant -p pass_ftp ip_serveur_ftp dropbear dropbear/dropbear
ftpget -u identifiant -p pass_ftp ip_serveur_ftp dropbearkey dropbear/dropbearkey
ftpget -u identifiant -p pass_ftp ip_serveur_ftp dbclient dropbear/dbclient
ftpget -u identifiant -p pass_ftp ip_serveur_ftp scp dropbear/scp
Utilité des programmes compilés :
dropbear = serveur SSH
dropbearkey = générateur de clés pour le serveur SSH
dbclient = client SSH (facultatif)
scp = Transferts de fichiers pour envoyer et recevoir des fichiers depuis un client SCP (comme WinSCP)


Création clés :
./dropbearkey -t dss -f key_ssh_dss -s 1024
et
./dropbearkey -t rsa -f key_ssh_rsa -s 1024

Lancement du serveur SSH dropbear :
./dropbear -d /tmp/perso/key_ssh_dss -r /tmp/perso/key_ssh_rsa -a -p 22

Note : le port par défaut est 22, mais on peut le changer ;)

Tester une connexion SSH vers le routeur, et ça devrait fonctionner.

Attention néanmoins, pour l'instant dropbear se trouve toujours dans la RAM, mais serait effacé après redémarrage du routeur.
Une solution assez simple est proposée un peu plus loin.


Si vous avez usage du SCP, pour envoyer ou recevoir des fichiers dans le routeur, voici quelques informations supplémentaires :

Depuis un client SCP (comme WinSCP), on peut soit modifier le shell SCP utilisé dans les paramètres, par l'exécutable :
/tmp/perso/ssh_shell

Contenu de ssh_shell :

Code : Tout sélectionner

#!/bin/sh
PATH=$PATH:/usr/sbin:/sbin:/tmp/perso
/bin/ash
Ou alors, dans le routeur, on crée ou modifie le /etc/profile pour ajouter dans le PATH les dossiers /sbin et /usr/sbin voire même /tmp/perso si vous l'utilisez.

Ainsi, depuis WinSCP, les transferts de fichiers fonctionnent depuis ou vers le routeur ;)

Visuel de WinSCP connecté :
Image

Et pour mieux voir le paramétrage du shell dans WinSCP dans le mode avancé (shell à utiliser seulement si vous n'avez pas créé le fichier /etc/profile dans le routeur) :
Image

Seul bug visuel rencontré : parfois WinSCP indique que la commande "groups" n'a pas fonctionné,
car effectivement elle n'existe pas dans le routeur.
Cette commande n'est pas indispensable, ensuite WinSCP fonctionne quand même.

Pour masquer ce message d'erreur, on peut créer dans le routeur un fichier exécutable /tmp/perso/groups avec le contenu :

Code : Tout sélectionner

#!/bin/sh
echo ""
Il est aussi possible d'intégrer ce script dans le routeur dans /sbin (vu plus loin).

Compiler un logiciel pour le routeur, comme Curl

Note : lire d'abord la partie précédente qui parle de la compilation de Dropbear, ça aide bien.

Pour compiler Curl, j'ai pris la version 7.46.0 (téléchargement ici).

Si ce n'était pas fait, ajouter le compilateur mips64 dans le PATH via la commande :
export PATH=/usr/local/cavium/tools-gcc-4.1/bin:$PATH

Lancer le ./configure suivant (ou autre selon vos réglages) :
./configure --host=mips64-octeon-linux-gnu CFLAGS=-mabi=64 LDFLAGS=-mabi=64 --disable-shared --enable-ipv6

Puis un make simple :
make

On obtient alors (pour curl décompressé dans /root/) dans /root/curl-7.46.0/src :
Le fichier "curl" exécutable autonome, avec la libcurl incluse (librairie non partagée).

Il est ensuite transférable sur le routeur via HTTP, FTP, SCP ou ce que vous souhaitez, et Curl devient disponible pour vos scripts ;)


Conserver les programmes utilisés en RAM à chaque redémarrage du routeur :

Si vous avez tout terminé, on peut très bien compresser tout le dossier /tmp/perso en tar.gz puis l'envoyer vers un serveur en FTP ou SCP (plus souple, mais tout n'est pas intégré en dur dans le firmware).

Pour ma part j'ai choisi le FTP non chiffré, plus simple pour mes besoins (quitte à ajouter un chiffrement du fichier via OpenSSL).

Dans le dossier /tmp/perso on peut avoir comme fichiers :
key_ssh_dss
key_ssh_rsa
curl
dbclient
dropbear
dropbearkey
groups
scp
ssh_shell


Une fois dans le dossier /tmp :
tar czf routeur_perso.tar.gz perso

Cela compresse le dossier "perso" vers le fichier "routeur_perso.tar.gz"

Ensuite envoi vers un serveur FTP via ftpput :
ftpput -u identifiant -p motdepasse -P port_serveur nom_hote_serveur routeur_perso.tar.gz routeur_perso.tar.gz

J'ai mis 2 fois "routeur_perso.tar.gz" dans la commande car le fichier distant est pour moi le même nom que le fichier local.

Et un peu de fantaisie, dans le script de démarrage :
echo "Bienvenue sur votre routeur modifie..." > /etc/motd

Ainsi quand on se connecte en telnet ou SSH, le message de bienvenue apparaît :)

Dans le script de démarrage, ajouter enfin la commande "ftpget" qui va bien afin de récupérer le dossier compressé via FTP, le décompresser, et lancer les programmes que vous aurez mis dedans.

Exemple de script à ajouter au démarrage pour récupérer votre dossier "perso" via FTP :

Code : Tout sélectionner

perso_file="routeur_perso.tar.gz"
tmp_folder="perso"
cd /tmp
ftpget -u identifiant -p motdepasse -P port_serveur nom_hote_serveur $perso_file $perso_file
if [ -f /tmp/$perso_file ]
then
        echo "Le fichier est bien telecharge"
        tar xzf $perso_file
        rm $perso_file
        if [ -d /tmp/$tmp_folder ]
        then
                echo "Le dossier est bien decompresse"
                cd $tmp_folder
                ./dropbear -d /tmp/$tmp_folder/key_ssh_dss -r /tmp/$tmp_folder/key_ssh_rsa -a -p 22
        fi
fi

Quelques explications :
Dans le script de démarrage proposé :
Après téléchargement du fichier compressé via FTP, je vais vérifier qu'il existe bien, puis idem sur le dossier décompressé.
Dans ce cas seulement les commandes suivantes sont exécutées.

Cela évite des messages d'erreur quand on lance le routeur déconnecté d'internet par exemple.


Modifications précises du firmware tout prêt que je fournis :

Pour rappel je fournis désormais un firmware fait maison, voici le lien :
Télécharger ici un firmware modifié basé sur la version 4.2.3.07 (dernière version)

Avec ce firmware maison, j'ai voulu intégrer directement plus de choses, sans faire appel à un serveur FTP externe, tout est dans le firmware.

Dedans, j'ai modifié Busybox pour activer ether-wake, wget, ftpget / ftpput.

J'ai modifié les fichiers shadow et shadow-cisco qui sont dans "/root/GPL/CI005-ipv6/linux/embedded_rootfs/etc-files/" afin de mettre le mot de passe root "cisco2016*" par défaut.

Aussi, j'ai remarqué que les dossiers suivants se copient dans le /sbin du routeur :
/root/GPL/CI005-ipv6/linux/embedded_rootfs/pkg_addon/vendor/web_ui_Base/root/sbin
et
/root/GPL/CI005-ipv6/linux/embedded_rootfs/pkg_addon/vendor/web_ui_Data/Model_sbin/RV0XX_CRAMFS

J'ai donc copié les fichiers suivants dedans :
- curl (compilé par mes soins, mais sans support SSL)
- dbclient (dropbear)
- dropbear (dropbear)
- dropbearkey (dropbear)
- groups (script maison qui renvoie un message vide, pour aider au fonctionnement de WinSCP)
- scp (dropbear)

Aussi, j'ai modifié les 3 fichiers rc.local suivants :
/root/GPL/CI005-ipv6/linux/embedded_rootfs/etc-files/rc.local
/root/GPL/CI005-ipv6/linux/embedded_rootfs/pkg_addon/vendor/web_ui_Base/root/sbin/rc.local
/root/GPL/CI005-ipv6/linux/embedded_rootfs/pkg_addon/vendor/web_ui_Data/Model_sbin/RV0XX_CRAMFS/rc.local

A la fin, j'ai ajouté un script fait maison :

Code : Tout sélectionner

PERSONALFOLDER="/etc/flash/perso"
CUSTOMSCRIPT="$PERSONALFOLDER/startup"
KEY_SSH_DSS="$PERSONALFOLDER/key_ssh_dss"
KEY_SSH_RSA="$PERSONALFOLDER/key_ssh_rsa"
SHADOW_NEW="$PERSONALFOLDER/shadow_new"

if [ ! -d "$PERSONALFOLDER" ]
then
        mkdir $PERSONALFOLDER
fi

if [ ! -e "$CUSTOMSCRIPT" ]
then
        touch $CUSTOMSCRIPT
                chmod 755 $CUSTOMSCRIPT
                echo "#!/bin/sh" >> $CUSTOMSCRIPT
                echo "echo \"Bienvenue sur votre routeur avec firmware modifie...\" > /etc/motd" >> $CUSTOMSCRIPT
                echo "echo \"Welcome into your router with modded firmware...\" >> /etc/motd" >> $CUSTOMSCRIPT
                echo "sleep 20" >> $CUSTOMSCRIPT
                echo "/usr/sbin/telnetd -l /bin/login" >> $CUSTOMSCRIPT
                echo "sleep 20" >> $CUSTOMSCRIPT
                echo "/sbin/dropbear -d /etc/flash/perso/key_ssh_dss -r /etc/flash/perso/key_ssh_rsa -a -p 22" >> $CUSTOMSCRIPT
fi

if [ ! -e "$KEY_SSH_DSS" ]
then
        /sbin/dropbearkey -t dss -f $KEY_SSH_DSS -s 1024
fi

if [ ! -e "$KEY_SSH_RSA" ]
then
        /sbin/dropbearkey -t rsa -f $KEY_SSH_RSA -s 1024
fi

touch /etc/profile
echo "PATH=$PATH:/usr/sbin:/sbin" >> /etc/profile
echo "export PATH" >> /etc/profile

if [ -e "$SHADOW_NEW" ]
then
        cp -f $SHADOW_NEW /etc/shadow
fi

$CUSTOMSCRIPT
Ce script permet de :
- Corriger le PATH (modifiez le si vous souhaitez inclure plus de dossiers)
- Créer automatiquement le dossier /etc/flash/perso et le script de démarrage s'ils n'existent pas
- Créer des clés SSH pour dropbear si elles n'existent pas
- Ajouter un message d'accueil quand on se connecte en Telnet ou SSH
- Lancement de Telnet
- Lancement du serveur SSH dropbear
- Si détection de votre propre fichier "shadow_new" dans /etc/flash/perso alors il va être copié automatiquement dans le routeur, ce qui permet de changer le mot de passe root sans flasher à nouveau le routeur
- A tout moment si vous ne voulez plus certaines fonctions ou si vous voulez modifier le port SSH, etc... il suffit de modifier le script /etc/flash/perso/startup qui est modifiable sans problème car dans la mémoire flash.

Note : le serveur SSH dropbear autorise la redirection de ports, j'ai testé et cela fonctionne bien ;)

Redémarrer le routeur :
"busybox reboot" ou directement "reboot" si votre PATH est bien modifié.
Dernière modification par Etre_Libre le 09 janvier 2016, 19:07, modifié 18 fois.

Etre_Libre
Administrateur
Messages : 681
Inscription : 13 novembre 2012, 21:44

Re: Modifier firmware Cisco RV016 RV042 RV042G RV082

Message par Etre_Libre » 13 juillet 2013, 21:06

Mise à jour du tutoriel :

- Firmware 4.2.2.08
- Légers changements dans les explications
- Dropbear est désormais disponible dans le tutoriel directement

Etre_Libre
Administrateur
Messages : 681
Inscription : 13 novembre 2012, 21:44

Re: Modifier firmware Cisco RV016 RV042 RV042G RV082

Message par Etre_Libre » 05 août 2013, 19:28

Mise à jour du tutoriel :

- Aide pour la compilation de Curl (autonome, sans librairie partagée)

smarly

Re: Modifier firmware Cisco RV016 RV042 RV042G RV082

Message par smarly » 28 avril 2014, 16:31

Super tuto, qui devrait permettre à beaucoup d'ajouter des fonctions basiques à ce routeur performant mais un peu limité en termes de fonctions.
Pour mon cas je suis un peu feignant, serait il possible d'avoir un lien vers un binaire tout prêt avec le telnet ouvert ?
Merci pour d'avance.

Etre_Libre
Administrateur
Messages : 681
Inscription : 13 novembre 2012, 21:44

Re: Modifier firmware Cisco RV016 RV042 RV042G RV082

Message par Etre_Libre » 28 avril 2014, 19:30

En fait le "problème" peut être le suivant :

Si je crée un firmware diffusé sur Internet avec telnet activé, je dois définir un mot de passe root, mot de passe qui sera donc "connu" car il n'est pas changeable via leur interface web.

Certes on peut faire exécuter un script à chaque démarrage du routeur qui va faire remodifier le mot de passe root, mais il faut y penser ;)

smarly

Re: Modifier firmware Cisco RV016 RV042 RV042G RV082

Message par smarly » 29 avril 2014, 11:15

Ca ne me dérange pas vu que l'accés sera fermé de l'exterieur et qu'effectivement je peux changer le mot de passe dans le script (voir meme fermer le telnet dans le script).
Maintenant si il est possible d'avoir un lien privé vers un binaire avec un mot de passe custom :) ...
Merci pour votre aide.

Etre_Libre
Administrateur
Messages : 681
Inscription : 13 novembre 2012, 21:44

Re: Modifier firmware Cisco RV016 RV042 RV042G RV082

Message par Etre_Libre » 29 avril 2014, 20:14

Dans ce cas je vais voir si je peux en préparer un ce week-end, ou à défaut la semaine prochaine ;)

smarly

Re: Modifier firmware Cisco RV016 RV042 RV042G RV082

Message par smarly » 30 avril 2014, 10:15

Etre_Libre a écrit :Dans ce cas je vais voir si je peux en préparer un ce week-end, ou à défaut la semaine prochaine ;)
Thanks!

Etre_Libre
Administrateur
Messages : 681
Inscription : 13 novembre 2012, 21:44

Re: Modifier firmware Cisco RV016 RV042 RV042G RV082

Message par Etre_Libre » 02 mai 2014, 10:26

Sur le site de Cisco, je viens de voir qu'il y a un nouveau firmware 4.2.3.03 qui est daté du 30 avril, avec à la clé quelques fonctionnalités ajoutées et des bugs corrigés.

Je viens donc de leur demander s'ils peuvent m'envoyer le nouveau firmware open source, et je me baserai là dessus ;)

Etre_Libre
Administrateur
Messages : 681
Inscription : 13 novembre 2012, 21:44

Re: Modifier firmware Cisco RV016 RV042 RV042G RV082

Message par Etre_Libre » 05 mai 2014, 16:25

N'ayant eu aucune nouvelle de ma demande de firmware, je viens de faire une nouvelle demande avec une autre adresse email.

Verrouillé