sábado, abril 13, 2024

On-The-Fly: Cómo hackear MQTT con Network Packet Manipulation en 1 minuto

La pasada MorterueloCON participé junto con Pablo González en las jornadas donde presentamos un nuevo módulo para nuestra herramienta 'on-the-fly' en el que habíamos estado trabajando días atrás.

Figura 1: On-The-Fly - Cómo hackear MQTT con Network Packet Manipulation en 1 minuto

'on-the-fly' es una proyecto del equipo de Ideas Locas que ofrece capacidades para realizar pruebas de pentesting en varios dominios (IoT, ICS & TI). Se trata de una herramienta innovadora al unir diferentes mundos que comparten un factor común: la red. Es Open Source, por lo que te animamos a participar activamente en el proyecto que puedes encontrar en su GitHub.


Si revisas el blog y has trabajado con la herramienta, habrás visto que hay un módulo para ‘on-the-fly’ para hacer Network Packet Manipulation, concretamente para manipular paquetes de MySQL al vuelo. En esta ocasión quisimos hacer lo mismo pero para manipular paquetes del protocolo MQTT, y así ampliar las capacidades que tienes para los proyectos de Ethical Hacking.

Figura 3: Libro de Ethical Hacking 2ª Edición
de Pablo González en 0xWord

Ahora hemos publicado este nuevo módulo y te explico como puedes ponerlo a prueba. El escenario es el siguiente:
  • Un broker MQTT que se encargue de hacer llegar los mensajes entre los diferentes clientes.
  • Dos clientes MQTT, uno que publicará el mensaje (que se manipulará en el aire) y otro cliente que esté suscrito al topic que recibirá el mensaje.
  • Una máquina con Kali Linux y herramienta ‘on-the-fly’ preparada.
  • El módulo de manipulación MQTT preparado y lanzado.
Debes saber que este tipo de módulos necesitan de otro módulo para que proporcione el tráfico, en este caso haciendo uso del módulo arp_spoof.

Montaje del broker

Para poner en marcha el broker de manera rápida puedes hacer uso de Docker con una imagen de mosquitto (puedes encontrarla en el Docker Hub):

$ docker run -it -p 1883:1883 -p 9001:9001 
-v mosquitto.conf:/mosquitto/config/mosquitto.conf eclipse-mosquitto

Debes tener en cuenta que tienes que tener un fichero de configuración. En el ejemplo, mosquitto.conf se encuentra en local y se montará sobre la ruta /mosquitto/config/mosquitto.conf del contenedor. En el repositorio de GitHub de mosquitto puedes encontrar un ejemplo de configuración, además de tener la documentación oficial en el sitio web de mosquitto donde se explica con detalle cada uno de los parámetros de configuración posibles.

Para este caso, vamos a habilitar el puerto de escucha 1883 (por defecto para conexiones sin cifrar y sin autenticar) y el puerto 9001 (este se usará para una conexión a través de Web Socket, sin cifrar y sin autenticar). Esto se resume en un archivo de configuración que contenga las siguientes lineas:

listener 1883
listener 9001
protocol websockets

Ahora podemos lanzar el contenedor y hacer una prueba de conexión con el broker. Para ello necesitaremos un cliente, por ejemplo MQTTX. MQTTX es un cliente gráfico MQTT, es Open Source bajo una licencia Apache 2.0, y es multiplataforma, por lo que podemos usarlo con los principales sistemas operativos.

Figura 5: Nueva conexión en MQTTX

Al abrirlo tendremos que configurar una nueva conexión, indicando un nombre con el que se guardará en el listado de conexiones, un ID de cliente (que se auto-genera directamente en el cliente), y la dirección y puerto del host. Como nota, para la realización de la prueba de manipulación de paquetes debemos trabajar con la versión 3.1.1 del protocolo MQTT, que se puede indicar en las opciones avanzadas.

Ahora podemos crear una nueva suscripción para estar pendientes de todos los mensajes que se mandan a dicho "topic". Para este ejemplo vamos a suponer que hay una bombilla a la que se le puede cambiar el color cuando se publica sobre el topic ‘bulb/color’.

Figura 6: Suscripción al topic ‘bulb/color’

Con la suscripción creada, vamos a mandar un mensaje con un color, por ejemplo, blue, suponiendo que el dispositivo que estamos ejemplificando espera recibir este mensaje para cambiar su color.

Figura 7: Publicación de mensaje en el topic ‘bulb/color’

Al mandar y recibir el mensaje en el mismo cliente lo vemos como si fuera una conversación: a la derecha los mensajes enviados y a la izquierda los mensajes que se reciben. En ambos casos aparece el topic donde se ha mandado/recibido.

JL. Rambla, ampliado y revisado por Pablo González y Chema Alonso

Como ves, hacer uso del protocolo MQTT para intercambiar mensajes entre dispositivos es algo muy sencillo. Únicamente se debe disponer de un broker y de uno o varios clientes para realizar el intercambio.

MQTT Packet Manipulation PoC

Ahora que ya sabemos como funciona el protocolo MQTT, vamos a hacer uso del nuevo módulo de 'on-the-fly' para manipular estos paquetes en el aire.

Figura 9: Esquema manipulación de paquetes MQTT

Para empezar necesitamos hacer que el tráfico de una máquina víctima pase a través de nosotros, por lo que comenzamos haciendo uso del módulo arp_spoof, o cualquiera de las técnicas que se explican en el libro de Ataques en redes de datos IPv4&IPv6 (4ª Edición).

load modules/spoof/arp_spoof

En el ejemplo, conocemos la dirección IP de la víctima y del su puerta de enlace - "gateway" -, por lo que lo configuramos con el uso del comando set y lo ejecutamos con run.

Figura 10: Ejecución del módulo arp_spoof en Kali Linux

Con el ARP Spoofing en ejecución, cargamos el módulo de manipulación MQTT:

load modules/manipulation/mqtt_manipulation

Para este módulo hay que configurar dos parámetros:
  • mqtt_topic_modify: este valor indica el topic que se quiere escuchar para manipular su mensaje.
  • msg_spoof: este valor representa el nuevo mensaje que se quiere asignar.
De esta manera, en el ejemplo se ha indicado que se quiere escuchar el topic bulb/color y vamos a reemplazar cualquier mensaje por lime, por lo que vamos a cambiar cualquier color a éste.

Figura 11: Ejecución del módulo mqtt_manipulation en Kali Linux 

Por último, realizamos la prueba de funcionamiento. Nos dirigimos a la máquina víctima y realizamos la publicación de un nuevo color.

Figura 12: Manipulación en tiempo real de los paquetes MQTT

Si todo ha ido bien podremos observar que, aunque el mensaje que ha salido del cliente es correcto, la recepción que llega a la suscripción es el modificado por 'on-the-fly', por lo que hemos conseguido manipular el tráfico MQTT en tiempo real. En el siguiente video puedes ver la demostración completa del ejemplo.

Figura 13: PoC de Network Manipulación MQTT con 'on-the-fly'

Como ves, este módulo de manipulación de paquetes MQTT hace muy sencillo poder jugar con este protocolo, y propone otro caso de uso para un entorno IoT donde 'on-the-fly' tiene ya varios módulos disponibles.


 Esperamos que os haya gustado este artículo, y esperamos que lo utilicéis y nos aportéis ideas de mejoras, o que ayudéis a mejorar nuestro 'on-the-fly' con nuevos módulos.

No hay comentarios:

Publicar un comentario