hacktricks/network-services-pentesting/1883-pentesting-mqtt-mosquitto.md
2023-06-03 13:10:46 +00:00

5.9 KiB

Informations de base

MQTT signifie MQ Telemetry Transport. C'est un protocole de messagerie extrêmement simple et léger, de type publication/abonnement, conçu pour les appareils contraints et les réseaux à faible bande passante, à latence élevée ou peu fiables. Les principes de conception visent à minimiser la bande passante du réseau et les exigences en ressources des appareils tout en tentant également d'assurer la fiabilité et un certain degré d'assurance de la livraison. Ces principes se révèlent également idéaux pour le monde émergent de l'Internet des objets (IoT) ou de la communication entre machines (M2M) de dispositifs connectés, ainsi que pour les applications mobiles où la bande passante et la puissance de la batterie sont à un niveau premium.

Port par défaut : 1883

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

Inspection du trafic

Les courtiers MQTT envoient un paquet CONNACK en réponse à un paquet CONNECT. Le code de retour 0x00 indique que les informations d'identification sont valides et le code de retour 0x05 indique qu'elles ne le sont pas. Exemple de 0x05:

Brute-Force MQTT

Pentesting MQTT

L'authentification est totalement facultative et même si l'authentification est effectuée, le chiffrement n'est pas utilisé par défaut (les informations d'identification sont envoyées en clair). Des attaques MITM peuvent encore être exécutées pour voler des mots de passe.

Pour se connecter à un service MQTT, vous pouvez utiliser: https://github.com/bapowell/python-mqtt-client-shell et vous abonner à tous les sujets 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

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

Ou vous pouvez exécuter ce code pour essayer de vous connecter à un service MQTT sans authentification, vous abonner à tous les sujets 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/#')

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

Plus d'informations

à partir d'ici: https://morphuslabs.com/hacking-the-iot-with-mqtt-8edaf0d07b9b

Le modèle Publish/Subscribe

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

  • Publisher: publie un message sur un (ou plusieurs) sujet(s) dans le courtier.
  • Subscriber: s'abonne à un (ou plusieurs) sujet(s) dans le courtier et reçoit tous les messages envoyés par le publisher.
  • Broker: route tous les messages des publishers vers les subscribers.
  • Sujet: est composé d'un ou plusieurs niveaux qui sont séparés par une barre oblique (par exemple, /smartshouse/livingroom/temperature).

Format de paquet

Chaque paquet MQTT contient un en-tête fixe (Figure 02).Figure 02: En-tête fixe

Le premier champ de l'en-tête fixe représente le type du paquet MQTT. Tous les types de paquets sont répertoriés dans le tableau 01.Table 01: Types de paquets MQTT

Shodan

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