- arpchat est un outil transformé en appli de chat en utilisant ARP, le protocole dont les ordinateurs se servent pour trouver l’adresse MAC d’autres machines sur le même réseau
- Le projet part d’un cas d’usage : vouloir discuter avec ses amis sur un réseau avec isolation client
- Un protocole de transport générique simple est implémenté au-dessus d’ARP, ce qui permet d’envoyer des messages de plusieurs dizaines de milliers de caractères, avec un peu de compression
- Il intègre un système de presence discovery et de heartbeat pour mettre à jour la liste des utilisateurs en ligne, avec notifications de connexion et de départ
- Les binaires d’installation sont disponibles sur la releases page
- Sous Windows, npcap peut être nécessaire ; lors de l’installation, il faut choisir
Install Npcap in WinPcap API-compatible Mode - Sous Linux, il peut être nécessaire d’accorder les permissions réseau avec
sudo setcap CAP_NET_RAW+ep /path/to/arpchat
- Sous Windows, npcap peut être nécessaire ; lors de l’installation, il faut choisir
- Le binaire s’exécute dans le terminal, et si le message envoyé apparaît sur son propre écran, on peut considérer que cela fonctionne correctement
- La compilation a été testée avec la dernière version unstable de Rust ; pour le build Windows, il faut le WinPcap Developer's Pack et définir la variable d’environnement
LIBvers le dossierWpdPack/Lib/x64/
1 commentaires
Avis de Hacker News
C’est moi qui ai créé ça. J’ai aussi fait l’autre projet posté aujourd’hui sur HN (https://news.ycombinator.com/item?id=37062422), donc c’est assez drôle de voir qu’ArpChat a aussi été posté. Quelqu’un a probablement regardé mon profil
C’était un projet vraiment amusant, et j’ai beaucoup appris sur le réseau
Il y a quelque temps, j’ai même eu l’occasion de l’utiliser pour de vrai dans un environnement totalement hors ligne, et c’était fun. Cela dit, j’ai ensuite découvert un gros bug, qui provoquait énormément de latence. Je l’ai corrigé, mais je n’ai pas encore mis en ligne de nouvel artefact de build ; donc si vous comptez le tester en conditions réelles, mieux vaut le compiler vous-même depuis les sources. J’ai aussi ajouté, pour le fun, des couleurs de nom d’utilisateur et l’heure des messages. Je promets de publier bientôt une nouvelle release
Si ça vous intéresse, j’ai aussi écrit il y a environ un an un article sur le fonctionnement d’ArpChat : https://kognise.dev/writing/arp
Continue à t’amuser avec du code. Ça ressemble un peu à ce que justine tunney a montré avec des travaux comme https://justine.lol/ape.html : creuser en profondeur un domaine que très peu de gens comprennent vraiment, par exemple les détails des formats binaires de compilateurs, puis poser une question folle du genre « et si on pouvait relier tous les formats binaires dans un méta-format unique qui s’exécute réellement partout ? », et finir par fabriquer quelque chose qui marche vraiment
# sudo getcap ./arpchat./arpchat cap_net_raw=epJ’obtiens « error getting channel, might be missing permissions »
Ajout : cette erreur vient d’arpchat, pas de la configuration
setcapC’est exactement le genre de chose que je voulais. Des bricolages au niveau de la couche liaison de données, quoi
Pour ceux qui ne savent pas ce qu’est l’Address Resolution Protocol (ARP), en très gros, c’est le chaînon manquant entre les adresses MAC (utilisées par Ethernet) et les adresses IP (utilisées par Internet). Quand la table de routage IP, visible avec
route, décide à quelle adresse IP envoyer ensuite un paquet, le cache ARP, visible avecarp, détermine l’adresse MAC correspondant à cette IP. En général, c’est l’adresse IP locale du routeurAujourd’hui, le simple fait de savoir qu’ARP existe passe presque pour un savoir ésotérique non professionnel, et son cousin côté IPv6, Neighbor Discovery Protocol, encore plus. Même si on n’y touche pas souvent directement dans les déploiements modernes basés sur le cloud, savoir qu’il existe donne une vision d’ensemble bien plus complète de toute la pile réseau
arpingest très utile pour vérifier si un équipement du même segment réseau est allumé mais ne répond pas au ping ICMPSi vous regardez des dumps
tcpdumpou Wireshark, vous finirez forcément par le croiser. Cela dit, pour les ingénieurs logiciel, comme le cloud et les réseaux traditionnels sont très différents, ils peuvent le rencontrer d’abord en déboguant leur réseau domestique plutôt que leur applicationAbuser du fait qu’ARP peut transporter une charge utile arbitraire est amusant, mais pour reformuler ça du point de vue d’une introduction au réseau, le point clé sur lequel l’auteur s’appuie est simplement que les switches floodent les paquets destinés à
ff:ff:ff:ff:ff:ffvers tout le domaine de broadcastMême sans privilèges superutilisateur ni droits d’émission de paquets bruts, envoyer un paquet à une adresse de broadcast L3 provoque généralement un flooding en L2, ce qui permet de créer une propagation de messages similaire. Autrement dit, envoyer un ping à une adresse de broadcast est amusant
Il n’y a pas d’avantage particulier à utiliser ARP. De plus, beaucoup de switches modernes surveillent les paquets ARP ; envoyer un gros volume de faux trafic ARP peut donc réellement avoir des effets négatifs. Cela reste un travail intéressant, et ça me rappelle les bidouilles que je faisais quand j’apprenais. Personnellement, j’aurais probablement abusé d’ICMP pour cet usage, et ce pourrait être une piste de développement future. Bravo pour ce projet amusant
ARP, DNS, HTTP, TLS sont d’un côté exactement les protocoles auxquels on pense, mais en même temps ce ne sont que des nombres. ARP accède au même espace de nombres que HTTP. UDP n’est pas le seul à utiliser des octets de 11 bits, et il n’existe pas d’instruction CPU spéciale réservée à DNS. À la fin, tout n’est que nombres. Au bout du compte, on peut pousser sur le fil les nombres qu’on veut, et le reste du monde les reçoit puis fait ce qu’il avait à faire
Aujourd’hui, ça ne devrait plus fonctionner, mais à l’époque, les implémentations TCP/IP naïves, c’est-à-dire beaucoup d’entre elles, participaient volontiers
J’aime détourner des protocoles intégrés par défaut dans la plupart des systèmes d’exploitation. Comme je ne trouvais pas de système de messagerie GUI/CLI multiplateforme ne nécessitant pas d’installer de logiciel client séparé, j’ai un jour créé un faux partage Samba idiot permettant de voir des messages dans Finder.app/Explorer.exe/Gnome/KDE
Sur le réseau local, même les appels à netcat ne marchaient pas très bien, et pour faire du broadcast il y avait aussi des différences de flags selon les systèmes d’exploitation. Le principe était de consulter un message de partage Samba dans le navigateur de fichiers, de cliquer dessus, puis de modifier le nom du fichier pour mettre à jour un « tableau d’affichage » de 3 lignes
https://github.com/jedahan/samba-haiku/blob/master/index.js
C’était aussi une réimplémentation d’un truc qui, à l’origine, utilisait les SSID Wi‑Fi pour créer des haïkus de captive portal
https://github.com/jedahan/haiku-wifi
Ça peut être encore plus amusant que prévu. Nous isolions des réseaux avec des VLAN sur du matériel de grands fournisseurs, et nous avons découvert que, dans la plupart des cas, les VLAN fonctionnaient, mais que le trafic ARP fuyait
Les machines étaient censées envoyer tout leur trafic via le routeur, mais il leur arrivait de voir des réponses ARP qu’elles n’auraient pas dû voir et d’en conclure qu’elles pouvaient joindre directement d’autres machines. Résultat : elles ne pouvaient plus envoyer de trafic jusqu’à l’expiration des entrées du cache ARP, ce qui était pénible. Le fournisseur était trop gros pour s’en soucier et n’a montré aucun intérêt pour corriger le bug
Dans certaines situations, cette appli de chat pourrait même traverser les VLAN
Ma femme, mes enfants et moi travaillons ou étudions surtout depuis la maison, donc nous sommes souvent chacun dans une pièce séparée. Pour nous envoyer des messages quand on en a besoin, nous utilisons BeeBEEP. Le fait qu’il n’ait pas besoin de serveur et qu’il existe à la fois des clients Linux et Windows a été décisif
Ça fonctionne plutôt bien, mais après la sortie de veille d’un portable, il faut parfois le redémarrer pour revoir les autres personnes du LAN. Et le fait de ne pas pouvoir ouvrir directement une fenêtre de message vers une personne précise depuis l’icône de la zone de notification est à peu près mon seul reproche. On peut aussi copier-coller des photos de chats amusantes, transférer des fichiers et utiliser d’autres fonctions dont je ne me sers pas. Ce n’est pas une pub payée, je bavarde juste un peu longuement
https://www.beebeep.net/
Au lycée, j’ai fait ça avec
net sendet je me suis fait engueulerJ’ai donc usurpé le nom d’utilisateur de l’administrateur système (ce n’était pas difficile sous Win9x) et envoyé un message d’avertissement sévère. Vu que tous les messages se sont arrêtés d’un coup, ils ont dû être assez surpris
writepasse le bonjourhttps://en.wikipedia.org/wiki/Write_(Unix)
net senddevait être connecté à un domaine, donc je ne pense pas que ça utilisait ARPTrès chouette. Cela dit, TCP/IP ne suit pas le modèle OSI, donc il est difficile d’appliquer telles quelles les distinctions subtiles de l’OSI
En pratique, ARP peut être considéré, selon le modèle TCP/IP de Stevens, comme relevant de la couche 2,5 ; l’appeler 2,5 me semble donc le plus juste. Et comme les trames ARP ne sont pas routées, ce n’est clairement pas du L3
À l’époque où le NAT IPv4 était de fait la norme — ce qui reste en partie vrai, mais aujourd’hui il y a aussi IPv6 et le CGNAT — j’avais créé quelque chose appelé NATChat
En gros, ça créait des salons de discussion à partir de l’adresse IPv4 publique, ce qui permettait de discuter avec n’importe qui sur le même réseau. C’était plutôt pratique au bureau avec d’autres personnes. Les bureaux existaient encore à l’époque
Il existe aussi quelque chose de similaire en C++ : https://github.com/gbonacini/arpchatcpp