O antigo apito do telefone está de volta!
Bem, quase, mas este áudio abaixo não está tão longe assim.
Em 13 de julho, descobrimos uma vulnerabilidade interessante. Uma determinada página da web estava rastreando conversas de rádio digital e exibia um registro contínuo do que sua estação estava ouvindo. Esta é uma ferramenta útil se você gosta desse tipo de coisa; afinal, é ótimo saber se suas chamadas estão sendo ouvidas ou se há conversas em andamento nas quais você gostaria de participar. Esta ferramenta capturou tudo o que estava ouvindo e inseriu na página da web. Manda uma mensagem e alguns segundos depois ela aparece lá. Se a mensagem incluísse HTML, isso acabaria na página da web também. Injeção de HTML clássico.
Então, como isso funciona?
Para realizar um ataque como este, você não precisa de internet - você só precisa de um longo pedaço de fio. Em nossa série Attacks Over the Air, publicada em fevereiro de 2023, discutimos os problemas sem fio apresentados por um placar de basquete com um controlador que opera a 913 MHz. Neste post, vamos nos mover muito, muito para baixo na frequência, para baixo na banda de rádio de ondas curtas. Este ataque funciona em 7,078 e 14,078 MHz.
Existem muitos sinais digitais interessantes aqui, e o JS8 é um deles. JS8 é uma popular ferramenta de bate-papo de teclado para teclado para rádio amador. É absolutamente excelente em permitir conversas diretas em longas distâncias e em condições de link muito ruins. O próprio JS8 é baseado no FT8, uma ferramenta extremamente popular para fazer contatos simples entre estações que mal conseguem se ouvir. Noite e dia, FT8 e JS8 estão continuamente em uso.
Várias coisas estranhas acontecem com os sinais na banda de ondas curtas. É uma frequência tão baixa que a 160 quilômetros acima de nós, as camadas E e F da ionosfera da Terra começam a refletir o sinal de rádio de volta ao solo. Os sinais saltam entre a Terra e o solo várias vezes, como pular uma pedra da água. Ele nos permite ouvir estações AM comerciais do outro lado do planeta à noite. Durante o dia, esse salto também funciona em frequências mais altas, permitindo a comunicação em grandes distâncias. Meu transmissor de quintal e a estação do site estão a 674 milhas de distância. Um salto cobre essa distância facilmente.
Então, como você ataca um site com um sinal de ondas curtas?
As mensagens JS8 são construídas em texto ASCII, todos em letras maiúsculas. A maioria das mensagens é enviada para grupos amplos, como Skywarn, JS8Chess ou, para fazer referência a todos, simplesmente ALLCALL. Depois disso, a mensagem pode ser qualquer coisa. Primeiro, construímos a carga HTML no editor. Devemos fornecer legalmente nosso indicativo de rádio amador para identificação (uma etapa que será ignorada por um invasor real) e, no final, nossa mensagem final ficará assim:
KJ7YLS: @TEST <DIV STYLE="WIDTH: 500PX;HEIGHT:100PX;COLOR:RED;">INJEÇÃO HTML!</DIV>
Agora estamos prontos para transmitir. O software JS8 converte este texto em binário, adiciona correção de erro direta e modula o resultado usando Gaussian Frequency Shift Keying (GFSK). O produto final soa audivelmente como estranhos ruídos de assobio. Se abrirmos o som usando o Audacity, e abrirmos um espectrograma, fica assim:
Olhando mais de perto, você pode ver a modulação GFSK passando lentamente de uma frequência para outra. Ele também se mantém em cada frequência por um período de tempo específico. Existem oito frequências diferentes em uso aqui e, portanto, cada símbolo tem oito estados distintos. Como resultado, cada símbolo pode carregar três bits por vez. Isso é ilustrado com alguns rótulos:
Podemos então enviar o ruído de assobio para o microfone de um transmissor de rádio. Como a maioria dos sinais amadores e militares, o áudio é fornecido usando modulação de banda lateral superior, que é uma seção de um tipo de sinal de transmissão AM. As mensagens JS8 são padronizadas em várias frequências, e nosso alvo escuta em 7,078 MHz e 14,078 MHz. Sintonizamos o rádio em qualquer frequência e enviamos o áudio usando 20 watts de potência em um fio 16-AWG a cerca de 30 pés no ar. O sinal irradia para o ar, ricocheteia na ionosfera e sua antena o recebe. Seu software JS8 reverte o processo e extrai a mensagem ASCII. É neste ponto que vemos o problema.
O site (link retido neste artigo em respeito ao seu autor) registra o tráfego JS8. Sob o capô, ele é alimentado por JS8Net , uma ferramenta Python útil que se comunica diretamente com a API do software JS8. No repositório, o script monitor.py pega as mensagens JS8 e as coloca no site. No momento da redação, ele contém as seguintes linhas de código na linha 859:
# Text j['text']=j['stuff']['params']['TEXT'] key=str(j['stuff']['time']) j['id']=':'.join([fmcall,tocall,key,str(j['freq'])]) traffic[key]=json.dumps(j)
j['stuff']['params']['TEXT'] é a mensagem ASCII JS8 extraída de Collector.py , que extrai da API do software JS8. Após esta etapa, o texto em traffic[key] é colocado na página usando Javascript. Essas etapas são boas. O problema ocorre na mudança de contexto porque há uma suposição de que o tráfego JS8, já totalmente processado pelo software JS8, está pronto para ser executado e não afetará o contexto da página da web. Este é o comportamento que podemos então explorar.
Do começo ao fim, nosso ataque fica assim:
Alguns minutos depois, nossa mensagem está registrada no site...
O resultado final é principalmente cosmético. Esta é uma página pública, então não há cookies de sessão para roubar ou controles para falsificar. O XSS armazenado também é uma possibilidade real, mas depois de uma manhã frustrante enviando muitos, muitos payloads demorados (cada mensagem JS8 leva vários minutos para enviar), não conseguimos trabalhar com o Javascript que seria executado na página. Eu suspeito que o software JS8net bloqueou acidentalmente muitos dos caracteres e palavras-chave e nossas soluções alternativas não pareceram disparar.
No entanto, o Burp Suite foi útil aqui. A ionosfera estava cooperativa naquele dia em particular e transmitindo sinais muito bem. Eu sabia por outras ferramentas que as estações em outros países estavam ouvindo o tráfego JS8 dos EUA. Então, minha próxima carga foi
KJ7YLS: @ALLCALL <img src="http://727k2w1hfoamqewpm7rpiocu0l6cu2ir.oastify.com" alt="@HB DN13">
Essa URL aponta para um ouvinte DNS e HTTP executado pela ferramenta Burp Suite's Collaborator, que costumamos usar durante testes de penetração para encontrar vazamentos de informações fora da banda. Isso não foi diferente. Em poucos minutos, o tráfego DNS e HTTP foi registrado pelo Collaborator Server dos usuários que visitaram a página no Chile. Também visualizei a página para inspecionar a injeção e também fui logado.
Isso era o mais longe que eu queria ir eticamente com a injeção. Relatei o problema ao proprietário do site, Jeff, com sugestões de correção. Ele voltou para mim no dia seguinte, dizendo:
Eu mesmo trabalho com segurança (faço P&D para uma empresa de segurança de rede na Bay Area), mas devo admitir que enviar JS via rádio para hackear um site estava totalmente fora do meu radar.
Enquanto esperava que o patch fosse lançado, refleti sobre algumas linhas do JS8Net README:
It's important to note that this part of the software is still very much in the development stage, and may have critical vulnerabilities that make exposing the exposed services to the open Internet a Very Bad Idea. While it certainly will work, it's intended for protected, internal LAN use at this time.
Sinceramente esse é um excelente alerta em geral, principalmente para projetos que estão em andamento e não foram exaustivamente testados. As vulnerabilidades neste ponto são um “desconhecido desconhecido”, mas o autor estava pensando principalmente nos ouvintes e APIs expostos em seu software. No entanto, exploramos um tipo de problema ligeiramente diferente. O README avisa que o serviço deve ser executado dentro de uma LAN e isso realmente protegeria outras pessoas contra injeções de HTML e contaminação da página da web. No entanto, uma carga útil com cargas úteis do Colaborador também vazaria o endereço IP público de qualquer pessoa que visualizasse a página em sua LAN privada, o que é um pouco mais difícil de resolver.
Resumindo, trata-se de um sinal de rádio atacando uma página da Internet. Um invasor não precisa brincar com VPNs, Tor ou botnets para tentar ocultar sua identidade na Internet. JS8 é tão eficaz na extração de mensagens -24dB abaixo do piso de ruído (o assobio literalmente não pode ser ouvido audivelmente neste nível) que muito pouca energia é necessária para alcançar estações distantes. Um watt de potência de transmissão, em boas condições ionosféricas, pode ir de costa a costa nos EUA. Um invasor pode estar em qualquer lugar do mundo. Uma mensagem de rajada é tudo o que é necessário, portanto, encontrar a direção também seria difícil. Acho que é o mais próximo de não rastreável que se pode chegar com algo assim.
Linha do tempo: