hacktricks/network-services-pentesting/1883-pentesting-mqtt-mosquitto.md
2024-02-10 13:03:23 +00:00

8 KiB

1883 - Pentesting MQTT (Mosquitto)

Impara l'hacking di AWS da zero a eroe con htARTE (HackTricks AWS Red Team Expert)!

Altri modi per supportare HackTricks:

Informazioni di base

MQ Telemetry Transport (MQTT) è noto come un protocollo di messaggistica publish/subscribe che si distingue per la sua estrema semplicità e leggerezza. Questo protocollo è appositamente progettato per ambienti in cui i dispositivi hanno capacità limitate e operano su reti caratterizzate da banda ridotta, alta latenza o connessioni non affidabili. Gli obiettivi principali di MQTT includono la riduzione dell'utilizzo della banda di rete e la riduzione della richiesta di risorse del dispositivo. Inoltre, mira a mantenere una comunicazione affidabile e a fornire un certo livello di garanzia di consegna. Questi obiettivi rendono MQTT eccezionalmente adatto al crescente campo della comunicazione machine-to-machine (M2M) e dell'Internet delle cose (IoT), dove è essenziale connettere in modo efficiente una miriade di dispositivi. Inoltre, MQTT è molto vantaggioso per le applicazioni mobili, dove è fondamentale conservare la larghezza di banda e la durata della batteria.

Porta predefinita: 1883

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

Ispezione del traffico

Quando un pacchetto CONNECT viene ricevuto dai broker MQTT, viene inviato un pacchetto CONNACK in risposta. Questo pacchetto contiene un codice di ritorno che è fondamentale 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 indica che le credenziali sono invalide, impedendo così la connessione.

Ad esempio, se il broker rifiuta la connessione a causa di credenziali invalide, lo scenario sarebbe simile a questo:

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

Brute-Force MQTT

Pentesting MQTT

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

Per connettersi a un servizio MQTT puoi utilizzare: 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 utilizzare https://github.com/akamai-threat-research/mqtt-pwn

Puoi anche utilizzare:

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

Oppure puoi eseguire questo codice per provare a connetterti a un servizio MQTT senza autenticazione, iscriverti a tutti gli argomenti 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()

Ulteriori 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ù) topic nel broker.
  • Subscriber: si iscrive a uno (o più) topic nel broker e riceve tutti i messaggi inviati dal publisher.
  • Broker: instrada tutti i messaggi dai publisher ai subscriber.
  • Topic: è composto da uno o più livelli separati da una barra (ad esempio, /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): Conferma del server di una connessione riuscita.
  • PUBLISH (3): Utilizzato per inviare un messaggio dal client al server o viceversa.
  • PUBACK (4): Conferma di un pacchetto PUBLISH.
  • PUBREC (5): Parte di un protocollo di consegna dei messaggi che garantisce la ricezione del messaggio.
  • PUBREL (6): Ulteriore garanzia nella consegna dei messaggi, indicando il rilascio di un messaggio.
  • PUBCOMP (7): Parte finale del protocollo di consegna dei messaggi, indicando il completamento.
  • SUBSCRIBE (8): Richiesta di un client di ascoltare i messaggi da un topic.
  • SUBACK (9): Conferma del server di una richiesta di SUBSCRIBE.
  • UNSUBSCRIBE (10): Richiesta di un client di smettere di ricevere messaggi da un topic.
  • UNSUBACK (11): Risposta del server a una richiesta di UNSUBSCRIBE.
  • PINGREQ (12): 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
Impara l'hacking di AWS da zero a eroe con htARTE (HackTricks AWS Red Team Expert)!

Altri modi per supportare HackTricks: