hacktricks/network-services-pentesting/1883-pentesting-mqtt-mosquitto.md
2024-02-10 15:36:32 +00:00

8.5 KiB

1883 - Pentesting MQTT (Mosquitto)

Lernen Sie AWS-Hacking von Grund auf mit htARTE (HackTricks AWS Red Team Expert)!

Andere Möglichkeiten, HackTricks zu unterstützen:

Grundlegende Informationen

MQ Telemetry Transport (MQTT) ist ein bekanntes Publish/Subscribe-Messaging-Protokoll, das sich durch seine extreme Einfachheit und Leichtigkeit auszeichnet. Dieses Protokoll ist speziell für Umgebungen entwickelt, in denen Geräte über begrenzte Fähigkeiten verfügen und über Netzwerke arbeiten, die durch geringe Bandbreite, hohe Latenz oder unzuverlässige Verbindungen gekennzeichnet sind. Die Hauptziele von MQTT sind die Minimierung des Netzwerkbandbreitenverbrauchs und die Reduzierung der Anforderungen an Geräteressourcen. Darüber hinaus zielt es darauf ab, eine zuverlässige Kommunikation aufrechtzuerhalten und ein bestimmtes Maß an Zustellgarantie zu bieten. Diese Ziele machen MQTT besonders geeignet für das aufstrebende Feld der Machine-to-Machine (M2M)-Kommunikation und das Internet der Dinge (IoT), wo es wichtig ist, eine Vielzahl von Geräten effizient zu verbinden. Darüber hinaus ist MQTT für mobile Anwendungen äußerst vorteilhaft, wo die Einsparung von Bandbreite und Batterielebensdauer entscheidend ist.

Standardport: 1883

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

Überprüfen des Datenverkehrs

Wenn ein CONNECT-Paket von MQTT-Brokern empfangen wird, wird ein CONNACK-Paket zurückgesendet. Dieses Paket enthält einen Rückgabecode, der entscheidend ist, um den Verbindungsstatus zu verstehen. Ein Rückgabecode von 0x00 bedeutet, dass die Anmeldeinformationen akzeptiert wurden und eine erfolgreiche Verbindung signalisieren. Andererseits signalisiert ein Rückgabecode von 0x05, dass die Anmeldeinformationen ungültig sind und somit die Verbindung verhindert wird.

Wenn beispielsweise der Broker die Verbindung aufgrund ungültiger Anmeldeinformationen ablehnt, würde das Szenario wie folgt aussehen:

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

Brute-Force MQTT

Pentesting MQTT

Die Authentifizierung ist völlig optional und selbst wenn eine Authentifizierung durchgeführt wird, wird standardmäßig keine Verschlüsselung verwendet (Anmeldeinformationen werden im Klartext übertragen). MITM-Angriffe können immer noch durchgeführt werden, um Passwörter zu stehlen.

Um eine Verbindung zu einem MQTT-Dienst herzustellen, können Sie https://github.com/bapowell/python-mqtt-client-shell verwenden und sich selbst für alle Themen abonnieren, indem Sie Folgendes tun:

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

Sie können auch https://github.com/akamai-threat-research/mqtt-pwn verwenden.

Sie können auch verwenden:

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

Oder Sie könnten diesen Code ausführen, um eine Verbindung zu einem MQTT-Dienst ohne Authentifizierung herzustellen, sich für jedes Thema zu abonnieren und sie anzuhören:

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

Weitere Informationen

von hier: https://morphuslabs.com/hacking-the-iot-with-mqtt-8edaf0d07b9b

Das Publish/Subscribe-Muster

Das Publish/Subscribe-Modell besteht aus:

  • Publisher: veröffentlicht eine Nachricht zu einem (oder vielen) Thema(en) im Broker.
  • Subscriber: abonniert ein (oder viele) Thema(en) im Broker und empfängt alle Nachrichten, die vom Publisher gesendet werden.
  • Broker: leitet alle Nachrichten von den Publishern an die Subscriber weiter.
  • Thema: besteht aus einer oder mehreren Ebenen, die durch einen Schrägstrich getrennt sind (z.B. /smartshouse/livingroom/temperature).

Paketformat

Jedes MQTT-Paket enthält einen festen Header (Abbildung 02).Abbildung 02: Fester Header

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

Pakettypen

  • CONNECT (1): Vom Client initiiert, um eine Verbindung zum Server anzufordern.
  • CONNACK (2): Die Bestätigung des Servers für eine erfolgreiche Verbindung.
  • PUBLISH (3): Wird verwendet, um eine Nachricht vom Client an den Server oder umgekehrt zu senden.
  • PUBACK (4): Bestätigung eines PUBLISH-Pakets.
  • PUBREC (5): Teil eines Nachrichtenübermittlungsprotokolls, das sicherstellt, dass die Nachricht empfangen wird.
  • PUBREL (6): Weitere Sicherheit bei der Nachrichtenübermittlung, die eine Nachrichtenfreigabe anzeigt.
  • PUBCOMP (7): Letzter Teil des Nachrichtenübermittlungsprotokolls, der den Abschluss anzeigt.
  • SUBSCRIBE (8): Anforderung eines Clients, Nachrichten von einem Thema zu empfangen.
  • SUBACK (9): Die Bestätigung des Servers für eine SUBSCRIBE-Anforderung.
  • UNSUBSCRIBE (10): Anforderung eines Clients, keine Nachrichten mehr von einem Thema zu empfangen.
  • UNSUBACK (11): Die Antwort des Servers auf eine UNSUBSCRIBE-Anforderung.
  • PINGREQ (12): Eine Heartbeat-Nachricht, die vom Client gesendet wird.
  • PINGRESP (13): Antwort des Servers auf die Heartbeat-Nachricht.
  • DISCONNECT (14): Vom Client initiiert, um die Verbindung zu beenden.
  • Zwei Werte, 0 und 15, sind als reserviert markiert und ihre Verwendung ist verboten.

Shodan

  • port:1883 MQTT
Lernen Sie AWS-Hacking von Null auf Held mit htARTE (HackTricks AWS Red Team Expert)!

Andere Möglichkeiten, HackTricks zu unterstützen: