4 pontos por GN⁺ 2023-08-11 | 1 comentários | Compartilhar no WhatsApp
  • arpchat é uma ferramenta transformada em aplicativo de chat usando ARP, que os computadores utilizam para encontrar o endereço MAC de outros computadores na mesma rede
  • O projeto foi motivado pelo caso de uso de querer conversar com amigos em uma rede com isolamento entre clientes
  • Ele implementa um protocolo de transporte genérico simples sobre ARP, permitindo enviar mensagens com dezenas de milhares de caracteres, além de usar um pouco de compressão
  • Conta com um sistema de descoberta de presença e heartbeat para atualizar a lista de usuários online, junto com notificações de entrada e saída
  • Os binários para instalação podem ser baixados na página de releases
    • No Windows, pode ser necessário o npcap, e durante a instalação é preciso selecionar Install Npcap in WinPcap API-compatible Mode
    • No Linux, pode ser necessário conceder permissão de rede com sudo setcap CAP_NET_RAW+ep /path/to/arpchat
  • O binário é executado no terminal, e se a mensagem enviada aparecer na própria tela, isso indica que está funcionando normalmente
  • O build foi testado na versão unstable mais recente do Rust, e o build para Windows exige o WinPcap Developer's Pack e a configuração da variável de ambiente LIB para a pasta WpdPack/Lib/x64/

1 comentários

 
GN⁺ 2023-08-11
Opiniões do Hacker News
  • Sou a pessoa que fez isso. Também fiz outra coisa que publiquei no HN hoje (https://news.ycombinator.com/item?id=37062422), então achei bem curioso ver o ArpChat aparecer junto. Provavelmente alguém viu meu perfil
    Foi um projeto muito divertido, e aprendi bastante sobre redes
    Pouco tempo atrás tive a oportunidade de usá-lo de verdade em um ambiente totalmente offline, e foi divertido. Só que depois descobri um bug grande, e esse bug estava causando uma latência enorme. Já corrigi, mas ainda não consegui publicar os novos artefatos de build; então, se você pretende testar em um ambiente real, é melhor compilar direto do código-fonte. Também adicionei, por diversão, cores para nomes de usuário e horários das mensagens. Prometo publicar uma nova release em breve
    Se houver interesse, também tenho um texto de cerca de um ano atrás explicando como o ArpChat funciona: https://kognise.dev/writing/arp

    • Estou rindo sem parar enquanto leio tudo isso. O ArpChat tem grande potencial de causar um infarto em administradores de rede, mas a ideia em si é muito legal. Eu também era do tipo que lia livros sobre camadas OSI por diversão, então me identifico
      Espero que você continue brincando com código. É um pouco parecido com o que justine tunney mostrou em trabalhos como https://justine.lol/ape.html. É aquela sensação de mergulhar fundo em uma área que só uma minoria entende direito, por exemplo os detalhes dos formatos binários de compiladores, e então fazer uma pergunta maluca como “será que dá para amarrar todos os formatos binários em um único metaformato e fazê-lo realmente executar em todos eles?”, e depois criar algo que de fato funciona
    • O banner no fim do README é muito engraçado e bonito. Belo trabalho
    • Você espera que funcione também no Linux?
      # sudo getcap ./arpchat
      ./arpchat cap_net_raw=ep
      Recebo “error getting channel, might be missing permissions”
      Adendo: esse erro vem do arpchat, não da configuração do setcap
  • Era exatamente isso que eu queria. Brincadeiras na camada de enlace de dados
    Para quem não sabe o que é o Address Resolution Protocol (ARP), de forma bem grosseira, ele é o elo perdido que liga endereços MAC (usados pela Ethernet) a endereços IP (usados pela internet). Quando a tabela de roteamento IP, que você pode ver com route, decide para qual endereço IP o pacote deve ser enviado em seguida, o cache ARP, que você pode ver com arp, determina o endereço MAC correspondente a esse IP. Normalmente é o endereço IP local do roteador
    Hoje em dia, só saber que ARP existe já parece um pouco um conhecimento místico de não especialistas, e o irmão dele no IPv6, o Neighbor Discovery Protocol, ainda mais. Mesmo que em implantações modernas baseadas em nuvem você não lide diretamente com isso com frequência, saber que existe dá uma visão panorâmica muito mais completa de toda a pilha de rede

    • Tenho dificuldade em concordar que ARP seja um conhecimento obscuro. Para quem trabalha com redes, entender ARP, ou pelo menos conhecê-lo, ainda é quase essencial. arping é muito útil para verificar se um equipamento no mesmo segmento de rede está ligado, mas não responde a ping ICMP
      Ao olhar dumps do tcpdump ou do Wireshark, você inevitavelmente vai se deparar com isso em pouco tempo. Mas engenheiros de software, como nuvem e redes tradicionais são bem diferentes, talvez acabem encontrando isso primeiro ao depurar a rede de casa, e não uma aplicação
    • Hoje em dia, o mais comum provavelmente é 802.11. Ainda assim, quando um host precisa obter um IP, ARP pode ser usado em qualquer protocolo da camada de enlace de dados: https://en.wikipedia.org/wiki/Data_link_layer
    • Se ARP está realmente se tornando algo desconhecido, é uma pena. É difícil imaginar alguém dizendo que entende como redes IP funcionam sem ter ao menos uma familiaridade mínima com ARP
    • Também dá para codificar manualmente a entrada ARP de outro computador na rede que tenha um endereço IP fixo
  • É divertido abusar do fato de que ARP pode carregar payloads arbitrários, mas, explicando de novo do ponto de vista de introdução a redes, o ponto central de que o autor depende é o simples fato de que switches fazem flooding para todo o domínio de broadcast de pacotes destinados a ff:ff:ff:ff:ff:ff
    Mesmo sem privilégios de superusuário ou permissões para pacotes brutos, se você enviar um pacote para o endereço de broadcast L3, normalmente ele será inundado em L2, então dá para criar uma propagação de mensagens parecida. Ou seja, mandar ping para o endereço de broadcast é divertido
    Não há nenhuma vantagem especial em usar ARP. Além disso, muitos switches modernos têm recursos para monitorar pacotes ARP, então despejar grandes volumes de tráfego ARP falso pode de fato ter efeitos ruins. Ainda assim, é um trabalho divertido, e me lembra as brincadeiras que eu fazia quando estava aprendendo. Pessoalmente, acho que eu teria abusado de ICMP para esse propósito, e isso talvez possa ser um rumo futuro de desenvolvimento. Aplausos pelo projeto divertido

    • Também está usando outro princípio importante de introdução a redes: no fim, é tudo número
      ARP, DNS, HTTP e TLS são, por um lado, exatamente aqueles protocolos em que pensamos, mas ao mesmo tempo são todos apenas números. ARP acessa o mesmo espaço de números que HTTP. Não é como se só UDP usasse bytes de 11 bits, nem como se houvesse uma instrução especial de CPU que só DNS pudesse usar. No fim, é tudo número. No final, você pode empurrar para o fio os números que quiser, e o resto do mundo recebe esses números e segue fazendo o que já fazia
    • Um dos primeiros ataques DDoS por amplificação que vi foi nos anos 1990: falsificavam o endereço do host vítima como origem e então enviavam ping para o endereço de broadcast de uma rede de campus ingênua
      Hoje em dia isso não deveria funcionar, mas na época havia implementações TCP/IP ingênuas — ou seja, muitas delas participavam de bom grado
    • Você está falando de https://hpbn.co/?
  • Gosto de abusar de protocolos que já vêm embutidos por padrão na maioria dos sistemas operacionais. Como não encontrei um sistema de mensagens GUI/CLI multiplataforma que não exigisse a instalação de um software cliente separado, já criei um compartilhamento Samba falso e idiota que permitia ver mensagens no Finder.app/Explorer.exe/Gnome/KDE
    No ambiente de rede local, nem chamadas ao netcat funcionavam muito bem, e para fazer broadcast também havia diferenças de flags entre sistemas operacionais. A ideia era ver as mensagens do compartilhamento Samba no navegador de arquivos, clicar nelas e então alterar o nome do arquivo para atualizar um “mural” de 3 linhas
    https://github.com/jedahan/samba-haiku/blob/master/index.js
    Isso também era, originalmente, uma reimplementação de algo que usava SSIDs de Wi-Fi para criar haikus de captive portal
    https://github.com/jedahan/haiku-wifi

  • Pode ser ainda mais divertido do que parece. Eu estava separando a rede com VLANs usando hardware de um grande fornecedor e descobri que, embora as VLANs funcionassem na maioria dos casos, o tráfego ARP estava vazando
    As máquinas deveriam enviar todo o tráfego pelo roteador, mas às vezes viam respostas ARP que não deveriam ver e concluíam que podiam alcançar diretamente outra máquina. Como resultado, não conseguiam enviar tráfego até que a entrada do cache ARP expirasse, o que dava bastante dor de cabeça. O fornecedor era grande demais para se importar e não demonstrou interesse em corrigir o bug
    Em certas situações, este app de chat poderia atravessar VLANs

    • Interessante pelo mesmo motivo. Se for possível enviar e receber mensagens ARP com payloads arbitrários, isso certamente facilitaria a resolução de problemas de VLAN ou outras verificações de conectividade L2
    • Pelo que testei, dá para atravessar bastante coisa
  • Minha esposa, meus filhos e eu trabalhamos ou estudamos de casa na maior parte do tempo, então frequentemente ficamos em cômodos separados. Usamos o BeeBEEP para trocar mensagens quando precisamos. O fato de não precisar de servidor e ter clientes para Linux e Windows foi decisivo
    Funciona muito bem, mas às vezes preciso reiniciá-lo depois que um notebook sai da suspensão para voltar a ver as outras pessoas na LAN. E minha única reclamação, praticamente, é não poder abrir uma janela de mensagem para uma pessoa específica diretamente pelo ícone da bandeja. Também dá para copiar e colar fotos engraçadas de gatos, e há recursos que não uso, como transferência de arquivos. Não é propaganda paga, só me alonguei mesmo
    https://www.beebeep.net/

    • Vejo a beleza deste projeto não nas mensagens em si, mas em usar de forma abusiva um protocolo de rede de baixo nível para escapar de coisas como isolamento de clientes
  • No ensino médio, fiz isso com net send e levei bronca

    • Descobri esse truque e mostrei a alguns amigos, mas o segredo não durou muito. De repente, um grupo maior de pessoas que nem eram meus amigos estava usando isso para colar nas aulas do laboratório de informática. A cola descarada me incomodava, e também fiquei um pouco irritado por pessoas de quem eu nem gostava estarem se beneficiando de algo que eu tinha descoberto
      Então fiz spoofing do nome de usuário do administrador do sistema (não era difícil no Win9x) e enviei uma mensagem de advertência severa. Pelo jeito ficaram bem assustados, porque as mensagens pararam de repente
    • write mandou lembranças
      https://en.wikipedia.org/wiki/Write_(Unix)
    • Pelo que lembro, net send precisava estar conectado a um domínio, então acho que não usava ARP
    • Se o analisador de rede estivesse errado ou não se importasse com pacotes ARP estranhos, mensagens via ARP provavelmente seriam difíceis de detectar
    • Bons tempos. Na faculdade, por acidente — ou melhor, de propósito — enviamos uma mensagem para o domínio inteiro, e os professores de TI imediatamente olharam para nós, os encrenqueiros
  • Muito legal. Mas TCP/IP não segue o modelo OSI, então é difícil aplicar diretamente as distinções sutis do OSI
    Na prática, dá para dizer que ARP é definido como camada 2.5 no modelo TCP/IP de Stevens, então chamá-lo de 2.5 parece o mais adequado. E quadros ARP não são roteados, portanto claramente não são L3

  • Na época em que NAT IPv4 era praticamente o padrão — e ainda é, embora hoje também existam IPv6 e CGNAT — cheguei a criar algo chamado NATChat
    Basicamente, ele criava uma sala de bate-papo com base no endereço IPv4 público, permitindo conversar com qualquer pessoa na mesma rede. Era bem legal para usar com outras pessoas no escritório. Escritório, aliás, era uma coisa que existia naquela época

  • Há algo parecido em C++: https://github.com/gbonacini/arpchatcpp