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

8.1 KiB

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) è conosciuto come un protocollo di messaggistica publish/subscribe che si distingue per la sua estrema semplicità e leggerezza. Questo protocollo è specificamente progettato per ambienti in cui i dispositivi hanno capacità limitate e operano su reti caratterizzate da bassa larghezza di banda, alta latenza o connessioni inaffidabili. Gli obiettivi principali di MQTT includono la minimizzazione dell'uso della larghezza di banda di rete e la riduzione della domanda sulle risorse dei dispositivi. Inoltre, mira a mantenere una comunicazione affidabile e fornire un certo livello di garanzia di consegna. Questi obiettivi rendono MQTT eccezionalmente adatto per il crescente campo della comunicazione macchina-a-macchina (M2M) e dell'Internet delle Cose (IoT), dove è essenziale connettere in modo efficiente una miriade di dispositivi. Inoltre, MQTT è altamente vantaggioso per le applicazioni mobili, dove è cruciale conservare la larghezza di banda e la durata della batteria.

Default port: 1883

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

Ispezionare il traffico

Quando un pacchetto CONNECT viene ricevuto dai broker MQTT, un pacchetto CONNACK viene inviato indietro. Questo pacchetto contiene un codice di ritorno che è cruciale per comprendere lo stato della connessione. Un codice di ritorno di 0x00 significa che le credenziali sono state accettate, indicando una connessione riuscita. D'altra parte, un codice di ritorno di 0x05 segnala che le credenziali non sono valide, impedendo così la connessione.

Ad esempio, se il broker rifiuta la connessione a causa di credenziali non valide, lo scenario apparirebbe in questo modo:

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

Brute-Force MQTT

Pentesting MQTT

L'autenticazione è totalmente opzionale e anche se l'autenticazione viene eseguita, la crittografia non è utilizzata per impostazione predefinita (le credenziali vengono inviate in chiaro). Gli attacchi MITM possono ancora essere eseguiti per rubare le password.

Per connettersi a un servizio MQTT puoi usare: https://github.com/bapowell/python-mqtt-client-shell e iscriverti a tutti gli argomenti facendo:

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

Puoi anche usare https://github.com/akamai-threat-research/mqtt-pwn

Puoi anche usare:

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.

Oppure puoi eseguire questo codice per provare a connetterti a un servizio MQTT senza autenticazione, iscriverti a ogni argomento e ascoltarli:

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

Maggiori informazioni

da qui: https://morphuslabs.com/hacking-the-iot-with-mqtt-8edaf0d07b9b

Il modello Publish/Subscribe

Il modello publish/subscribe è composto da:

  • Publisher: pubblica un messaggio su uno (o più) argomento(i) nel broker.
  • Subscriber: si iscrive a uno (o più) argomento(i) nel broker e riceve tutti i messaggi inviati dal publisher.
  • Broker: instrada tutti i messaggi dai publisher ai subscriber.
  • Topic: consiste in uno o più livelli separati da una barra obliqua (ad es., /smartshouse/livingroom/temperature).

Formato del pacchetto

Ogni pacchetto MQTT contiene un'intestazione fissa (Figura 02). Figura 02: Intestazione fissa

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

Tipi di pacchetto

  • CONNECT (1): Iniziato dal client per richiedere una connessione al server.
  • CONNACK (2): L'accettazione del server di una connessione riuscita.
  • PUBLISH (3): Utilizzato per inviare un messaggio dal client al server o viceversa.
  • PUBACK (4): Accettazione di un pacchetto PUBLISH.
  • PUBREC (5): Parte di un protocollo di consegna dei messaggi che garantisce che il messaggio sia ricevuto.
  • PUBREL (6): Ulteriore garanzia nella consegna del messaggio, indicando un rilascio del messaggio.
  • PUBCOMP (7): Parte finale del protocollo di consegna dei messaggi, che indica il completamento.
  • SUBSCRIBE (8): Richiesta di un client per ascoltare i messaggi da un argomento.
  • SUBACK (9): L'accettazione del server di una richiesta SUBSCRIBE.
  • UNSUBSCRIBE (10): Richiesta di un client per smettere di ricevere messaggi da un argomento.
  • UNSUBACK (11): La risposta del server a una richiesta UNSUBSCRIBE.
  • PINGREQ (12): Un messaggio di heartbeat inviato dal client.
  • PINGRESP (13): Risposta del server al messaggio di heartbeat.
  • DISCONNECT (14): Iniziato dal client per terminare la connessione.
  • Due valori, 0 e 15, sono contrassegnati come riservati e il loro utilizzo è vietato.

Shodan

  • port:1883 MQTT

{% hint style="success" %} Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)

Supporta HackTricks
{% endhint %}