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
- Check the subscription plans!
- Join the 💬 Discord group or the telegram group or follow us on Twitter 🐦 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.
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
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
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos di github.