1883 - Pentesting MQTT (Mosquitto)
tip
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 馃挰 Discord group or the telegram group or follow us on Twitter 馃惁 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.
Informaci贸n B谩sica
MQ Telemetry Transport (MQTT) es conocido como un protocolo de mensajer铆a de publicaci贸n/suscripci贸n que se destaca por su extrema simplicidad y ligereza. Este protocolo est谩 espec铆ficamente dise帽ado para entornos donde los dispositivos tienen capacidades limitadas y operan sobre redes caracterizadas por un bajo ancho de banda, alta latencia o conexiones poco fiables. Los objetivos principales de MQTT incluyen minimizar el uso del ancho de banda de la red y reducir la demanda sobre los recursos del dispositivo. Adem谩s, busca mantener una comunicaci贸n fiable y proporcionar un cierto nivel de garant铆a de entrega. Estos objetivos hacen que MQTT sea excepcionalmente adecuado para el creciente campo de la comunicaci贸n m谩quina a m谩quina (M2M) y el Internet de las Cosas (IoT), donde es esencial conectar de manera eficiente una multitud de dispositivos. Adem谩s, MQTT es muy beneficioso para aplicaciones m贸viles, donde conservar el ancho de banda y la vida de la bater铆a es crucial.
Puerto por defecto: 1883
PORT STATE SERVICE REASON
1883/tcp open mosquitto version 1.4.8 syn-ack
Inspeccionando el tr谩fico
Cuando un paquete CONNECT es recibido por los brokers MQTT, se env铆a de vuelta un paquete CONNACK. Este paquete contiene un c贸digo de retorno que es crucial para entender el estado de la conexi贸n. Un c贸digo de retorno de 0x00 significa que las credenciales han sido aceptadas, lo que indica una conexi贸n exitosa. Por otro lado, un c贸digo de retorno de 0x05 se帽ala que las credenciales son inv谩lidas, impidiendo as铆 la conexi贸n.
Por ejemplo, si el broker rechaza la conexi贸n debido a credenciales inv谩lidas, el escenario se ver铆a algo as铆:
{
"returnCode": "0x05",
"description": "Connection Refused, not authorized"
}
Fuerza Bruta MQTT
Pentesting MQTT
La autenticaci贸n es totalmente opcional y, incluso si se est谩 realizando autenticaci贸n, la encriptaci贸n no se utiliza por defecto (las credenciales se env铆an en texto claro). Los ataques MITM a煤n se pueden ejecutar para robar contrase帽as.
Para conectarte a un servicio MQTT puedes usar: https://github.com/bapowell/python-mqtt-client-shell y suscribirte 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 usar:
apt-get install mosquitto mosquitto-clients
mosquitto_sub -t 'test/topic' -v #Subscribe to 'test/topic'
mosquitto_sub -h <host-ip> -t "#" -v #Subscribe to ALL topics.
O podr铆as 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
from here: https://morphuslabs.com/hacking-the-iot-with-mqtt-8edaf0d07b9b
El patr贸n Publicar/Suscribirse
El modelo de publicar/suscribirse se compone de:
- Publicador: publica un mensaje en uno (o varios) tema(s) en el broker.
- Suscriptor: se suscribe a uno (o varios) tema(s) en el broker y recibe todos los mensajes enviados por el publicador.
- Broker: enruta todos los mensajes de los publicadores a los suscriptores.
- Tema: consiste en uno o m谩s niveles que est谩n separados por una barra diagonal (e.g., /smartshouse/livingroom/temperature).
Formato de Paquete
Cada paquete MQTT contiene un encabezado fijo (Figura 02).Figura 02: Encabezado Fijo
Tipos de Paquetes
- CONNECT (1): Iniciado por el cliente para solicitar una conexi贸n al servidor.
- CONNACK (2): El reconocimiento del servidor de una conexi贸n exitosa.
- PUBLISH (3): Utilizado para enviar un mensaje del cliente al servidor o viceversa.
- PUBACK (4): Reconocimiento de un paquete PUBLISH.
- PUBREC (5): Parte de un protocolo de entrega de mensajes que asegura que el mensaje es recibido.
- PUBREL (6): Aseguramiento adicional en la entrega de mensajes, indicando una liberaci贸n de mensaje.
- PUBCOMP (7): Parte final del protocolo de entrega de mensajes, indicando finalizaci贸n.
- SUBSCRIBE (8): Solicitud de un cliente para escuchar mensajes de un tema.
- SUBACK (9): El reconocimiento del servidor de una solicitud de SUBSCRIBE.
- UNSUBSCRIBE (10): Solicitud de un cliente para dejar de recibir mensajes de un tema.
- UNSUBACK (11): La respuesta del servidor a una solicitud de UNSUBSCRIBE.
- PINGREQ (12): Un mensaje de latido enviado por el cliente.
- PINGRESP (13): Respuesta del servidor al mensaje de latido.
- DISCONNECT (14): Iniciado por el cliente para terminar la conexi贸n.
- Dos valores, 0 y 15, est谩n marcados como reservados y su uso est谩 prohibido.
Shodan
port:1883 MQTT
tip
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 馃挰 Discord group or the telegram group or follow us on Twitter 馃惁 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.