Après avoir exploré le cœur du système et les outils disponibles, il est temps de s'intéresser à ce qui fait du Karotz un objet véritablement connecté : Ses services réseau.
Comment accéder au lapin à distance ?
Quels ports sont ouverts ?
Quels serveurs tournent en arrière-plan ?
Et surtout, qu'est-ce que tout cela implique en termes de sécurité sur votre réseau local ?
Découverte des ports ouverts
Une fois connecté en telnet, la commande netstat révèle les ports en écoute :
netstat -tlnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:6600 0.0.0.0:* LISTEN 1309/mpd
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1242/inetd
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 1242/inetd
tcp 0 0 0.0.0.0:23 0.0.0.0:* LISTEN 1242/inetd
netstat: /proc/net/tcp6: No such file or directory
Quatre ports ouverts :
| Port | Service | Géré par | Description |
|---|---|---|---|
| 21 | FTP | inetd | Transfert de fichiers |
| 23 | Telnet | inetd | Shell à distance |
| 80 | HTTP | inetd | Interface web |
| 6600 | MPD | mpd | Lecteur musical (clef USB) |
Les outils réseau disponibles
La commande busybox --list révèle les outils réseau intégrés :
busybox --list | grep -E "^(ping|wget|nc|telnet|ftp|nslookup|traceroute|ifconfig|netstat|arp|route)$"
arp
ifconfig
nc
netstat
nslookup
ping
route
telnet
traceroute
wget
En plus de BusyBox, le Karotz dispose également de binaires compilés séparément dans /usr/bin/ :
Testons quelques outils :
ping -c 2 google.com
PING google.com (64.233.167.102): 56 data bytes
64 bytes from 64.233.167.102: seq=0 ttl=108 time=21.848 ms
64 bytes from 64.233.167.102: seq=1 ttl=108 time=21.400 ms
--- google.com ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 21.400/21.624/21.848 ms
curl -k https://www.miniil.be 2>&1 | head -10
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
curl: (35) error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version
OpenSSL 1.0.0b (2010) ne supporte que TLS 1.0. Les serveurs modernes qui exigent TLS 1.2+ sont inaccessibles même si on contourne la verification du certificat avec l'option -k. HTTPS fonctionne uniquement avec les serveurs qui acceptent encore TLS 1.0, et sans vérification de certificat.
Toutes les communications réseau du Karotz passent donc essentiellement en clair. Sur un réseau local domestique, ce n'est pas réellement un problème mais si votre Karotz est exposé à Internet le risque est bien réel.
inetd : le chef d'orchestre
Sur le Karotz, les services réseau ne tournent pas en permanence. C'est inetd (internet daemon) qui écoute sur les ports et lance le service approprié uniquement quand une connexion arrive.
Cette approche économise la mémoire précieuse sur un système embarqué avec seulement 60 Mo de RAM.
inetd est lancé au démarrage via /etc/inittab :
cat /etc/inittab | grep inetd
::respawn:/sbin/inetd -f /usr/etc/inetd.conf
Le fichier /usr/etc/inetd.conf définit les services :
cat /usr/etc/inetd.conf
# <service_name> <sock_type> <proto> <flags> <user> <server_path> <args>
21 stream tcp nowait root /bin/busybox ftpd -w /
23 stream tcp nowait root /bin/busybox telnetd -i
80 stream tcp nowait root /bin/busybox httpd -i -c /karotz/etc/httpd.conf -h /usr/www
Analysons une ligne :
| Champ | Valeur | Signification |
|---|---|---|
| Port | 21 | Port d'écoute |
| Type | stream | Connexion TCP (vs dgram pour UDP) |
| Proto | tcp | Protocole |
| Flags | nowait | Peut gérer plusieurs connexions simultanées |
| User | root | Utilisateur qui exécute le service |
| Commande | /bin/busybox ftpd -w / | Programme à lancer |
Les trois services sont fournis par BusyBox :
- ftpd (
-w /) — serveur FTP avec accès en écriture sur/ - telnetd (
-i) — serveur Telnet lancé par inetd - httpd (
-i -c ... -h ...) — serveur HTTP, racine dans/usr/www
Dropbear : le SSH dormant
Le Karotz embarque Dropbear, un serveur SSH léger pour systèmes embarqués.
which dropbear
/bin/dropbear
Cependant, il n'est pas activé par défaut. Le répertoire de configuration est vide :
ls -la /etc/dropbear/
total 4
drwxr-xr-x 1 root root 2048 Jan 1 1970 .
drwxr-xr-x 1 root root 2048 May 9 2011 ..
Techniquement, il serait possible de l'activer : générer les clefs avec dropbearkey, les stocker sur une partition persistante (/usr/), et lancer Dropbear au démarrage avec l'option -r pour spécifier leur emplacement.
Mais est-ce vraiment nécessaire ? Telnet fait le travail sur un réseau local, et ajouter un service SSH consommerait des ressources sur un système déjà limité avec 60 Mo de RAM.
MPD : le lecteur musical
Le port 6600 est occupé par MPD (Music Player Daemon). C'est un serveur de lecture audio qui permet de jouer des fichiers MP3 depuis une clef USB branchée sur le Karotz.
MPD n'est pas actif par défaut. Une fois configuré, il peut être contrôlé :
- Localement via netcat
- À distance via des clients MPD (M.A.L.P. sur Android, ncmpcpp sur PC, ...)
- Via l'interface web de miniil's OpenKarotz
Conclusion
Le Karotz dispose donc de plusieurs services réseau : Telnet, FTP et HTTP via inetd et MPD pour la musique.
Dropbear (SSH) est présent mais non configuré.
Toutes ces communications passent en clair, il n'y a pas de HTTPS côté serveur, pas de SSH actif, et le client HTTPS est limité à TLS 1.0.
Sur un réseau local domestique, ce n'est pas un problème. Mais quand le lapin est exposé sur Internet, le risque est présent.
Et si on améliorait la sécurité en ajoutant HTTPS au serveur web du Karotz ?
Je tenterai cela prochainement et ceci fera l'objet d'un prochain article.
