Descifrado del tráfico del monitor de agua Flume mediante un relay MITM

Fuentes: Decrypting Flume Water Monitor Traffic

Un investigador de seguridad documenta cómo interceptar y descifrar las comunicaciones del monitor de consumo de agua Flume, un dispositivo doméstico que envía lecturas de caudal a la nube del fabricante. En una investigación previa había logrado extraer el firmware y la clave pública del puente (bridge), pero el método era destructivo: el dispositivo dejaba de comunicarse con el servidor. En esta segunda parte descubre que, en la práctica, el puente cifra y descifra todos los mensajes MQTT con una única clave simétrica estática de 32 bytes almacenada en la memoria flash, accesible mediante esptool a partir de la dirección 0x3f9010 sin necesidad de modificar el firmware. El cifrado emplea LibHydrogen en su modo secretbox, con el contexto ASCII "12345678" y el identificador de mensaje 0.

A partir de estos parámetros, el autor construyó flumewatch, un relay transparente (hombre en el medio) escrito en Node.js con el broker Aedes. El puente se conecta por TCP plano al puerto 1883 de mqtt.prod.flumetech.com, así que basta con redirigir el tráfico por DNS o NAT para que pase por el relay, que reenvía los payloads cifrados byte a byte y mantiene intacta la aplicación móvil. Para el descifrado en JavaScript compiló libhydrogen-wasm, una versión WebAssembly de LibHydrogen generada con Emscripten.

El artículo describe el flujo MQTT observado durante la conexión (identificación, registros de arranque, ajustes del servidor) y muestra los mensajes JSON con tipos, IDs de dispositivo y marcas de tiempo que permiten reconstruir el estado del sensor. El hallazgo clave es que la capa de cifrado, aunque usa una biblioteca criptográfica seria, depende de una clave estática legible del hardware, lo que permite a cualquier persona con acceso físico al puente monitorizar el consumo de agua en tiempo real sin alterar el dispositivo.