Faça uma caminhada em um campo limpo ou como coletar endereços MAC de dispositivos Wi-Fi próximos

Começo todos os meus discursos públicos (felizmente, não existem muitos) mencionando explícita ou implicitamente a tese “Nosso setor é complexo, os problemas podem ser revelados a qualquer momento, mesmo o mais óbvio, e é otimista presumir que tudo será simples e fácil - ingênuo” . Curiosamente, essa idéia simples, obtida por muitos anos de cones recheados, às vezes é uma revelação para especialistas mais experientes, embora pareça que todo o entusiasmo frenético e a crença na infalibilidade de suas próprias idéias e práticas devam ter sido resistidos por um longo tempo. Vou contar uma história sobre isso, um exemplo de um projeto simples, à primeira vista.




Um belo dia, um amigo me lançou um link para uma startup interessante . Os caras sugeriram que representantes de pequenas empresas do setor de serviços e vendas estabelecessem um ponto de acesso (com um portal cativo) para seus clientes para distribuir a Internet, coletando simultaneamente os endereços MAC dos smartphones das pessoas que passavam. O objetivo desta ação é muito simples: um grande número de redes de publicidade permite segmentar a lista de endereços de dispositivos; portanto, direcionando a empresa de publicidade para os usuários que passarem, provavelmente receberemos novos visitantes (porque é perto e "em algum lugar que eu já vi") . Essa. tal distribuição de folhetos virtuais. Um amigo perguntou como isso é feito e se podemos fazer isso novamente.

Uma rápida pesquisa no tópico revelou o mecanismo dessa coleta de dados. O adaptador WiFi foi iniciado no modo de escuta aérea e percorreu os canais, capturando pacotes, analisando-os e agregando os dados recebidos. Também havia utilitários abertos prontos para isso, por exemplo, airodump-ng do aircrack-ng . Essa. para repetição, precisamos apenas executar esse utilitário, de preferência em um dispositivo compacto e portátil, e inserir os dados recebidos no banco de dados, a partir do qual obtemos listas prontas de endereços MAC para redes de anúncios. Parece que a tarefa é simples, resolvida em uma, no máximo - duas noites de trabalho descontraído, quase tudo está pronto.

Claro, isso nunca foi o caso.

Como você sabe, o que é permitido a Júpiter não é permitido ao touro. E quando os pagadores únicos são usados, é necessário sacrificar, antes de tudo, recursos de computação e memória. Além disso, o sacrifício de recursos é seguido pelo sacrifício da conveniência de desenvolvimento e depuração - nem todo sistema permite arrastar ferramentas de compilação para o dispositivo.

Inicialmente, queríamos algo simples e barato, por exemplo, caixas Orange Pi Zero, coloque airodump-ng lá e encaminhe os dados cuspidos pelo utilitário para o servidor, onde eles podem ser colocados com segurança no banco de dados. Eu tinha experiência em trabalhar com esses sistemas distribuídos com um centro dedicado (embora, lá, as máquinas virtuais agissem como cavalos de trabalho levantados pela API da nuvem através do mesmo centro necessário, mas não o ponto), então parte do código foi migrado com sucesso para um novo projeto .

A ferramenta para encaminhar dados para o servidor foi o aplicativo Erlang mais simples escrito, que deveria extrair dados do amortecedor ether (análise), serializá-los (serialização nativa de Erlang) e transferi-los via soquete da web para o servidor via HTTPS (sem causar suspeitas) Sistemas DPI e não inventando seus próprios protocolos). Os processadores Allwinner H2 + usados ​​no Orange Pi são poderosos o suficiente para montar e depurar diretamente no dispositivo. Novamente, em teoria, está tudo bem.

A prática começou.

1. como se viu, o WiFi embutido no Orange Pi era bom apenas para pegar um ponto de acesso e lançar dados no servidor. Bem, mais precisamente, não o próprio adaptador, mas o suporte de seu chipset no kernel. Para a maioria dos projetos de IoT, isso provavelmente seria suficiente. No entanto, estávamos prontos para esse golpe, porque um estudo preliminar do site aircrack-ng deu uma clara e ambígua ambição: "não funcionará em todos os lugares; se não for nossa culpa, anexaremos uma lista de chipsets testados". Quase todos os dispositivos Atheros (comprados pela Qualcomm) e Ralink (comprados pela MediaTek) foram encontrados na lista, o que inspirou algumas perspectivas no caso de uma transição de vorazes ARMs chineses para MIPS mais ascéticos de chipsets para roteadores.

Mas, enquanto tudo isso vai do ranho e do pau, ou seja, prototipado - você precisa resolver o problema aqui e agora. Portanto, aproveitamos esses exóticos em nosso tempo tecnológico (quando a comunicação sem fio é mais leve) como um adaptador USB Wi-Fi. Estudar a lista de compatibilidade e compará-la com a variedade da loja mais próxima deu uma vítima - o DLink DWA-160 na revisão C1 (isso é importante porque outras revisões de hardware usavam um chip diferente e causavam dor de cabeça em termos de execução do trabalho). Banda dupla, que não exige dança com o motorista, já que o apoio está no centro, esse apito veio a calhar mais tarde em outros projetos, então eu os comprei, provavelmente todos (cinco peças) disponíveis em nossa cidade provincial.



Depois de me certificar de que o dispositivo estava funcionando, eu o conectei a um dispositivo de placa única e desliguei o adaptador WiFi embutido com a expectativa de que a Internet estivesse disponível através da interface Ethernet.



O segundo porco foi colocado por aerodinâmica. Este conjunto de utilitários foi criado com o objetivo de hackear.Verificações de penetração de WiFi, ou seja, foi escrito por hackers para hackers. Não sei, graças a qual lógica eles preferiram usar o dumper etéreo sem fio, não na forma de uma abordagem unix-way tradicional, para cuspir texto estruturado para processamento adicional, mas para criar uma interface completa para exibir informações quase em tempo real (e levando em consideração as configurações do terminal) por redes e dispositivos descobertos, mas eles fizeram exatamente isso. Sim, eu achei a API Python de um grau desconhecido de prontidão para tudo isso, mas, novamente, a aranha de prototipagem que vivia em minha cabeça proibiu estritamente arrastar outra linguagem, mudar para outra (lembramos, a parte do servidor já estava parcialmente pronta e escrita estava longe de Python-e) ou, Deus não permita, implementar o airodump-ng com base no tcpdump. E consequentemente,Eu tive que procurar soluções alternativas.

Felizmente, os hackers sem fio começaram a suspeitar que algo constantemente estúpido na interface é uma atividade desse tipo; portanto, eles implementaram o upload periódico de tudo o que foi encontrado e agregado na forma de arquivos CSV. Com um intervalo definido. Você já pode viver com isso. Obviamente, a opção ingênua - executar o utilitário e reler o arquivo em um timer - foi imediatamente fornecida à mão. Trabalhando em um laptop, ao transferir para uma placa única, ele começou a falhar no processo de leitura do arquivo por razões óbvias - às vezes o utilitário simplesmente não tinha tempo para descarregar tudo e alguns dados eram irremediavelmente perdidos.

A solução para isso foi o mecanismo de inotificação no kernel, notificando as operações do arquivo - assim que meu código viu as alterações no arquivo de dados, ele iniciou sua leitura com um pequeno atraso (em vez disso, tendo um valor puramente psicológico, tranquilize seu autor). As experiências mostraram que, neste caso, falhas de leitura e perda de dados não ocorrem. Bem, legal, CSV parsim, coloque em estruturas internas e envie para o servidor. Nós o salvamos no servidor no PostgreSQL (obrigado pelo jsonb) e depois disso já é possível fazer consultas, descarregamentos de formulários etc. Adicionaremos a autorização mais simples usando uma chave simétrica, para não empacotarmos o lixo lá e podermos vincular os dados ao ponto em que o dispositivo está instalado, e tudo parece estar bem, você pode ir para a batalha.

Sim, agora como. A montagem de teste dessa cadeia (e a redação e depuração do código realmente levou algumas noites) revelou um fato engraçado - o número de endereços capturados por dia em nosso escritório, longe o suficiente de locais públicos passíveis de flutuação, em torno de milhares de peças. Sim, é claro, havia um pequeno hotel por perto (estava em período de isolamento de pré-quarentena, não se surpreenda), mas ainda assim há muito.

Atualizando o conhecimento da estrutura do endereço MAC e lembrando que os dispositivos móveis geralmente geram endereços locais para ocultar seus verdadeiros endereços MAC, modifiquei a parte do servidor com um filtro simples que limpa todos os endereços locais e de broadcast na entrada. A lista foi reduzida por uma ordem de magnitude e já parecia a verdade. Tudo estava pronto para testes de campo.

Como você sabe, ao mudar de local de um escritório acolhedor e confortável para condições de combate cruéis, os protótipos tendem a deixar de funcionar normalmente; portanto, o processo de implementação deve ser acompanhado pelo fornecimento de um engenheiro de bolso que corrija todos os problemas emergentes. Por outro lado, também é sabido que um dispositivo que não requer dança adicional com um pandeiro no início da operação provavelmente quebrará em breve e de forma irrevogável. Isso, com certeza, foi refletido nas leis de Murphy, mas, infelizmente, o autor dessas linhas é muito preguiçoso para verificar qual delas, portanto, concordaremos com o termo "lei da maldade".

A primeira instalação imediatamente revelou um monte de falhas.

Em primeiro lugar, a maioria das placas de prototipagem chinesas vem com memória microSD de longo prazo, em oposição aos chips flash NAND / NOR. Uma exceção é feita apenas para SoC poderoso, claramente redundante para esta tarefa. Infelizmente, o MicroSD é a dor de cabeça imediata do operador - oxidação dos pads, falha dos cartões SD, dependência dos contatos na temperatura dentro do gabinete (o que é considerável, os chips chineses não são muito eficientes em termos de energia e as placas são frequentemente calculadas completamente com base em consumo de energia de pico, portanto, sem um radiador adicional, bem, de jeito nenhum). Portanto, quando a energia foi retirada do dispositivo, o sistema entrou em estado inoperável - os arquivos com o bytecode ERTS foram danificados, após a reinicialização, o aplicativo se recusou a funcionar.

O segundo momento desagradável - no ponto de instalação, a Internet era fornecida por um roteador LTE e era, para dizer o mínimo, de qualidade medíocre, diferente de um fio de escritório. A rede constantemente disparava, o aplicativo geralmente era reconectado ou até morria de mensagens acumuladas nas filas.

Obviamente, os dois problemas são superáveis, por exemplo, a perda de dados seria eliminada pela busca da combinação ideal de boas configurações de cartão microSD e sistema de arquivos, e a instabilidade da conexão poderia ser compensada pela agregação preliminar de dados, sessões curtas de envio, tempo limite, etc. Mas os problemas que foram revelados são uma ocasião para refletir se o caminho certo foi escolhido. A necessidade de uma conexão permanente com o servidor põe fim à coleta de dados do evento, quando o dispositivo é pendurado em uma bateria externa e jogado em uma mochila, cujo proprietário vai para um evento em massa, onde, é claro, você não pode esperar estabilidade da conexão.

Consequentemente, o próximo passo foi abandonar a parte do servidor e localizar o data warehouse diretamente no dispositivo. Além disso, para evitar experimentos longos e muito tristes com cartões SD, foi decidido usar modelos de placa de ensaio com chips flash na próxima iteração.

Naquele momento, lembrei que em minha coleção havia uma maravilhosa placa Carambola 2 dos camaradas lituanos 8Devices . E se você for ao site deles, poderá encontrar um dispositivo ainda mais compacto no mesmo chip chamado Centipede. Experiências anteriores com essa classe de dispositivos mostraram que Erlang se encaixa completamente nos 16 MB de memória flash alocados (e resta um pouco para o aplicativo). O único ponto negativo (que é um pouco mais) é o MIPS de baixa potência e a necessidade de compilação cruzada, o que torna a construção de um aplicativo Erlang um pouco mais trivial. Mas já era uma rota bem conhecida, então pedi duas centopéias e até agora portuei a versão existente que funciona com o servidor para Carambol.



Quando os componentes chegaram, uma nova fase começou. O chip AR9331 foi suportado com sucesso pelo aircrack-ng, os dados podem ser retirados da interface Ethernet, as últimas versões do OpenWRT e ERTS foram coletadas e testadas com sucesso. O aplicativo foi reescrito - parte do código foi movido para o código do dispositivo, os dados foram acumulados em um processo separado e periodicamente despejados em um arquivo na forma de um termo Erlang serializado. Para isso foi desenhada a interface baseada na web mais simples que recebe dados via websocket. As portas para inotify e erlexec são compiladas com segurança com o OpenWRT.

Apenas uma coisa confusa - 300 kilobytes permaneceram nos dados. Não é tão pequeno se você armazena apenas os endereços MAC dos dispositivos clientes, mas o airodump-ng fornece informações muito mais interessantes, incluindo endereços de pontos de acesso, seus ESSIDs e assim por diante, o que também seria bom lembrar. Apenas no caso de. Ok, vamos agir de acordo com as circunstâncias.

Nós coletamos, verificamos. Um problema é revelado em tempo real.

Openwrt, como todos sabemos, essa é uma versão Linux minimalista, projetada especificamente para dispositivos com memória limitada. Como resultado, jogou fora de lá que era possível jogar sem dor e simplificou o que poderia ser simplificado, incluindo o modo multiplayer. Essa. É uma prática comum quando o código começa na raiz e funciona com o máximo de privilégios, o que, é claro, facilita os problemas relacionados a grupos, usuários e controle de suas ações. Sim, sim, a letra S na abreviação IoT é responsável pela segurança. O problema é que a erlexec, que eu costumava executar e gerenciar airodump-ng, não pode executar operações sob a raiz - para isso, ele precisa de um usuário adicional, em nome do qual gerará os processos atribuídos a ele. E ao criar um usuário adicional com um nível de privilégio diferente ... corretamente, impede que o airodump alcance o dispositivo de rede. Desaparafusar essa restrição da biblioteca parecia um processo lento, então o erlexec foi substituído por ports - o mecanismo interno para iniciar processos de terceiros em Erlang. Um pouco, mas desagradável.

Assim, os dispositivos são recebidos, reflorestados e até funcionam em condições de estufa. Pegamos a bateria, jogamos a caixa na mochila, vamos ao shopping. No dia seguinte, olhamos para o resultado - um fiasco, um arquivo de dados de comprimento zero - ou não havia espaço suficiente ou uma distorção do poder não funcionou em um momento muito bom. Corrigimos o código para que o salvamento ocorra em dois estágios - primeiro um arquivo temporário foi criado, depois substituiu o atual.

No entanto, as mãos não conseguiram verificar a operacionalidade dessa opção - o próximo brinquedo - Onion Omega2 + no Mediatek 7688 foi exibido.Como seus irmãos, o designer do LinkIt Smart 7688 , havia muitas coisas, mas o mais importante é o dobro da memória flash, o que significa que você não pode mais se preocupar com a falta de espaço para armazenamento de dados. OK

Nós pedimos, espere. Mês. Dois. A paciência explode - escrevemos aos americanos sobre o assunto "onde estão os bens, Zin". Silêncio. Abra uma disputa no PayPal. Os americanos estão acordando. Eles dizem: "Oh, nosso sistema de aceitação de pedidos falhou, agora enviaremos tudo". Eles enviam, esperamos três semanas. Fuh, o dispositivo está disponível e até funciona.



Aqui precisamos fazer uma pequena digressão - apesar de eu ter várias placas LinkIt Smart a uma curta distância, não as considerei uma plataforma, porque no início da saga uma tentativa de usá-las como dispositivos de captura falhou. Em seguida, os drivers do chip foram fornecidos na forma de módulos montados para versões específicas do kernel e, aparentemente, isso se tornou a causa da inoperabilidade. Nas versões mais recentes do OpenWRT, o suporte nativo ao 7688 e um driver aberto apareceram; portanto, é uma ocasião para reconsiderar a abordagem desses dispositivos.

No entanto, era costume usar o WiFi diretamente no chip para a finalidade a que se destina - afinal, o dispositivo precisa de pelo menos alguma interface de controle e também em campo, pelo menos para entender se está funcionando ou não. Analisar os dados obtidos também seria útil.

Dessa forma, combinamos as abordagens anteriores - usamos a única interface USB exibida no MiniDoc como um apito de WiFi para escanear o espaço e o WiFi incorporado - para controlar o dispositivo como um ponto de acesso de baixa energia. Coletamos, verificamos, tudo funciona.

Mas o apetite vem com a comida. Para começar, o arquivo de dados na forma de serialização Erlang é um monte de maníacos reais, e uma gama um pouco maior de profissionais especialmente treinados precisa de algo mais simples. Mais uma vez, além de adicionar dados do airodump, também gostaria do tempo exato de medição e, de preferência, pelo menos algum tipo de referência à localização do dispositivo no espaço.

Incorporamos entre um apito de WiFi e um dispositivo de hub USB. As configurações (e elas dependem da posição do dispositivo no barramento no caso do OpenWRT) são florestadas, mas são pequenas insignificâncias. Corrigir. Retiramos o receptor USB-GPS dos escombros, felizmente, já testados pelo tempo e com o código escritoAnálise NMEA-0183 (o código, é claro, teve que ser corrigido de qualquer maneira). Verificamos - o dispositivo não é detectado com segurança pelo sistema, há claramente uma falta de drivers. Coletamos os drivers USB Serial e os soltamos no dispositivo - também em silêncio. Depois, lembramos que em sistemas grandes o apito do GPS foi detectado não como ttyUSBx, mas como ttyACMx, ou seja, Modem USB GSM. Bem, tudo bem, a segunda chamada para adicionar drivers, sucesso.

Pegamos o código, integramos ao aplicativo. Adicione sqlite3 ao aplicativo como armazenamento. Agora não será necessário verificar a disponibilidade do registro no estado e, em geral, o trabalho com dados é simplificado para um pequeno número de linhas. Juntando tudo, ensinamos ao adicionar dados para fazer leituras de GPS, corrigimos o código JS no rosto para exibir no caso de um conjunto de dados incompleto (isso pode acontecer quando o GPS ainda não capturou satélites e os dados da varredura aérea já estão chegando). Verificamos o trabalho - ele parece viver. Você pode declarar uma vitória provisória.



Por algumas semanas de trabalho ininterrupto - muitos dados nas estações no ar e nos clientes. Agora, estou com a tentação de oferecer esse dispositivo a especialistas em segurança da informação para controlar a transmissão nos territórios confiados e ao Estado para controlar o movimento dos telefones dos cidadãos. É uma piada, é claro, eles mesmos já sabem tudo.

Portanto, todas as provações descritas acima são apenas um projeto de estimação com complexidade muito baixa (ficou quase imediatamente claro o que fazer e como), a falta de desenvolvimento de hardware (olá, física) e o acesso a um produto um pouco mais ou menos completo. Não, é claro, não se pode descartar que o autor dessas linhas seja um amador denso, e gurus de verdade seguem esse caminho em uma noite entre o chá da tarde e um copo de conhaque, mas até agora a experiência mostrou apenas uma coisa: a TI é complicada e o otimismo é punido financeiramente. e motivacionalmente, e aqueles que dizem "tudo é simples" são gênios ou vigaristas, e o segundo é mais provável.

All Articles