¡Vuelve el silbido del teléfono de la vieja escuela!
Bueno, casi, pero este audio a continuación no está tan lejos.
El 13 de julio, descubrimos una vulnerabilidad interesante. Una página web en particular rastreaba la conversación de radio digital y mostraba un registro continuo de lo que escuchaba su estación. Esta es una herramienta útil si te gusta este tipo de cosas; después de todo, es bueno saber si sus llamadas están siendo escuchadas o si hay conversaciones en curso a las que quizás desee unirse. Esta herramienta capturó todo lo que estaba escuchando y lo insertó en la página web. Envía un mensaje y unos segundos después aparecerá allí. Si el mensaje incluyera HTML, bueno, eso también terminaría en la página web. Inyección de HTML clásico.
Entonces, ¿cómo funciona esto?
Para lanzar un ataque como este, realmente no necesita Internet en absoluto, solo necesita un cable largo. En nuestra serie Attacks Over the Air, publicada en febrero de 2023, analizamos los problemas inalámbricos que presenta un marcador de baloncesto con un controlador que funciona a 913 MHz. En esta publicación, nos moveremos muy, muy abajo en frecuencia, hacia la banda de radio de onda corta. Este ataque funciona a 7.078 y 14.078 MHz.
Hay muchas señales digitales interesantes aquí abajo, y JS8 es una de ellas. JS8 es una popular herramienta de chat de teclado a teclado para radioaficionados. Se destaca absolutamente al permitir conversaciones directas a largas distancias y a través de condiciones de enlace muy deficientes. JS8 se basa en FT8, una herramienta extremadamente popular para hacer contactos simples entre estaciones que apenas pueden escucharse. Día y noche, FT8 y JS8 están continuamente en uso.
Varias cosas extrañas suceden con las señales en la banda de onda corta. Es una frecuencia tan baja que a 100 millas por encima de nosotros, las capas E y F de la ionosfera de la Tierra comienzan a reflejar la señal de radio nuevamente hacia el suelo. Las señales rebotan entre la Tierra y el suelo varias veces, como si se tirara una piedra al agua. Nos permite escuchar estaciones de AM comerciales en el otro lado del planeta por la noche. Durante el día, este rebote también funciona en frecuencias más altas, lo que permite la comunicación a grandes distancias. El transmisor de mi patio trasero y la estación del sitio web están a 674 millas de distancia. Un rebote cubre esa distancia fácilmente.
Entonces, ¿cómo atacas un sitio web con una señal de onda corta?
Los mensajes JS8 se construyen en texto ASCII, todos en mayúsculas. La mayoría de los mensajes se envían a grupos amplios, como Skywarn, JS8Chess o, para hacer referencia a todos, simplemente ALLCALL. Después de esto, el mensaje puede ser casi cualquier cosa. Primero construimos la carga HTML en el editor. Debemos proporcionar legalmente nuestro indicativo de radioaficionado para la identificación (un paso que será ignorado por un atacante real) y al final nuestro mensaje final se ve así:
KJ7YLS: @TEST <DIV STYLE="WIDTH: 500PX;HEIGHT:100PX;COLOR:RED;">¡INYECCIÓN HTML!</DIV>
Ya estamos listos para transmitir. El software JS8 convierte este texto a binario, agrega la corrección de errores hacia adelante y modula el resultado usando modulación por desplazamiento de frecuencia gaussiana (GFSK). El producto final suena audiblemente como silbidos extraños. Si abrimos el sonido usando Audacity y abrimos un espectrograma, se ve así:
Mirando más de cerca, puede ver la modulación GFSK pasando lentamente de una frecuencia a otra. También se mantiene en cada frecuencia durante un período de tiempo específico. Hay ocho frecuencias diferentes en uso aquí y, por lo tanto, cada símbolo tiene ocho estados distintos. Como resultado, cada símbolo puede llevar tres bits a la vez. Esto se ilustra con algunas etiquetas:
Entonces podemos enviar el silbido al micrófono de un transmisor de radio. Como la mayoría de las señales militares y de aficionados, el audio se entrega utilizando modulación de banda lateral superior, que es una sección de un tipo de señal de transmisión AM. Los mensajes JS8 están estandarizados en varias frecuencias y nuestro objetivo escucha a 7,078 MHz y 14,078 MHz. Sintonizamos la radio en cualquiera de las frecuencias y enviamos el audio con 20 vatios de potencia a un cable de 16 AWG a unos 30 pies en el aire. La señal se irradia al aire, rebota en la ionosfera y su antena la recibe. Su software JS8 invierte el proceso y extrae el mensaje ASCII. Es en este punto que vemos el problema.
El sitio web (enlace retenido en este artículo por respeto a su autor) registra el tráfico JS8. Debajo del capó, funciona con JS8Net , una útil herramienta de Python que se comunica directamente con la API del software JS8. En el repositorio, el script monitor.py toma los mensajes JS8 y los coloca en el sitio web. Al momento de escribir, contiene las siguientes líneas de código en la línea 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'] es el mensaje ASCII JS8 extraído de Collector.py , que se extrae de la API del software JS8. Después de este paso, el texto en traffic[key] se coloca en la página usando Javascript. Estos pasos están bien. El problema ocurre en el cambio de contexto porque se supone que el tráfico de JS8, ya completamente procesado por el software JS8, está listo para funcionar y no afectará el contexto de la página web. Este es el comportamiento que luego podemos explotar.
De principio a fin, nuestro ataque se ve así:
Unos minutos más tarde, nuestro mensaje se registra en el sitio web...
El resultado final es principalmente cosmético. Esta es una página pública, por lo que no hay cookies de sesión para robar ni controles para falsificar. El XSS almacenado también es una posibilidad real, pero después de una mañana frustrante enviando muchas, muchas cargas útiles que consumen mucho tiempo (cada mensaje JS8 tarda varios minutos en enviarse) no pudimos hacer funcionar el Javascript que se ejecutaría en la página. Sospecho que el software JS8net bloqueó accidentalmente muchos de los caracteres y palabras clave y nuestras soluciones no parecieron activarse.
Sin embargo, Burp Suite fue útil aquí. La ionosfera cooperó ese día en particular y rebotó las señales bastante bien. Sabía por otras herramientas que las estaciones en otros países escuchaban el tráfico JS8 de los EE. UU. Así que mi siguiente carga útil fue
KJ7YLS: @ALLCALL <img src="http://727k2w1hfoamqewpm7rpiocu0l6cu2ir.oastify.com" alt="@HB DN13">
Esta URL apunta a un detector de DNS y HTTP ejecutado por la herramienta Collaborator de Burp Suite, que a menudo usamos durante las pruebas de penetración para encontrar fugas de información fuera de banda. Esto no fue diferente. En unos minutos, el servidor colaborador registró el tráfico DNS y HTTP de los usuarios que visitaban la página en Chile. También vi la página para inspeccionar la inyección y también me registré.
Esto era lo más lejos que quería llegar éticamente con la inyección. Informé el problema al propietario del sitio web, Jeff, con sugerencias para solucionarlo. Me respondió al día siguiente y me dijo:
Yo mismo trabajo en seguridad (hago investigación y desarrollo para una empresa de seguridad de redes en el Área de la Bahía), pero debo admitir que enviar JS por radio para piratear un sitio web estaba totalmente fuera de mi radar.
Mientras esperaba que el parche se pusiera en marcha, reflexioné sobre algunas líneas del 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.
Honestamente, esta es una excelente advertencia en general, especialmente para proyectos que están en progreso y no han sido probados a fondo. Las vulnerabilidades en este punto son un "desconocido desconocido", pero el autor estaba pensando principalmente en los oyentes expuestos y las API en su software. Sin embargo, explotamos un tipo de problema ligeramente diferente. El README advierte que el servicio debe ejecutarse dentro de una LAN y esto, de hecho, protegería a otros de las inyecciones de HTML y la contaminación de la página web. Sin embargo, una carga útil con cargas útiles de Colaborador también filtraría la dirección IP pública de cualquier persona que vea la página dentro de su LAN privada, por lo que es un poco más difícil de abordar.
En definitiva, se trata de una señal de radio que ataca una página web en Internet. Un atacante no necesita perder el tiempo con VPN, Tor o botnets para tratar de ocultar su identidad en Internet. JS8 es tan eficaz en la extracción de mensajes -24dB por debajo del ruido de fondo (el silbido, literalmente, no se puede oír de forma audible a este nivel) que se necesita muy poca energía para llegar a las estaciones distantes. Un vatio de potencia de transmisión, en buenas condiciones ionosféricas, puede viajar de costa a costa a través de los EE. UU. Un atacante podría estar en cualquier parte del mundo. Un mensaje de ráfaga es todo lo que se necesita, por lo que encontrar la dirección también sería difícil. Creo que eso es lo más cercano a lo imposible de rastrear que puedes conseguir con algo como esto.
Cronología: