1883 - Pentesting MQTT (Mosquitto)

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

Основна інформація

MQ Telemetry Transport (MQTT) відомий як протокол обміну повідомленнями типу публікація/підписка, який виділяється своєю надзвичайною простотою та легкістю. Цей протокол спеціально розроблений для середовищ, де пристрої мають обмежені можливості та працюють в мережах, які характеризуються низькою пропускною здатністю, високою затримкою або ненадійними з'єднаннями. Основні цілі MQTT включають мінімізацію використання мережевої пропускної здатності та зменшення навантаження на ресурси пристроїв. Крім того, він спрямований на забезпечення надійного зв'язку та певного рівня гарантії доставки. Ці цілі роблять MQTT винятково підходящим для швидкорозвиваючої галузі машинного-до-машинного (M2M) зв'язку та Інтернету речей (IoT), де важливо ефективно з'єднувати масу пристроїв. Крім того, MQTT є дуже корисним для мобільних додатків, де важливо зберігати пропускну здатність та час роботи батареї.

Порт за замовчуванням: 1883

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

Перевірка трафіку

Коли брокери MQTT отримують пакет CONNECT, вони відправляють назад пакет CONNACK. Цей пакет містить код повернення, який є ключовим для розуміння статусу підключення. Код повернення 0x00 означає, що облікові дані були прийняті, що свідчить про успішне підключення. З іншого боку, код повернення 0x05 сигналізує, що облікові дані недійсні, тим самим перешкоджаючи підключенню.

Наприклад, якщо брокер відхиляє підключення через недійсні облікові дані, сценарій виглядатиме приблизно так:

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

Pentesting MQTT

Аутентифікація цілком необов'язкова і навіть якщо вона виконується, шифрування за замовчуванням не використовується (ідентифікатори надсилаються у відкритому вигляді). Атаки MITM все ще можуть бути виконані для крадіжки паролів.

Для підключення до служби MQTT можна використовувати: https://github.com/bapowell/python-mqtt-client-shell та підписатися на всі теми, виконуючи:

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

Ви також можете скористатися https://github.com/akamai-threat-research/mqtt-pwn

Ви також можете скористатися:

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

Або ви можете виконати цей код, щоб спробувати підключитися до служби MQTT без аутентифікації, підписатися на кожну тему і слухати їх:

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

Додаткова інформація

звідси: https://morphuslabs.com/hacking-the-iot-with-mqtt-8edaf0d07b9b

Шаблон Публікації/Підписки

Модель публікації/підписки складається з:

  • Видавець: публікує повідомлення на одну (або кілька) тем(и) в брокері.

  • Підписник: підписується на одну (або кілька) тем(и) в брокері та отримує всі повідомлення, відправлені від видавця.

  • Брокер: маршрутизує всі повідомлення від видавців до підписників.

  • Тема: складається з одного або кількох рівнів, які розділені косою рискою (наприклад, /smartshouse/livingroom/temperature).

Формат Пакету

Кожен пакет MQTT містить фіксований заголовок (Рисунок 02). Рисунок 02: Фіксований заголовок

Типи Пакетів

  • CONNECT (1): Ініційовано клієнтом для запиту з'єднання з сервером.

  • CONNACK (2): Підтвердження сервера успішного з'єднання.

  • PUBLISH (3): Використовується для відправлення повідомлення від клієнта до сервера або навпаки.

  • PUBACK (4): Підтвердження пакету PUBLISH.

  • PUBREC (5): Частина протоколу доставки повідомлення для забезпечення отримання повідомлення.

  • PUBREL (6): Додаткове підтвердження доставки повідомлення, що вказує на випуск повідомлення.

  • PUBCOMP (7): Заключна частина протоколу доставки повідомлення, що вказує на завершення.

  • SUBSCRIBE (8): Запит клієнта на прослуховування повідомлень з теми.

  • SUBACK (9): Підтвердження сервера запиту SUBSCRIBE.

  • UNSUBSCRIBE (10): Запит клієнта на припинення отримання повідомлень з теми.

  • UNSUBACK (11): Відповідь сервера на запит UNSUBSCRIBE.

  • PINGREQ (12): Повідомлення-серцебиття, відправлене клієнтом.

  • PINGRESP (13): Відповідь сервера на повідомлення-серцебиття.

  • DISCONNECT (14): Ініційовано клієнтом для завершення з'єднання.

  • Два значення, 0 та 15, позначені як зарезервовані, і їх використання заборонено.

Shodan

  • port:1883 MQTT

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

Last updated