1883 - Pentesting MQTT (Mosquitto)

Reading time: 5 minutes

tip

AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE) Azure Hacking'i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin

Temel Bilgiler

MQ Telemetry Transport (MQTT), aşırı basitliği ve hafifliği ile öne çıkan bir yayın/abone mesajlaşma protokolü olarak bilinir. Bu protokol, cihazların sınırlı yeteneklere sahip olduğu ve düşük bant genişliği, yüksek gecikme veya güvenilmez bağlantılarla karakterize edilen ağlar üzerinde çalıştığı ortamlara özel olarak tasarlanmıştır. MQTT'nin temel hedefleri, ağ bant genişliği kullanımını en aza indirmek ve cihaz kaynakları üzerindeki talebi azaltmaktır. Ayrıca, güvenilir iletişimi sürdürmeyi ve belirli bir teslimat güvencesi sağlamayı amaçlar. Bu hedefler, MQTT'yi makineden makineye (M2M) iletişim ve Nesnelerin İnterneti (IoT) alanında son derece uygun hale getirir; burada çok sayıda cihazı verimli bir şekilde bağlamak esastır. Ayrıca, MQTT, bant genişliğini ve pil ömrünü korumanın kritik olduğu mobil uygulamalar için de son derece faydalıdır.

Varsayılan port: 1883

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

Trafiğin İncelenmesi

Bir CONNECT paketi MQTT brokerları tarafından alındığında, bir CONNACK paketi geri gönderilir. Bu paket, bağlantı durumunu anlamak için kritik olan bir dönüş kodu içerir. 0x00 dönüş kodu, kimlik bilgilerin kabul edildiğini, başarılı bir bağlantıyı gösterir. Öte yandan, 0x05 dönüş kodu, kimlik bilgilerin geçersiz olduğunu belirterek bağlantıyı engeller.

Örneğin, broker kimlik bilgilerin geçersiz olması nedeniyle bağlantıyı reddederse, senaryo şöyle görünür:

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

Brute-Force MQTT

Pentesting MQTT

Kimlik doğrulama tamamen isteğe bağlıdır ve kimlik doğrulama gerçekleştiriliyor olsa bile, şifreleme varsayılan olarak kullanılmaz (kimlik bilgileri düz metin olarak gönderilir). MITM saldırıları hala şifreleri çalmak için gerçekleştirilebilir.

Bir MQTT hizmetine bağlanmak için şunları kullanabilirsiniz: https://github.com/bapowell/python-mqtt-client-shell ve tüm konulara abone olmak için:

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

Ayrıca şunu da kullanabilirsiniz:

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.

Ya da kimlik doğrulaması olmadan bir MQTT hizmetine bağlanmayı, her konuya abone olmayı ve dinlemeyi denemek için bu kodu çalıştırabilirsiniz:

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

Yayınlama/Abone Olma Modeli

Yayınlama/abone olma modeli şunlardan oluşur:

  • Yayıncı: broker'daki bir (veya birden fazla) konuya mesaj yayınlar.
  • Abone: broker'daki bir (veya birden fazla) konuya abone olur ve yayıncıdan gönderilen tüm mesajları alır.
  • Broker: tüm mesajları yayıncılardan abonelere yönlendirir.
  • Konu: bir veya daha fazla seviyeden oluşur ve bu seviyeler bir eğik çizgi ile ayrılır (örneğin, /smartshouse/livingroom/temperature).

Paket Formatı

Her MQTT paketi sabit bir başlık içerir (Şekil 02). Şekil 02: Sabit Başlık

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

Paket Türleri

  • CONNECT (1): Sunucuya bağlantı talep etmek için istemci tarafından başlatılır.
  • CONNACK (2): Sunucunun başarılı bir bağlantıyı onaylaması.
  • PUBLISH (3): İstemciden sunucuya veya tam tersi yönde bir mesaj göndermek için kullanılır.
  • PUBACK (4): PUBLISH paketinin onayı.
  • PUBREC (5): Mesajın alındığını garanti eden bir mesaj teslim protokolünün parçası.
  • PUBREL (6): Mesaj tesliminde daha fazla güvence, bir mesajın serbest bırakıldığını belirtir.
  • PUBCOMP (7): Mesaj teslim protokolünün son kısmı, tamamlandığını belirtir.
  • SUBSCRIBE (8): Bir konudan mesaj dinlemek için istemcinin talebi.
  • SUBACK (9): Sunucunun bir SUBSCRIBE talebini onaylaması.
  • UNSUBSCRIBE (10): Bir konudan mesaj almaktan vazgeçmek için istemcinin talebi.
  • UNSUBACK (11): Sunucunun bir UNSUBSCRIBE talebine yanıtı.
  • PINGREQ (12): İstemci tarafından gönderilen bir kalp atışı mesajı.
  • PINGRESP (13): Kalp atışı mesajına sunucunun yanıtı.
  • DISCONNECT (14): Bağlantıyı sonlandırmak için istemci tarafından başlatılır.
  • 0 ve 15 değerleri, ayrılmış olarak işaretlenmiştir ve kullanımları yasaktır.

Shodan

  • port:1883 MQTT

tip

AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE) Azure Hacking'i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin