hacktricks/network-services-pentesting/1883-pentesting-mqtt-mosquitto.md
2024-02-11 01:46:25 +00:00

8 KiB

1883 - Testowanie penetracyjne MQTT (Mosquitto)

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Podstawowe informacje

MQ Telemetry Transport (MQTT) jest znany jako protokół komunikacyjny typu publish/subscribe, który wyróżnia się swoją skrajną prostotą i lekkością. Ten protokół 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ą, wysokim opóźnieniem lub niestabilnymi połączeniami. Głównymi celami MQTT są minimalizacja wykorzystania przepustowości sieciowej i redukcja zapotrzebowania na zasoby urządzenia. Ponadto, ma na celu utrzymanie niezawodnej komunikacji i zapewnienie pewnego poziomu gwarancji dostawy. Te cele sprawiają, że MQTT jest wyjątkowo odpowiedni dla rozwijającej się dziedziny komunikacji maszyna-maszyna (M2M) i Internetu Rzeczy (IoT), gdzie istotne jest efektywne połączenie wielu urządzeń. Ponadto, MQTT jest bardzo korzystny dla aplikacji mobilnych, gdzie oszczędzanie przepustowości i życia baterii jest kluczowe.

Domyślny port: 1883

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

Inspekcja ruchu

Kiedy broker MQTT otrzymuje pakiet CONNECT, wysyłany jest z powrotem pakiet CONNACK. Ten pakiet zawiera kod powrotu, który jest kluczowy dla zrozumienia statusu połączenia. Kod powrotu 0x00 oznacza, że poświadczenia zostały zaakceptowane, co oznacza udane połączenie. Natomiast kod powrotu 0x05 sygnalizuje, że poświadczenia są nieprawidłowe, uniemożliwiając połączenie.

Na przykład, jeśli broker odrzuca połączenie z powodu nieprawidłowych poświadczeń, scenariusz wyglądałby tak:

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

Brute-Force MQTT

Pentesting MQTT

Autoryzacja jest całkowicie opcjonalna, a nawet jeśli jest wykonywana, szyfrowanie nie jest domyślnie używane (dane uwierzytelniające są wysyłane w postaci tekstu jawnego). Ataki MITM nadal mogą być wykonane w celu kradzieży haseł.

Aby połączyć się z usługą MQTT, można użyć: https://github.com/bapowell/python-mqtt-client-shell i zasubskrybować 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 również użyć:

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

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

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

Wzorzec publikuj/subskrybuj

Model publikuj/subskrybuj składa się z:

  • Wydawca: publikuje wiadomość do jednego (lub wielu) tematu/tematów w brokerze.
  • Subskrybent: subskrybuje jeden (lub wiele) tematów w brokerze i otrzymuje wszystkie wiadomości wysłane przez wydawcę.
  • Broker: przekierowuje wszystkie wiadomości od wydawców do subskrybentów.
  • Temat: 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 żądania połączenia z serwerem.
  • CONNACK (2): Potwierdzenie serwera udanego połączenia.
  • PUBLISH (3): Służy do wysyłania wiadomości od klienta do serwera lub odwrotnie.
  • PUBACK (4): Potwierdzenie pakietu PUBLISH.
  • PUBREC (5): Część protokołu dostarczania wiadomości zapewniająca otrzymanie wiadomości.
  • PUBREL (6): Dodatkowe zabezpieczenie dostarczania wiadomości, wskazujące na uwolnienie wiadomości.
  • PUBCOMP (7): Ostateczna część protokołu dostarczania wiadomości, wskazująca na zakończenie.
  • SUBSCRIBE (8): Żądanie klienta o nasłuchiwanie wiadomości z tematu.
  • SUBACK (9): Potwierdzenie serwera żądania SUBSCRIBE.
  • UNSUBSCRIBE (10): Żądanie klienta o zaprzestanie odbierania wiadomości z tematu.
  • UNSUBACK (11): Odpowiedź serwera na żądanie UNSUBSCRIBE.
  • PINGREQ (12): Wiadomość ping wysyłana przez klienta.
  • PINGRESP (13): Odpowiedź serwera na wiadomość ping.
  • DISCONNECT (14): Inicjowany przez klienta w celu zakończenia połączenia.
  • Dwie wartości, 0 i 15, są oznaczone jako zarezerwowane i ich użycie jest zabronione.

Shodan

  • port:1883 MQTT
Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks: