hacktricks/network-services-pentesting/1883-pentesting-mqtt-mosquitto.md

11 KiB
Raw Blame History

1883 - Pentesting MQTT (Mosquitto)

{% hint style="success" %} Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks
{% endhint %}

Basic Information

MQ Telemetry Transport (MQTT) είναι γνωστό ως ένα πρωτόκολλο μηνυμάτων δημοσίευσης/συνδρομής που ξεχωρίζει για την εξαιρετική του απλότητα και ελαφρότητα. Αυτό το πρωτόκολλο έχει σχεδιαστεί ειδικά για περιβάλλοντα όπου οι συσκευές έχουν περιορισμένες δυνατότητες και λειτουργούν σε δίκτυα που χαρακτηρίζονται από χαμηλό εύρος ζώνης, υψηλή καθυστέρηση ή αναξιόπιστες συνδέσεις. Οι βασικοί στόχοι του MQTT περιλαμβάνουν τη μείωση της χρήσης του εύρους ζώνης του δικτύου και τη μείωση της ζήτησης στους πόρους των συσκευών. Επιπλέον, στοχεύει στη διατήρηση αξιόπιστης επικοινωνίας και στην παροχή ενός ορισμένου επιπέδου διασφάλισης παράδοσης. Αυτοί οι στόχοι καθιστούν το MQTT εξαιρετικά κατάλληλο για τον αναπτυσσόμενο τομέα της επικοινωνίας μηχανής προς μηχανή (M2M) και του Διαδικτύου των Πραγμάτων (IoT), όπου είναι απαραίτητο να συνδεθούν αποτελεσματικά πολλές συσκευές. Επιπλέον, το MQTT είναι ιδιαίτερα ωφέλιμο για κινητές εφαρμογές, όπου η εξοικονόμηση εύρους ζώνης και διάρκειας ζωής της μπαταρίας είναι κρίσιμη.

Default port: 1883

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

Inspecting the traffic

Όταν ένα CONNECT πακέτο λαμβάνεται από τους MQTT brokers, ένα CONNACK πακέτο αποστέλλεται πίσω. Αυτό το πακέτο περιέχει έναν κωδικό επιστροφής που είναι κρίσιμος για την κατανόηση της κατάστασης σύνδεσης. Ένας κωδικός επιστροφής 0x00 σημαίνει ότι τα διαπιστευτήρια έχουν γίνει αποδεκτά, υποδηλώνοντας μια επιτυχημένη σύνδεση. Από την άλλη πλευρά, ένας κωδικός επιστροφής 0x05 σηματοδοτεί ότι τα διαπιστευτήρια είναι μη έγκυρα, αποτρέποντας έτσι τη σύνδεση.

Για παράδειγμα, αν ο broker απορρίψει τη σύνδεση λόγω μη έγκυρων διαπιστευτηρίων, το σενάριο θα φαίνεται κάπως έτσι:

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

Brute-Force MQTT

Pentesting MQTT

Η αυθεντικοποίηση είναι εντελώς προαιρετική και ακόμη και αν πραγματοποιείται αυθεντικοποίηση, η κρυπτογράφηση δεν χρησιμοποιείται από προεπιλογή (τα διαπιστευτήρια αποστέλλονται σε καθαρό κείμενο). Οι επιθέσεις MITM μπορούν να εκτελούνται για να κλέψουν κωδικούς πρόσβασης.

Για να συνδεθείτε σε μια υπηρεσία MQTT μπορείτε να χρησιμοποιήσετε: https://github.com/bapowell/python-mqtt-client-shell και να εγγραφείτε σε όλα τα θέματα κάνοντας:

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

Μπορείτε επίσης να χρησιμοποιήσετε https://github.com/akamai-threat-research/mqtt-pwn

Μπορείτε επίσης να χρησιμοποιήσετε:

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.

Ή μπορείτε να τρέξετε αυτόν τον κώδικα για να προσπαθήσετε να συνδεθείτε σε μια υπηρεσία MQTT χωρίς αυθεντικοποίηση, να εγγραφείτε σε κάθε θέμα και να τα ακούσετε:

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

Περισσότερες πληροφορίες

from here: https://morphuslabs.com/hacking-the-iot-with-mqtt-8edaf0d07b9b

Το Μοντέλο Δημοσίευσης/Εγγραφής

Το μοντέλο δημοσίευσης/εγγραφής αποτελείται από:

  • Publisher: δημοσιεύει ένα μήνυμα σε ένα (ή πολλά) θέματα στον broker.
  • Subscriber: εγγράφεται σε ένα (ή πολλά) θέματα στον broker και λαμβάνει όλα τα μηνύματα που αποστέλλονται από τον publisher.
  • Broker: δρομολογεί όλα τα μηνύματα από τους publishers στους subscribers.
  • Topic: αποτελείται από ένα ή περισσότερα επίπεδα που χωρίζονται με μια κάθετο (π.χ., /smartshouse/livingroom/temperature).

Μορφή Πακέτου

Κάθε πακέτο MQTT περιέχει μια σταθερή κεφαλίδα (Εικόνα 02).Εικόνα 02: Σταθερή Κεφαλίδα

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

Τύποι Πακέτων

  • CONNECT (1): Ξεκινά από τον πελάτη για να ζητήσει μια σύνδεση με τον διακομιστή.
  • CONNACK (2): Η επιβεβαίωση του διακομιστή για μια επιτυχημένη σύνδεση.
  • PUBLISH (3): Χρησιμοποιείται για να στείλει ένα μήνυμα από τον πελάτη στον διακομιστή ή το αντίστροφο.
  • PUBACK (4): Επιβεβαίωση ενός πακέτου PUBLISH.
  • PUBREC (5): Μέρος ενός πρωτοκόλλου παράδοσης μηνυμάτων που διασφαλίζει ότι το μήνυμα έχει ληφθεί.
  • PUBREL (6): Περαιτέρω διασφάλιση στην παράδοση μηνυμάτων, υποδεικνύοντας την απελευθέρωση ενός μηνύματος.
  • PUBCOMP (7): Τελικό μέρος του πρωτοκόλλου παράδοσης μηνυμάτων, υποδεικνύοντας την ολοκλήρωση.
  • SUBSCRIBE (8): Αίτημα ενός πελάτη να ακούσει μηνύματα από ένα θέμα.
  • SUBACK (9): Η επιβεβαίωση του διακομιστή για ένα αίτημα SUBSCRIBE.
  • UNSUBSCRIBE (10): Αίτημα ενός πελάτη να σταματήσει να λαμβάνει μηνύματα από ένα θέμα.
  • UNSUBACK (11): Η απάντηση του διακομιστή σε ένα αίτημα UNSUBSCRIBE.
  • PINGREQ (12): Ένα μήνυμα καρδιοχτύπι που αποστέλλεται από τον πελάτη.
  • PINGRESP (13): Η απάντηση του διακομιστή στο μήνυμα καρδιοχτύπι.
  • DISCONNECT (14): Ξεκινά από τον πελάτη για να τερματίσει τη σύνδεση.
  • Δύο τιμές, 0 και 15, είναι επισημασμένες ως κρατημένες και η χρήση τους απαγορεύεται.

Shodan

  • port:1883 MQTT

{% hint style="success" %} Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks
{% endhint %}