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

9.4 KiB

1883 - Pentesting MQTT (Mosquitto)

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

Altri modi per supportare HackTricks:

WhiteIntel

WhiteIntel è un motore di ricerca alimentato dal dark web che offre funzionalità gratuite per verificare se un'azienda o i suoi clienti sono stati compromessi da malware ruba-informazioni.

Il loro obiettivo principale di WhiteIntel è combattere i takeover di account e gli attacchi ransomware derivanti da malware che rubano informazioni.

Puoi visitare il loro sito web e provare il loro motore gratuitamente su:

{% embed url="https://whiteintel.io" %}


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 è specificamente progettato per ambienti in cui i dispositivi hanno capacità limitate e operano su reti caratterizzate da banda limitata, alta latenza o connessioni non affidabili. Gli obiettivi principali di MQTT includono la minimizzazione dell'uso della larghezza di 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 per il crescente campo della comunicazione tra macchine (M2M) e l'Internet delle cose (IoT), dove è essenziale connettere in modo efficiente una miriade di dispositivi. Inoltre, MQTT è estremamente vantaggioso per le applicazioni mobili, dove è cruciale 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 indietro un pacchetto CONNACK. 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 quindi la connessione.

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

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

Brute-Force MQTT

Pentesting MQTT

L'autenticazione è totalmente facoltativa e anche se viene eseguita l'autenticazione, la crittografia non è utilizzata per impostazione predefinita (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

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 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 di Pubblicazione/Sottoscrizione

Il modello di pubblicazione/sottoscrizione è composto da:

  • Editore: pubblica un messaggio su uno (o più) argomento(i) nel broker.
  • Sottoscrittore: si iscrive a uno (o più) argomento(i) nel broker e riceve tutti i messaggi inviati dall'editore.
  • Broker: instrada tutti i messaggi dagli editori ai sottoscrittori.
  • Argomento: è composto da uno o più livelli separati da una barra (ad esempio, /smartshouse/soggiorno/temperatura).

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): Usato 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 che il messaggio sia ricevuto.
  • PUBREL (6): Ulteriore garanzia nella consegna dei messaggi, indicando un rilascio del 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 argomento.
  • SUBACK (9): Conferma del server di una richiesta di SUBSCRIBE.
  • UNSUBSCRIBE (10): Richiesta di un client di smettere di ricevere messaggi da un argomento.
  • UNSUBACK (11): Risposta del server a una richiesta di UNSUBSCRIBE.
  • PINGREQ (12): Un messaggio di battito inviato dal client.
  • PINGRESP (13): Risposta del server al messaggio di battito.
  • DISCONNECT (14): Iniziato dal client per terminare la connessione.
  • Due valori, 0 e 15, sono contrassegnati come riservati e ne è vietato l'uso.

Shodan

  • port:1883 MQTT

WhiteIntel

WhiteIntel è un motore di ricerca alimentato dal dark web che offre funzionalità gratuite per verificare se un'azienda o i suoi clienti sono stati compromessi da malware ruba-informazioni.

Il loro obiettivo principale è combattere le violazioni degli account e gli attacchi ransomware derivanti da malware che rubano informazioni.

Puoi visitare il loro sito web e provare il loro motore gratuitamente su:

{% embed url="https://whiteintel.io" %}

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

Altri modi per supportare HackTricks: