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) jest znany jako protokół komunikacyjny publish/subscribe, który wyróżnia się ekstremalną prostotą i lekkością. Protokół ten jest specjalnie dostosowany do środowisk, w których urządzenia mają ograniczone możliwości i działają w sieciach charakteryzujących się niską przepustowością, dużą latencją lub niestabilnymi połączeniami. Główne cele MQTT obejmują minimalizację wykorzystania przepustowości sieci oraz zmniejszenie zapotrzebowania na zasoby urządzeń. Dodatkowo, dąży do utrzymania niezawodnej komunikacji i zapewnienia pewnego poziomu gwarancji dostarczenia. Cele te sprawiają, że MQTT jest wyjątkowo odpowiedni dla rozwijającej się dziedziny komunikacji maszyna-do-maszyny (M2M) oraz Internetu Rzeczy (IoT), gdzie kluczowe jest efektywne łączenie wielu urządzeń. Ponadto, MQTT jest bardzo korzystny dla aplikacji mobilnych, gdzie oszczędzanie przepustowości i żywotności baterii jest kluczowe.

Default port: 1883

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

Inspecting the traffic

Kiedy pakiet CONNECT jest odbierany przez brokerów MQTT, pakiet CONNACK jest wysyłany z powrotem. Pakiet ten zawiera kod zwrotny, który jest kluczowy dla zrozumienia statusu połączenia. Kod zwrotny 0x00 oznacza, że dane uwierzytelniające zostały zaakceptowane, co oznacza udane połączenie. Z drugiej strony, kod zwrotny 0x05 sygnalizuje, że dane uwierzytelniające są nieprawidłowe, co uniemożliwia połączenie.

Na przykład, jeśli broker odrzuca połączenie z powodu nieprawidłowych danych uwierzytelniających, scenariusz wyglądałby mniej więcej tak:

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

Brute-Force MQTT

Pentesting MQTT

Uwierzytelnianie jest całkowicie opcjonalne i nawet jeśli uwierzytelnianie jest wykonywane, szyfrowanie nie jest domyślnie używane (dane uwierzytelniające są przesyłane w postaci niezaszyfrowanej). Ataki MITM mogą nadal być przeprowadzane w celu kradzieży haseł.

Aby połączyć się z usługą MQTT, możesz użyć: https://github.com/bapowell/python-mqtt-client-shell i subskrybować się do wszystkich tematów, wykonując:

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

Możesz również użyć https://github.com/akamai-threat-research/mqtt-pwn

Możesz także użyć:

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.

Lub możesz uruchomić ten kod, aby spróbować połączyć się z usługą MQTT bez uwierzytelnienia, subskrybować każdy temat i ich słuchać:

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

Więcej informacji

stąd: https://morphuslabs.com/hacking-the-iot-with-mqtt-8edaf0d07b9b

Wzorzec Publikacja/Subskrypcja

Model publikacja/subskrypcja składa się z:

  • Publisher: publikuje wiadomość do jednego (lub wielu) tematów w brokerze.
  • Subscriber: subskrybuje jeden (lub wiele) tematów w brokerze i otrzymuje wszystkie wiadomości wysyłane przez publishera.
  • Broker: kieruje wszystkimi wiadomościami od publisherów do subskrybentów.
  • Topic: składa się z jednego lub więcej poziomów oddzielonych ukośnikiem (np. /smartshouse/livingroom/temperature).

Format Pakietu

Każdy pakiet MQTT zawiera stały nagłówek (Rysunek 02). Rysunek 02: Stały Nagłówek

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

Typy Pakietów

  • CONNECT (1): Inicjowany przez klienta w celu zażądania połączenia z serwerem.
  • CONNACK (2): Potwierdzenie serwera o udanym połączeniu.
  • PUBLISH (3): Używany do wysyłania wiadomości z klienta do serwera lub odwrotnie.
  • PUBACK (4): Potwierdzenie pakietu PUBLISH.
  • PUBREC (5): Część protokołu dostarczania wiadomości zapewniająca, że wiadomość została odebrana.
  • PUBREL (6): Dalsze zapewnienie w dostarczaniu wiadomości, wskazujące na zwolnienie wiadomości.
  • PUBCOMP (7): Ostatnia część protokołu dostarczania wiadomości, wskazująca na zakończenie.
  • SUBSCRIBE (8): Żądanie klienta do nasłuchiwania wiadomości z tematu.
  • SUBACK (9): Potwierdzenie serwera żądania SUBSCRIBE.
  • UNSUBSCRIBE (10): Żądanie klienta o zaprzestanie otrzymywania wiadomości z tematu.
  • UNSUBACK (11): Odpowiedź serwera na żądanie UNSUBSCRIBE.
  • PINGREQ (12): Wiadomość sygnalizacyjna wysyłana przez klienta.
  • PINGRESP (13): Odpowiedź serwera na wiadomość sygnalizacyjną.
  • DISCONNECT (14): Inicjowany przez klienta w celu zakończenia połączenia.
  • Dwie wartości, 0 i 15, są oznaczone jako zarezerwowane, a ich użycie jest zabronione.

Shodan

  • port:1883 MQTT

{% hint style="success" %} Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)

Wsparcie dla HackTricks
{% endhint %}