Walkie Hackie
4 minutos de lectura
Se nos proporcionan cuatro capturas de señales de radiofrecuencia (desde 1.complex
hasta 4.complex
) y un sitio web para probar códigos:
Además, esta es la descripción del reto:
Our agents got caught during a mission and found that the guards are using old walkie-talkies for their communication. The field team captured their transmissions. Can you interrupt their communication to help our agents escape from the guards?
Análisis de radiofrecuencia
Aunque hay una pista en el código HTML del sitio web que apunta a Universal Radio Hacker, prefiero usar inspectrum
.
Si abrimos 1.complex
en inspectrum
veremos esta señal:
Podemos identificar que está modulada en 2FSK (Frequency Shift Keying), ya que hay dos líneas de frecuencia. Además, no parece haber ningún tipo de codificación de canal (por ejemplo, Manchester). Al principio, hay una secuencia de sincronización, utilizada para sincronizar el reloj del receptor.
Con inspectrum
podemos agregar gráficos y establecer cursores. Para obtener el siguiente resultado, debemos usar “Add derived plot > Add amplitude plot” y luego “Add derived plot > Add threshold plot”. Después de eso, podemos comenzar a configurar los cursores para que coincidan con cada pulso de potencia de la señal. Después de eso, necesitamos aumentar los deslizadores “Power max” y “Power min” hasta que veamos pulsos claros en la trama de umbral. Después de ajustar los parámetros, obtendremos esto:
En este punto, podemos usar “Extraxt symbols” para que los pulsos de señal sean codificados como bits. Una vez que tenemos esto, podemos transformar bits a formato hexadecimal con un one-liner en Python / Bash:
$ function decode() { python3 -c "print(hex(int(''.join('$1'.split(', ')), 2)))" }
$ decode '1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, '
0xaaaaaaaa73214693a2ff84
Si repitemos el proceso para el resto de las muestras, obtenemos estos resultados:
$ decode '1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, '
0xaaaaaaaa73214693a1ff14
$ decode '1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, '
0xaaaaaaaa73214693b2ff24
$ decode '1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, '
0xaaaaaaaa73214693b1ff57
Ingeniería inversa
Como se puede ver, las señales están compuestas por tres partes:
aaaaaaaa
73214693
a2ff84
/a1ff14
/b2ff24
/b1ff57
Los tamaños coinciden con los ejemplos de los cuadros de texto del sitio web. Parece que solo necesitamos cambiar la tercera parte para obtener la flag, ya que los dos primeros trozos son siempre iguales.
Además, parece que el byte ff
de en medio de la tercera parte es fijo, por lo que solo necesitamos aplicar fuerza bruta en dos bytes (65536 posibilidades).
Encontrando la combinación correcta
Usemos FFUF
para aplicar la fuerza bruta. Pero primero, creemos nuestro diccionario de valores hexadecimales:
$ for i in {0..9} {a..f}; do for j in {0..9} {a..f}; do echo $i$j; done; done > hex
Ahora podemos usar ffuf
(hay más de una combinación válida):
$ ffuf -w hex:XX -w hex:YY -u http://144.126.206.23:30423/transmit -d 'pa=aaaaaaaa&sw=73214693&pl=XXffYY' -H 'Content-Type: application/x-www-form-urlencoded' -fs 2831
[Status: 200, Size: 2896, Words: 420, Lines: 134, Duration: 69ms]
* XX: 00
* YY: f9
[Status: 200, Size: 2896, Words: 420, Lines: 134, Duration: 72ms]
* XX: 01
* YY: f9
...
Flag
Entonces podemos usar uno de estos códigos para obtener la flag:
$ curl 144.126.206.23:30423/transmit -d 'pa=aaaaaaaa&sw=73214693&pl=00fff9' -s | grep -oE 'HTB{.*?}'
HTB{B4s1c_r4d10_fund4s}