Categoría: prueba de concepto

a-radio: a web virtual reality radio power spectrum analyser

8/10/20

This is a humble experiment to inspire real engineers and graphical designers to do something professional and beautiful from this idea. This is a simple integration of another experiment («Radioprint», see Radio fingerprinting, and «rfside«) into a-frame webVR framework, made for a Windows server and to be used with any smartphone. Remember this is the gross result of a boring morning, so do not expect anything professional.

View of a-radio fast radio sweep between 88 and 130 MHz from a smartphone (cardboard)

Surrounded by radio spectrum

A-radio is the mix of rtl_power + heatmap.py + a-frame in an artistic way. To make it work, you will need:

  • Software Defined Radio device (using RTL-SDR v. 3) ready to be used with rtl_power
  • Python
  • Imagemagick
  • HTTP(s) server (I’m using Apache with XAMPP)
  • Rtl_power windows binaries and DLLs, a modified heatmap.py to avoid put legends on image, a-frame custom scene HTML file, a script .bat to make it all work together (download here)
  • Cardboard glasses + your smartphone (optional)
  • Dependencies related to heatmap.py script (see imports)
View from PC

How to use a-radio

  • Download and install Imagemagick for Windows. Download and install XAMPP. Start Apache service. Extract all .rar files to htdocs (i. ex. C:/XAMPP/htdocs/).
  • Start «script.bat» and wait about 20 seconds to get the first snapshot. Go to your web browser (in your PC, or in your smartphone if you are going to use the VR function) and navigate to your parent folder using HTTPS in the URL (i.ex. https://localhost). The script will continue getting new snapshots every 30 seconds, so if you refresh (F5) you will get new results on the VR.
  • Start exploring the radio snapshot in the VR scene, where you are surrounded by active frequencies.

Some comments

  • A-frame requires to be used over https to work properly with sensors. Is a lot of work for a test, so we just add https in the beginning of the URL and press «ok I understand the risks«. This bypass a-frame restrictions.
  • For a custom radio range, edit «script.bat» and give rtl_power the interval you want.
  • To-do: Having a lot of problems to make automatic refresh of spectrum image each X seconds. Tried a lot of javascript DOM, but having problems with cached images (tried the trick of adding random url parameters to make it appear different: not working).
  • To-do 2: Now I am working in openwebrx + aframe integration for real-time waterfalls.

Radio fingerprinting

Few days ago I heard about a guy that created a script for recognise spurious emissions from a list of known devices, and I wanted to do the same in a simpler way.

I do not own any downconverter for my RTL-SDR – most spurious emissions are located near to 0 MHz and my SDR device starts on 24 MHz – so I have created a very simple script using wide-range frequencies scan with rtl_power, then converted to image schema with heatmap.py, and compared with imagemagick in a probabilistic way to determine which profile is the most similar to database entries. I called it Radioprint.

Radioprint discovering nearby devices

Below you will find radioprint.sh sourcecode. Remember install all dependencies [imagemagick, rtl_power] and run the script in the same folder of heatmap.py. You must create an empty directory called «database» in the same folder in order to compare profiles before running the script.

The script reads from 24MHz to 921MHz. Maybe a narrower range would make the script more efficient, but also more innacurate. Feel free to modify it.

./RADIOPRINT.SH

rm log.html 1.png 2.png probe.csv r.txt; 
echo '<html><body bgcolor="#34495e"><font face="verdana" color="white"><h1>Radioprint</h1><br>' > log.html; 
while true; 
	do rtl_power -f 24M:921M:60k -g 50 -i 10 -e 10s probe.csv; 
	python heatmap.py probe.csv 1.png; convert 1.png -gravity Center -crop 100%x+0+26 2.png; 
	echo "<b>" >> log.html; 
	cd database; rm r.txt; 
		for line in `ls | xargs | tr " " "\n"`; 
		do convert -metric AE ../2.png $line -trim -compare -format "%[distortion]" info: >> r.txt; 
		echo -n ",$line" >> r.txt; echo " " >> r.txt; 
		done; 
	cat r.txt | sort | awk "NR==1" | cut -f2 -d"," | cut -f1 -d"." >> ../log.html; 
	cd ..; echo "</b> - " >> log.html; 
	content=$(base64 -w0 < "2.png"); 
	b64=$(echo "data:image/png;base64,$content"); 
	data=$(date +%d.%m.%y.%H.%M.%S); 
	hash=$(echo $content | base64 -d | md5sum | cut -f1 -d" "); 
	echo '<a>'$data' - '$hash':</a><br><img src="'$b64'" width=100% height=25 /><br>' >> log.html; 
done;

How it works

Run the script -without arguments- and let it work in the background. Minimize the console and open log.html with your favourite web browser in order to see real-time results – pressing F5 each 30 seconds. The script adds the scan results on this page each ~20-30 seconds.

Connect to your SDR device a small wire as antenna, about 7-8 centimeters, and let it work in a place far away from electronic devices [>1 meter]. Refresh webpage and wait until you see an appropiate spectrum representation of «normality» in «log.html», then right-click, save image as…, go to /database folder and save it [without spaces] as «normal.png». You’ve just created your first profile for nothing found.

Now put your mobile phone touching directly the small antenna. Wait for the correct profile image in «log.html», and save it in the same way we did for «normal» profile. Now save the file in /database as «smartphone.png«. Now we have two profiles: normal and smartphone.

Radioprint will start to compare distortion between saved images and the new real-time generated images. Start checking if the script detects if your smartphone is near, for example.

Update 1/10/19. RTL-SDR.com has just released a review of my script! It is a great privilege and I appreciate it very much.

rfside

rfside is a very simple bash script based on rtl_power and heatmap.py that gets info related to emission power in wide-band scan and shows it all in a gaze. The scripts perform a huge scan in just 5 minutes, from 24 MHz to 1.7 GHz [customizable] allowing us to identify active bands for a more detailed study on any SDR application. It aims to be the first step in radio signals identification.

Source code here.

EMIs en el iPhone X

Las interferencias de Van Eck son emisiones de canal lateral de dispositivos electrónicos. Desde los años ’60 se estudia este fenómeno descubierto por el científico homónimo, que fue realmente sonado porque descubrió que aparatos eléctricos tales como televisores o monitores de ordenador emiten ondas residuales que pueden ser reinterpretadas por un actor malicioso con objetivos de espionaje, incluso desde otro edificio cercano.

También desde los años ’60 se ha puesto un especial celo en realizar productos que cumplan con la especificación técnica Tempest, que pretende mediante diversas técnicas – la más habitual, un armazón de metal y mallas metálicas a modo de jaula de Faraday – impedir que los aparatos eléctricos emitan estas EMIs al espectro radioeléctrico.

No obstante, salvo honrosas excepciones, esta especificación se dedica a atenuar más que a evitar, por lo que sigue siendo posible leer estas interferencias pese a los esfuerzos de la NSA y la OTAN. Simplemente ahora hay que utilizar antenas especialmente resonantes a las interferencias y con mayor proximidad física.

Ejemplo de estas radiaciones las pude encontrar fortuitamente con un sintonizador RTLSDR, cuando me dí cuenta que si la pantalla del iPhone X se encendía se producía una emisión constante allá por los 216 MHz. Esta emisión desaparecía si volvía a bloquear el móvil.

En la imagen se puede observar el acto de pulsar dos veces el botón reposo, esto es: pantalla apagada – pantalla encendida – pantalla apagada.

La frecuencia en cuestión es 216.002.640 Hz. He investigado los posibles armónicos y esta es la frecuencia que se recibe con mayor ganancia: unos -20 dB a una distancia de 10 cms del RTLSDR sin antena.

Utilizando una antena especial para la captación de interferencias los resultados son mucho más interesantes, y más aún si utilizamos preamplificadores y filtros de GNURadio, por ejemplo.

Como adelanto, un script bash «oneline» que detecta cuándo se ha activado la pantalla un iPhone X cercano. No olvides tocar los parámetros hasta que sirva para tus condiciones.

rtl_power -f 216.001M:216.003M:1K -g 30 -i 1 -c 20% | while read line; do data=$(date +%d/%m/%y-%H:%M:%S); valor=$(echo $line | cut -f11 -d"," | cut -f2 -d"-" | cut -f1 -d"."); if [ "$valor" -lt "15" ]; then echo "[$data][216.002 MHz][-$valor dB] iPhone en uso detectado"; fi; done;

Ingeniería social en iOS para obtener códigos 2FA

En el experimento que hoy presento, introduciendo un número de teléfono del atacante, se generará un archivo PDF que contiene un mensaje falso de iOS pidiendo que se guarde el archivo en la aplicación nativa «Libros» de iOS. Cuando esto se hace y se vuelve a abrir el script, se ejecuta sin consentimiento un URI tel con códigos USSD que desvían las llamadas y SMS al teléfono atacante.

Una vez hecho esto, el atacante no tiene más que acudir a la sección «¿Ha olvidado su contraseña?» de cualquier servicio para recibir en su propio móvil un código de confirmación o un link para cambiar la clave de la víctima.

Descarga el script bash aquí.

NOTA: Si vas a probarlo en tu propio móvil, teclea posteriormente el USSD #002# para desactivar los desvíos.

NOTA 2: Es un simple ejercicio de programación. El uso que se le dé a este script es asunto de cada uno, y no asumo ningún tipo de responsabilidad.