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.
'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.
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.
Figura 2: GitHub de OnTheFly
Figura 3: Libro de Ethical Hacking 2ª Edición de Pablo González en 0xWord |
- 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.
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.
Figura 4: Libro de Docker:SecDevOps en 0xWord de |
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 1883listener 9001protocol 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’.
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.
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.
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.
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).
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.
Figura 8: Ataques en redes de datos IPv4&IPv6 (4ª Edición) de
JL. Rambla, ampliado y revisado por Pablo González y Chema Alonso
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.
Por último, realizamos la prueba de funcionamiento. Nos dirigimos a la máquina víctima y realizamos la publicación de un nuevo color.
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.
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.
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.
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.
Figura 14: Pentesting con Kali Silver Edition |
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.
Happy hacking!
Autor: Álvaro Núñez-Romero, investigador en el equipo de Ideas Locas. Autor del libro "Arduino para Hackers (& Makers): PoCs and Hacks Just for Fun" y del VBOOK de "Arduino para Hackers (& Makers): PoCs and Hacks Just for Fun"
No hay comentarios:
Publicar un comentario