Arpchat - aplicativo de chat que envia mensagens para amigos na mesma rede usando apenas ARP
(github.com/kognise)- 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
- No Windows, pode ser necessário o npcap, e durante a instalação é preciso selecionar
- 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
LIBpara a pastaWpdPack/Lib/x64/
1 comentários
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
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
# sudo getcap ./arpchat./arpchat cap_net_raw=epRecebo “error getting channel, might be missing permissions”
Adendo: esse erro vem do arpchat, não da configuração do
setcapEra 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 comarp, determina o endereço MAC correspondente a esse IP. Normalmente é o endereço IP local do roteadorHoje 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
arpingé muito útil para verificar se um equipamento no mesmo segmento de rede está ligado, mas não responde a ping ICMPAo olhar dumps do
tcpdumpou 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É 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:ffMesmo 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
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
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
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
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/
No ensino médio, fiz isso com
net sende levei broncaEntã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
writemandou lembrançashttps://en.wikipedia.org/wiki/Write_(Unix)
net sendprecisava estar conectado a um domínio, então acho que não usava ARPMuito 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