hacktricks/network-services-pentesting/1883-pentesting-mqtt-mosquitto.md
2024-02-10 18:14:16 +00:00

8.1 KiB
Raw Blame History

1883 - MQTT (Mosquitto) Pentesting

AWS hackleme becerilerini sıfırdan kahraman seviyesine öğrenmek için htARTE (HackTricks AWS Kırmızı Takım Uzmanı)'ı öğrenin!

HackTricks'ı desteklemenin diğer yolları:

Temel Bilgiler

MQ Telemetry Transport (MQTT), aşırı basitlik ve hafiflik özellikleriyle öne çıkan bir yayın/abonelik mesajlaşma protokolü olarak bilinir. Bu protokol, sınırlı yeteneklere sahip cihazların ve düşük bant genişliği, yüksek gecikme süresi veya güvenilmez bağlantılara sahip ağlarda çalışan cihazların bulunduğu ortamlar için özel olarak tasarlanmıştır. MQTT'nin temel hedefleri arasında ağ bant genişliğinin en aza indirilmesi ve cihaz kaynaklarına olan talebin azaltılması bulunur. Ayrıca, güvenilir iletişimin sürdürülmesi ve belirli bir teslimat güvencesi sağlanması amaçlanır. Bu hedefler, MQTT'yi makine-makine (M2M) iletişimi ve nesnelerin interneti (IoT) alanında son derece uygun hale getirir, burada birçok cihazın verimli bir şekilde bağlanması önemlidir. Ayrıca, MQTT, bant genişliğini ve pil ömrünü korumanın önemli 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

Trafik incelemesi

MQTT brokerlarına bir CONNECT paketi geldiğinde, bir CONNACK paketi geri gönderilir. Bu paket, bağlantı durumunu anlamak için önemli olan bir dönüş kodu içerir. 0x00 dönüş kodu, kimlik bilgilerinin kabul edildiğini ve başarılı bir bağlantıyı gösterir. Öte yandan, 0x05 dönüş kodu, kimlik bilgilerinin geçersiz olduğunu ve dolayısıyla bağlantının engellendiğini belirtir.

Örneğin, broker geçersiz kimlik bilgileri nedeniyle bağlantıyı reddederse, senaryo şu şekilde görünecektir:

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

Brute-Force MQTT

MQTT Pentesting

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

Bir MQTT hizmetine bağlanmak için şunu kullanabilirsiniz: https://github.com/bapowell/python-mqtt-client-shell ve tüm konulara kendinizi abone yapmak 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 https://github.com/akamai-threat-research/mqtt-pwn adresini kullanabilirsiniz.

Ayrıca şunu da kullanabilirsiniz:

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

Ya da bu kodu çalıştırarak kimlik doğrulaması olmadan bir MQTT servisine bağlanmayı deneyebilir, her konuya abone olabilir ve onları dinleyebilirsiniz:

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

Daha Fazla Bilgi

buradan: https://morphuslabs.com/hacking-the-iot-with-mqtt-8edaf0d07b9b

Yayın/Abonelik Modeli

Yayın/abonelik modeli şunlardan oluşur:

  • Yayıncı: mesajı broker'a bir (veya birçok) konuya yayınlar.
  • Abone: broker'da bir (veya birçok) konuya abone olur ve yayıncıdan gönderilen tüm mesajları alır.
  • Broker: yayıncıların mesajlarını abonelere yönlendirir.
  • Konu: bir veya daha fazla seviyeden oluşur ve bir ileri eğik çizgi (/) ile ayrılır (örneğin, /akıllıev/salon/sıcaklık).

Paket Formatı

Her MQTT paketi bir sabit 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): İstemcinin sunucuya bağlantı isteği yapması.
  • CONNACK (2): Başarılı bir bağlantının sunucu tarafından onaylanması.
  • PUBLISH (3): İstemcinin sunucuya veya sunucunun istemciye bir mesaj göndermek için kullanılması.
  • PUBACK (4): Bir PUBLISH paketinin onaylanması.
  • PUBREC (5): Mesajın alındığını sağlayan bir ileti teslim protokolünün bir parçası.
  • PUBREL (6): Mesaj teslimatında daha fazla güvence sağlayan, bir mesajın serbest bırakılmasını gösteren.
  • PUBCOMP (7): İleti teslimat protokolünün son bölümü, tamamlamayı gösteren.
  • SUBSCRIBE (8): Bir istemcinin bir konudan gelen mesajları dinlemek için istekte bulunması.
  • SUBACK (9): SUBSCRIBE isteğinin sunucu tarafından onaylanması.
  • UNSUBSCRIBE (10): Bir istemcinin bir konudan mesaj almamak için istekte bulunması.
  • UNSUBACK (11): UNSUBSCRIBE isteğine sunucunun yanıtı.
  • PINGREQ (12): İstemci tarafından gönderilen bir kalp atışı mesajı.
  • PINGRESP (13): Sunucunun kalp atışı mesajına yanıtı.
  • DISCONNECT (14): İstemcinin bağlantıyı sonlandırmak için başlatması.
  • 0 ve 15 olarak işaretlenen iki değer, rezerve edilmiştir ve kullanımları yasaktır.

Shodan

  • port:1883 MQTT
AWS hacklemeyi sıfırdan kahraman olmak için öğrenin htARTE (HackTricks AWS Red Team Expert)!

HackTricks'ı desteklemenin diğer yolları: