Il y a plus d'un an, j'ai lu un article qui parlait de comment quelqu'un a pénétré des serveurs DNS parce qu'ils n'étaient plus maintenus depuis un moment (voir The Journey to Hijacking a Country's TLD). Dans cet article, l'auteur évoque un protocole qui aujourd'hui a quasiment disparu, sauf sur les machines qu'il a pénétré (anciennes et peu maintenues). Du coup, ça m'a intrigué, et j'ai voulu en savoir plus.
Dans la première édition de UNIX, publiée en 1971, pour savoir qui était actuellement connecté et actif, on utilisait who, qui utilisait le fichier utmp— j'en parle dans un article précédent (voir Logs de connexion sur UNIX-like). Seulement, ce programme était assez peu pratique pour savoir lorsqu'un interlocuteur en particulier est disponible, la dernière fois qu'il a été vu, où il est, et caetera.
Suivant ce constat, Les Earnest inventa un programme nommé « finger » qui permettait enfin de faire cela ; ce programme était accompagné d'un protocole qui a été standardisé en 1977 dans la RFC 742 par Ken Harrenstien et utilise le port tcp/79. Cette RFC évolua plusieurs fois jusqu'en 1991 dans la RFC 1288, alors que le protocole fut progressivement abandonné.
De nos jours, sous Manjaro Linux, l'utilitaire finger se trouve dans le paquet netkit-bsd-finger. Il existe aujourd'hui très peu de serveurs Finger avec lesquels interagir, mais finger permet également de faire des requêtes locales pour obtenir des résultats tels que celui-ci (avec un fichier .plan personnalisé) :
Login: cake Name: Thomas Touhey
Directory: /home/cake Shell: /bin/zsh
Office: 0621612972, 016-943-9574
On since Mon Jan 8 13:17 (CET) on tty7 from :0
52 minutes 26 seconds idle
No mail.
Plan:
__ _ _
/ _(_)_ __ __ _ ___ _ __ __| |
| |_| | '_ \ / _` |/ _ \ '__/ _` |
| _| | | | | (_| | __/ | | (_| |
|_| |_|_| |_|\__, |\___|_| \__,_|
yet another |___/ finger daemon
Find out more about the project on
https://forge.touhey.org/fingerd.git
Les utilisations de l'utilitaire sont assez simples :
- finger
On demande la liste des utilisateurs locaux connectés.
- finger user
On demande des informations concernant les utilisateurs locaux ayant user dans leur nom.
- finger @host
On demande la liste des utilisateurs connectés à l'hôte host (à remplacer avec un nom d'hôte, localhost ou touhey.fr par exemple).
- finger user@host
On demande les informations concernant les utilisateurs ayant user dans leur nom à l'hôte host.
- finger <…>@hehe@host
On demande à l'hôte host de transmettre une requête à l'hôte hehe (les serveurs Finger d'aujourd'hui vous refuseront certainement de le faire).
La sortie de ces commandes, comme pour whois (voire pire), a un format irrégulier puisqu'il a été pensé dès le départ comme étant lu par des humains ; dans le cas d'une requête distante, l'utilitaire local vous transmet directement la réponse du serveur.
Pour le défi, je me suis alors lancé dans le développement d'un serveur implémentant ce protocole. J'ai choisi Python, mon langage de scripting préféré, et ai ainsi lancé le projet fingerd l'année dernière, sur lequel je travaille de façon assez irrégulière.
cake@68 :: fingerd/public » python -m fingerd &
Starting fingerd on [127.0.0.1]:3999.
Starting fingerd on [::1]:3999.
cake@68 :: fingerd/public » finger @localhost
[localhost]
[127.0.0.1] list connected users.
Site: TOUHEY.FR
Command line:
Login Name TTY Idle Login Time Office
john Johnny Boy ttyS2 =TODO= =TODO= Rob's office
cake@68 :: fingerd/public » kill -INT %1
Stopping fingerd on [::1]:3999.
Stopping fingerd on [127.0.0.1]:3999.
Le projet est toujours en cours de développement, mais j'ai déjà implémenté la gestion du protocole (avec le module socketserver), décomposé le problème en plusieurs objets, à savoir le serveur lui-même, l'interface avec le reste du système pour avoir les utilisateurs, l'afficheur et le logger qui s'occupe de consigner les requêtes.
Le fait d'avoir fait des interfaces m'a donné une idée qui est déjà plutôt développée : celle de faire une interface de fiction, en permettant de scripter les créations, éditions, suppressions, connexions, déconnexions, changements de dossier courant, shell, etc, d'utilisateurs pour raconter une histoire. Le protocole n'a jamais été pensé pour raconter une histoire en soi, mais pour organiser les rencontres ; c'est comme regarder une pièce de théâtre par un trou de serrure, mais après tout, pourquoi pas ?
En tous les cas, je continuerai ce projet avec le même rythme irrégulier qu'actuellement, et qui sait, un jour, finger @touhey.fr pourrait vous raconter quelque chose d'intéressant !