Le sifflement téléphonique à l'ancienne est de retour !
Eh bien, presque, mais cet audio ci-dessous n'est pas si loin.
Le 13 juillet, nous avons découvert une vulnérabilité intéressante. Une page Web particulière suivait les conversations radio numériques et affichait un journal de ce que sa station entendait. C'est un outil pratique si vous aimez ce genre de choses; après tout, il est bon de savoir si vos appels sont entendus ou s'il y a des conversations en cours auxquelles vous pourriez vouloir participer. Cet outil a capturé tout ce qu'il entendait et l'a inséré dans la page Web. Envoyez un message et quelques secondes plus tard, il apparaîtrait là-bas. Si le message incluait du HTML, cela se retrouverait également sur la page Web. Injection HTML classique.
Alors, comment ça marche?
Pour lancer une attaque comme celle-ci, vous n'avez pas du tout besoin d'Internet, vous avez juste besoin d'un long morceau de fil. Dans notre série Attacks Over the Air, publiée en février 2023, nous avons discuté des problèmes sans fil présentés par un tableau de bord de basket-ball avec un contrôleur qui fonctionne à 913 MHz. Dans cet article, nous allons descendre très bas en fréquence, jusque dans la bande radio à ondes courtes. Cette attaque fonctionne à 7,078 et 14,078 MHz.
Il existe de nombreux signaux numériques intéressants ici, et JS8 en fait partie. JS8 est un outil de conversation clavier à clavier populaire pour la radio amateur. Il excelle absolument à permettre des conversations directes sur de longues distances et dans de très mauvaises conditions de liaison. JS8 est lui-même basé sur FT8, un outil extrêmement populaire pour établir des contacts simples entre des stations qui peuvent à peine s'entendre. Nuit et jour, FT8 et JS8 sont continuellement utilisés.
Plusieurs choses étranges arrivent aux signaux dans la bande des ondes courtes. C'est une fréquence si basse qu'à 100 milles au-dessus de nous, les couches E et F de l'ionosphère terrestre commencent à réfléchir à nouveau le signal radio vers le sol. Les signaux rebondissent plusieurs fois entre la Terre et le sol, comme sauter une pierre hors de l'eau. Il nous permet d'entendre les stations AM commerciales de l'autre côté de la planète la nuit. Pendant la journée, ce rebond fonctionne également à des fréquences plus élevées, permettant la communication sur de grandes distances. Mon émetteur de jardin et la station du site Web sont distants de 674 milles. Un rebond couvre facilement cette distance.
Alors, comment attaquer un site Web avec un signal à ondes courtes ?
Les messages JS8 sont construits en texte ASCII, tous en majuscules. La plupart des messages sont envoyés à de larges groupes, tels que Skywarn, JS8Chess ou, pour référencer tout le monde, simplement ALLCALL. Après cela, le message peut être à peu près n'importe quoi. Nous construisons d'abord la charge utile HTML dans l'éditeur. Nous devons légalement fournir notre indicatif radioamateur pour identification (une étape qui sera ignorée par un véritable attaquant) et au final notre message final ressemble à ceci :
KJ7YLS : @TEST <DIV STYLE="LARGEUR : 500PX ;HAUTEUR :100PX;COULEUR :ROUGE ;">INJECTION HTML !</DIV>
Nous sommes maintenant prêts à transmettre. Le logiciel JS8 convertit ce texte en binaire, ajoute une correction d'erreur directe et module le résultat à l'aide de la modulation par déplacement de fréquence gaussienne (GFSK). Le produit final ressemble de manière audible à d'étranges bruits de sifflement. Si nous ouvrons le son en utilisant Audacity, et ouvrons un spectrogramme, cela ressemble à ceci :
En regardant de plus près, vous pouvez voir la modulation GFSK passer lentement d'une fréquence à une autre. Il tient également à chaque fréquence pendant une durée spécifique. Il y a huit fréquences différentes utilisées ici et chaque symbole a donc huit états distincts. En conséquence, chaque symbole peut transporter trois bits à la fois. Ceci est illustré par quelques étiquettes :
On peut alors envoyer le bruit de sifflement dans le microphone d'un émetteur radio. Comme la plupart des signaux amateurs et militaires, l'audio est délivré à l'aide d'une modulation de bande latérale supérieure, qui est une section d'un type de signal de diffusion AM. Les messages JS8 sont normalisés à plusieurs fréquences, et notre cible écoute à 7,078 MHz et 14,078 MHz. Nous réglons la radio sur l'une ou l'autre fréquence et envoyons l'audio en utilisant 20 watts de puissance dans un fil de 16 AWG à environ 30 pieds dans les airs. Le signal rayonne dans l'air, rebondit sur l'ionosphère et leur antenne le reçoit. Leur logiciel JS8 inverse le processus et extrait le message ASCII. C'est à ce moment-là que l'on voit le problème.
Le site Web (lien retenu dans cet article par respect pour son auteur) enregistre le trafic JS8. Sous le capot, il est alimenté par JS8Net , un outil Python utile qui communique directement avec l'API du logiciel JS8. Dans le référentiel, le script monitor.py récupère les messages JS8 et les place sur le site Web. Au moment de la rédaction, il contient les lignes de code suivantes à la ligne 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'] est le message ASCII JS8 extrait de collector.py , qui extrait de l'API du logiciel JS8. Après cette étape, le texte dans traffic[key] est placé sur la page à l'aide de Javascript. Ces étapes sont bonnes. Le problème se produit lors du changement de contexte, car on suppose que le trafic JS8, déjà entièrement traité par le logiciel JS8, est prêt à fonctionner et n'affectera pas le contexte de la page Web. C'est le comportement que nous pouvons alors exploiter.
Du début à la fin, notre attaque ressemble à ceci :
Quelques minutes plus tard, notre message est enregistré sur le site...
Le résultat final est essentiellement cosmétique. Il s'agit d'une page publique, il n'y a donc pas de cookies de session à voler ou de contrôles à usurper. Le XSS stocké est également une possibilité réelle, mais après une matinée frustrante à envoyer de très nombreuses charges utiles chronophages (chaque message JS8 prend plusieurs minutes à envoyer), nous n'avons pas pu faire fonctionner Javascript qui s'exécuterait sur la page. Je soupçonne que le logiciel JS8net a accidentellement bloqué de nombreux caractères et mots clés et que nos solutions de contournement n'ont pas semblé se déclencher.
Néanmoins, Burp Suite s'est avéré utile ici. L'ionosphère était coopérative ce jour-là et rebondissait assez bien les signaux. Je savais par d'autres outils que les stations d'autres pays entendaient le trafic JS8 en provenance des États-Unis. Donc, ma prochaine charge utile était
KJ7YLS : @ALLCALL <img src="http://727k2w1hfoamqewpm7rpiocu0l6cu2ir.oastify.com" alt="@HB DN13">
Cette URL pointe vers un écouteur DNS et HTTP exécuté par l'outil Collaborator de Burp Suite, que nous utilisons souvent lors des tests d'intrusion pour détecter les fuites d'informations hors bande. Ce n'était pas différent. En quelques minutes, le trafic DNS et HTTP a été enregistré par le serveur collaborateur des utilisateurs visitant la page au Chili. J'ai également consulté la page pour inspecter l'injection et j'ai également été connecté.
C'était à peu près aussi loin que je voulais aller éthiquement avec l'injection. J'ai signalé le problème au propriétaire du site Web, Jeff, avec des suggestions de correction. Il m'a rappelé le lendemain en me disant :
Je travaille moi-même dans la sécurité (je fais de la R&D pour une société de sécurité réseau dans la Bay Area), mais je dois admettre que soumettre JS par radio pour pirater un site Web était totalement hors de mon radar.
Pendant que j'attendais que le patch soit mis en ligne, j'ai réfléchi à quelques lignes du 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.
Honnêtement, c'est un excellent avertissement en général, en particulier pour les projets en cours et qui n'ont pas été testés à fond. Les vulnérabilités à ce stade sont une "inconnue inconnue", mais l'auteur pensait principalement aux écouteurs et aux API exposés dans son logiciel. Cependant, nous avons exploité un type de problème légèrement différent. Le README avertit que le service doit être exécuté à l'intérieur d'un réseau local et cela protégerait en effet les autres contre les injections HTML et la profanation de la page Web. Cependant, une charge utile avec des charges utiles Collaborator divulguerait également l'adresse IP publique de toute personne consultant la page dans son réseau local privé, ce qui est un peu plus difficile à résoudre.
En bref, il s'agit d'un signal radio attaquant une page Web sur Internet. Un attaquant n'a pas besoin de s'amuser avec des VPN, Tor ou des botnets pour essayer de cacher son identité sur Internet. Le JS8 est si efficace pour extraire les messages -24dB en dessous du bruit de fond (le sifflement ne peut littéralement pas être entendu de manière audible à ce niveau) que très peu de puissance est nécessaire pour atteindre les stations éloignées. Un watt de puissance de transmission, dans de bonnes conditions ionosphériques, peut traverser les États-Unis d'un océan à l'autre. Un attaquant pourrait être n'importe où dans le monde. Un message en rafale est tout ce qui est nécessaire, donc la radiogoniométrie serait également difficile. Je pense que c'est à peu près aussi introuvable que possible avec quelque chose comme ça.
Chronologie: