# 1883 - Pentesting MQTT (Mosquitto) {% hint style="success" %} Learn & practice AWS Hacking:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ Learn & practice GCP Hacking: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
Support HackTricks * Check the [**subscription plans**](https://github.com/sponsors/carlospolop)! * **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.** * **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
{% 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" } ``` ![](<../.gitbook/assets/image (976).png>) ### [**Brute-Force MQTT**](../generic-methodologies-and-resources/brute-force.md#mqtt) ## Pentesting MQTT **Η αυθεντικοποίηση είναι εντελώς προαιρετική** και ακόμη και αν πραγματοποιείται αυθεντικοποίηση, **η κρυπτογράφηση δεν χρησιμοποιείται από προεπιλογή** (τα διαπιστευτήρια αποστέλλονται σε καθαρό κείμενο). Οι επιθέσεις MITM μπορούν να εκτελούνται για να κλέψουν κωδικούς πρόσβασης. Για να συνδεθείτε σε μια υπηρεσία MQTT μπορείτε να χρησιμοποιήσετε: [https://github.com/bapowell/python-mqtt-client-shell](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**](https://github.com/akamai-threat-research/mqtt-pwn) Μπορείτε επίσης να χρησιμοποιήσετε: ```bash apt-get install mosquitto mosquitto-clients mosquitto_sub -t 'test/topic' -v #Subscribe to 'test/topic' mosquitto_sub -h -t "#" -v #Subscribe to ALL topics. ``` Ή μπορείτε να **τρέξετε αυτόν τον κώδικα για να προσπαθήσετε να συνδεθείτε σε μια υπηρεσία MQTT χωρίς αυθεντικοποίηση, να εγγραφείτε σε κάθε θέμα και να τα ακούσετε**: ```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/#') 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](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](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)**](https://training.hacktricks.xyz/courses/arte)\ Learn & practice GCP Hacking: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
Support HackTricks * Check the [**subscription plans**](https://github.com/sponsors/carlospolop)! * **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.** * **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
{% endhint %}