hacktricks/network-services-pentesting/1883-pentesting-mqtt-mosquitto.md
carlospolop 63bd9641c0 f
2023-06-05 20:33:24 +02:00

5.7 KiB

Información Básica

MQTT significa MQ Telemetry Transport. Es un protocolo de mensajería de publicación/suscripción, extremadamente simple y ligero, diseñado para dispositivos limitados y redes de baja velocidad de ancho de banda, alta latencia o poco confiables. Los principios de diseño son minimizar el ancho de banda de la red y los requisitos de recursos del dispositivo, al mismo tiempo que se intenta garantizar la confiabilidad y cierto grado de garantía de entrega. Estos principios también resultan ideales para el mundo emergente de "máquina a máquina" (M2M) o "Internet de las cosas" de dispositivos conectados, y para aplicaciones móviles donde el ancho de banda y la energía de la batería son limitados.

Puerto predeterminado: 1883

PORT     STATE SERVICE                 REASON
1883/tcp open  mosquitto version 1.4.8 syn-ack

Inspeccionando el tráfico

Los brokers MQTT envían un paquete CONNACK en respuesta a un paquete CONNECT. El código de retorno 0x00 indica que las credenciales son válidas y el código de retorno 0x05 indica que no lo son. Ejemplo de 0x05:

Brute-Force MQTT

Pentesting MQTT

La autenticación es totalmente opcional e incluso si se realiza la autenticación, el cifrado no se utiliza por defecto (las credenciales se envían en texto claro). Los ataques MITM aún pueden ser ejecutados para robar contraseñas.

Para conectarse a un servicio MQTT se puede utilizar: https://github.com/bapowell/python-mqtt-client-shell y suscribirse a todos los temas haciendo:

> connect (NOTICE that you need to indicate before this the params of the connection, by default 127.0.0.1:1883)
> subscribe "#" 1
> subscribe "$SYS/#"

También puedes utilizar https://github.com/akamai-threat-research/mqtt-pwn

apt-get install mosquitto mosquitto-clients
mosquitto_sub -t 'test/topic' -v #Subscriribe to 'test/topic'

O también puedes ejecutar este código para intentar conectarte a un servicio MQTT sin autenticación, suscribirte a todos los temas y escucharlos:

#This is a modified version of https://github.com/Warflop/IOT-MQTT-Exploit/blob/master/mqtt.py
import paho.mqtt.client as mqtt
import time
import os

HOST = "127.0.0.1"
PORT = 1883

def on_connect(client, userdata, flags, rc):
	client.subscribe('#', qos=1)
	client.subscribe('$SYS/#')

def on_message(client, userdata, message):
	print('Topic: %s | QOS: %s  | Message: %s' % (message.topic, message.qos, message.payload))

def main():
	client = mqtt.Client()
	client.on_connect = on_connect
	client.on_message = on_message
	client.connect(HOST, PORT)
	client.loop_start()
	#time.sleep(10)
	#client.loop_stop()

if __name__ == "__main__":
	main()

Más información

desde aquí: https://morphuslabs.com/hacking-the-iot-with-mqtt-8edaf0d07b9b

El patrón Publicar/Suscribir

El modelo publicar/suscribir está compuesto por:

  • Editor: publica un mensaje en uno (o muchos) tema(s) en el broker.
  • Suscriptor: se suscribe a uno (o muchos) tema(s) en el broker y recibe todos los mensajes enviados por el editor.
  • Broker: enruta todos los mensajes de los editores a los suscriptores.
  • Tema: consta de uno o más niveles que están separados por una barra diagonal (por ejemplo, /smartshouse/livingroom/temperature).

Formato del paquete

Cada paquete MQTT contiene una cabecera fija (Figura 02).Figura 02: Cabecera fija

El primer campo de la cabecera fija representa el tipo de paquete MQTT. Todos los tipos de paquetes se enumeran en la tabla 01.Tabla 01: Tipos de paquetes MQTT

Shodan

  • port:1883 MQTT
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥