Mayday - Talent4Cyber2025

Reto basado en recuperar un sistema de archivos UBI sobre UBIFS, analizar logs y descifrar una señal de radiofrecuencia 2-FSK

Mayday - Talent4Cyber2025

Autor del reto: Desconocido

Dificultad: Media

Enunciado

1
2
3
4
5
6
7
8
9
10
11
12
13
Nuestro equipo de fuerzas especiales recuperó un vehículo aéreo no tripulado tras su 
intercepción en una posición hostil; al volcar la memoria flash NAND del firmware se 
obtuvo una imagen UBI que contiene un sistema de archivos UBIFS (UBI sobre NAND cruda). 

Este hallazgo confirma la presencia de artefactos en la plataforma: registros de vuelo, 
configuraciones, logs de sensores y posibles capturas.

La información contenida en esa imagen adquiere especial valor para la monitorización de 
capacidades y la evaluación de riesgos. Tu misión es someter la imagen UBI a un análisis 
forense controlado para identificar y validar los artefactos de mayor relevancia; 
los resultados serán entregados al mando. 

Tu información ayudará a la protección de personal y activos.

Archivos

  • drone_flash.bin: Contiene los datos de la imagen UBI.

Archivos utilizados en mi repositorio de Github.

Analizando el reto

Mediante el programa file, se descubre una imagen UBI que contiene un sistema de archivos UBIFS (UBI sobre NAND cruda)

1
2
3
4
┌──(kesero㉿kali)-[~]
└─$ file drone_flash.bin

    drone_flash.bin: UBI image, version 1

Para obtener el sistema de archivos de una imagen UBI, se utilizarán herramientas forenses para manipular la información dentro de sistemas UBIFS. En este caso, se utiliza ubi_reader para realizar el volcado del sistema de archivos.

1
2
┌──(kesero㉿kali)-[~]
└─$ pip install ubi_reader  
1
2
3
4
5
6
7
┌──(kesero㉿kali)-[~]
└─$ ubireader_extract_files drone_flash.bin

    Extracting files to: ubifs-root/1812447777/telemetry
    Extracting files to: ubifs-root/1812447777/missions
    Extracting files to: ubifs-root/1812447777/secure
    Extracting files to: ubifs-root/1812447777/cfg

El sistema de archivos extraído es el siguiente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|-- cfg
|   |-- device.conf
|   |-- flight.conf
|-- missions
|   |-- obj_1.png
|   |-- obj_3.png
|   |-- per.png
|   |-- Recon.pdf
|-- secure
|   |-- img_files
|   |   |-- 2025-09-13T13:18:20.png
|   |   |-- 2025-09-13T13:18:21.png
|   |   |-- (...)
|   |
|   |-- sender
|   |-- sender_file
|       |-- 2025-09-13T13:18:31.iq
|-- telemetry
    |-- telemetry.log

En el directorio cfg se encuentra la configuración principal del dron junto con los parámetros iniciales de vuelo.

En la carpeta missions se encuentra información clasificada sobre la misión a la que pertenece el dron capturado. En esta sección, se obtiene información relevante como el cometido principal de la misión, así como unas imágenes del objetivo.

ob_2

En dicha información clasificada, se menciona la necesidad de realizar pruebas exhaustivas en mantenimiento preventivo para evitar fallos técnicos.

En la carpeta telemetry se obtiene un archivo de log sobre los datos de telemetría de vuelo del dron.

Al analizar el archivo telemetry.log, se obtienen registros periódicos sobre la comunicación entre el dron y la base, junto con el envío de la información e imágenes tomadas en ese instante.

Además, se obtiene el fallo principal ocasionado por el mal funcionamiento de los servomotores, los cuales comienzan a fallar progresivamente junto a la comunicación con la base.

Una vez la comunicación con la base no resulta exitosa, el dron almacena tanto las imágenes capturadas, como la última señal sender de comunicación en la carpeta secure hasta que, finalmente, el dron deja de guardar registros de su telemetría por fallo crítico en su sistema interno.

Por último, en la carpeta secure se obtienen las últimas imágenes capturadas por el dron junto al binario sender, que codifica información en formato de señal, así como la última señal codificada.

1 2

El archivo sender codifica un mensaje de texto introducido en una señal digital modulada en 2-FSK (Frequency Shift Keying). Cada carácter se transforma en 8 bits, y cada bit se codifica como una onda sinusoidal a 100kHz para bit 0 y 110kHz para bit 1 con una frecuencia de muestreo de 1MHz.

Finalmente la señal resultante se almacena como pares de valores flotantes I y Q en un archivo con nombre basado en la fecha y hora actual.

Se decodifica la señal 2025-09-13T13:18:31.iq mediante análisis estático del binario sender con herramientas como ghidra, obteniendo el tipo de modulación y sus parámetros utilizados. Se revierte el código de codificación para extraer la información de la señal obtenida.

El siguiente código realiza la operación de decodificación:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import numpy as np

fs = 1_000_000
baud = 1000
samples_per_symbol = fs // baud

iq = np.fromfile("2025-09-13T13:18:31.iq", dtype=np.float32)
iq = iq[::2] + 1j*iq[1::2]

inst_phase = np.angle(iq[1:] * np.conj(iq[:-1]))
freq_inst = np.unwrap(inst_phase) * fs / (2*np.pi)

bits = []
for i in range(0, len(freq_inst), samples_per_symbol):
    f = np.mean(freq_inst[i:i+samples_per_symbol])
    bits.append(1 if f > 105e3 else 0)

bit_str = ''.join(map(str, bits))
msg = ''.join(chr(int(bit_str[i:i+8], 2)) for i in range(0, len(bit_str), 8))
print(msg)

Flag

t4c2025{H0ustOn_t3n3M0s_Un_Pr0bl3M4!!!}

Esta entrada está licenciada bajo CC BY 4.0 por el autor.