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 🎥
-
¿Trabajas en una empresa de ciberseguridad? ¿Quieres ver tu empresa anunciada en HackTricks? ¿o quieres tener acceso a la última versión de PEASS o descargar HackTricks en PDF? ¡Consulta los PLANES DE SUSCRIPCIÓN!
-
Descubre La familia PEASS, nuestra colección de exclusivos NFTs
-
Consigue el swag oficial de PEASS y HackTricks
-
Únete al 💬 grupo de Discord o al grupo de telegram o sígueme en Twitter 🐦@carlospolopm.
-
Comparte tus trucos de hacking enviando PR al repositorio de hacktricks y al repositorio de hacktricks-cloud.