4 points par GN⁺ 2023-08-11 | 1 commentaires | Partager sur WhatsApp
  • 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
  • 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 LIB vers le dossier WpdPack/Lib/x64/

1 commentaires

 
GN⁺ 2023-08-11
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

    • Je n’arrête pas de sourire en lisant tout ça. ArpChat risque fort de donner une crise cardiaque aux administrateurs réseau, mais l’idée elle-même est vraiment géniale. Je faisais aussi partie de ceux qui lisaient des livres sur les couches OSI pour le plaisir, donc ça me parle
      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
    • La bannière en bas du README est vraiment drôle et magnifique. Beau travail
    • Tu t’attends à ce que ça fonctionne aussi sous Linux ?
      # sudo getcap ./arpchat
      ./arpchat cap_net_raw=ep
      J’obtiens « error getting channel, might be missing permissions »
      Ajout : cette erreur vient d’arpchat, pas de la configuration setcap
  • C’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 avec arp, détermine l’adresse MAC correspondant à cette IP. En général, c’est l’adresse IP locale du routeur
    Aujourd’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

    • J’ai du mal à être d’accord avec l’idée qu’ARP serait un savoir obscur. Pour quelqu’un qui fait du réseau, comprendre ARP, ou au moins le connaître, reste presque indispensable. arping est très utile pour vérifier si un équipement du même segment réseau est allumé mais ne répond pas au ping ICMP
      Si vous regardez des dumps tcpdump ou 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 application
    • Aujourd’hui, ce serait probablement plus souvent 802.11. Mais quand un hôte doit obtenir une IP, ARP peut quand même être utilisé sur n’importe quel protocole de couche liaison de données : https://en.wikipedia.org/wiki/Data_link_layer
    • Si ARP devient vraiment quelque chose d’inconnu, c’est dommage. Il est difficile d’imaginer prétendre comprendre le fonctionnement des réseaux IP sans avoir au moins une familiarité minimale avec ARP
    • On peut aussi coder en dur les entrées ARP d’autres machines du réseau ayant une adresse IP fixe
  • Abuser 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:ff vers tout le domaine de broadcast
    Mê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

    • Il utilise aussi un autre principe important des bases du réseau : au bout du compte, tout n’est que nombres
      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
    • L’une des premières attaques DDoS par amplification que j’ai vues remonte aux années 1990 : elle consistait à usurper l’adresse de l’hôte victime comme source, puis à envoyer un ping à l’adresse de broadcast d’un réseau de campus naïf
      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
    • Tu parles de https://hpbn.co/ ?
  • 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

    • Intéressant pour la même raison. Si l’on peut envoyer et recevoir des messages ARP contenant une charge utile arbitraire, cela faciliterait clairement le dépannage des VLAN ou d’autres vérifications de connectivité L2
    • D’après mes tests, ça peut traverser pas mal de choses
  • 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/

    • Pour moi, la beauté de ce projet n’est pas la messagerie elle-même, mais le fait de détourner un protocole réseau bas niveau pour s’échapper de choses comme l’isolation des clients
  • Au lycée, j’ai fait ça avec net send et je me suis fait engueuler

    • J’avais trouvé cette astuce et l’avais montrée à quelques amis, mais le secret n’a pas duré longtemps. Très vite, un groupe plus large, même pas composé d’amis, l’utilisait pour tricher pendant les cours en salle informatique. La triche flagrante m’agaçait, et j’étais aussi un peu contrarié que des gens que je n’aimais pas spécialement tirent profit de ce que j’avais découvert
      J’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
    • write passe le bonjour
      https://en.wikipedia.org/wiki/Write_(Unix)
    • Dans mon souvenir, net send devait être connecté à un domaine, donc je ne pense pas que ça utilisait ARP
    • Si l’analyseur réseau se trompait ou ne prêtait pas attention aux paquets ARP bizarres, la messagerie via ARP aurait probablement été difficile à détecter
    • C’était une autre époque. À l’université, par erreur — enfin, intentionnellement — nous avons envoyé un message à tout le domaine, et les profs d’IT ont immédiatement regardé dans notre direction, nous les fauteurs de troubles
  • Trè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