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:
- Jeśli chcesz zobaczyć swoją firmę reklamowaną w HackTricks lub pobrać HackTricks w formacie PDF, sprawdź PLAN SUBSKRYPCJI!
- Zdobądź oficjalne gadżety PEASS & HackTricks
- Odkryj Rodzinę PEASS, naszą kolekcję ekskluzywnych NFT
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @carlospolopm.
- Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do HackTricks i HackTricks Cloud github repos.
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
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:
- Jeśli chcesz zobaczyć swoją firmę reklamowaną w HackTricks lub pobrać HackTricks w formacie PDF, sprawdź PLAN SUBSKRYPCJI!
- Zdobądź oficjalne gadżety PEASS & HackTricks
- Odkryj Rodzinę PEASS, naszą kolekcję ekskluzywnych NFT
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @carlospolopm.
- Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów GitHub.