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)
 
Note : Le message netstat: /proc/net/tcp6: No such file or directory indique simplement que le noyau n'inclut pas le support IPv6 — rien d'anormal pour un système embarqué de cette époque.
 

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/ :

Outil Description Version
curl client HTTP/HTTPS avec support SSL curl --version
curl 7.21.2 (arm-unknown-linux-gnu) libcurl/7.21.2 OpenSSL/1.0.0b zlib/1.2.5
Protocols: dict file ftp ftps gopher http https imap imaps pop3 pop3s rtsp smtp smtps telnet tftp
Features: Largefile NTLM SSL libz
openssl outils cryptographiques openssl version
OpenSSL 1.0.0b 16 Nov 2010
netcat GNU netcat (en plus du nc BusyBox) /usr/bin/netcat --help 2>&1 | head -5
GNU netcat 0.7.1, a rewrite of the famous networking tool.
Basic usages:
connect to somewhere:  /usr/bin/netcat [options] hostname port [port] ...
listen for inbound:    /usr/bin/netcat -l -p port [options] [hostname] [port] ...
tunnel to somewhere:   /usr/bin/netcat -L hostname:port -p port [options]


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 flag respawn garantit qu'inetd redémarre automatiquement s'il plante.
 

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.

Aucun commentaire