1883 - Pentesting MQTT (Mosquitto)

Support HackTricks

Basic Information

MQ Telemetry Transport (MQTT) को publish/subscribe messaging protocol के रूप में जाना जाता है, जो अपनी अत्यधिक सरलता और हल्केपन के लिए प्रसिद्ध है। यह प्रोटोकॉल विशेष रूप से उन वातावरणों के लिए तैयार किया गया है जहां उपकरणों की सीमित क्षमताएँ होती हैं और नेटवर्क ऐसे होते हैं जो कम बैंडविड्थ, उच्च विलंबता, या अस्थिर कनेक्शनों की विशेषता रखते हैं। MQTT के मुख्य उद्देश्यों में नेटवर्क बैंडविड्थ के उपयोग को न्यूनतम करना और उपकरण संसाधनों पर मांग को कम करना शामिल है। इसके अतिरिक्त, इसका उद्देश्य विश्वसनीय संचार बनाए रखना और एक निश्चित स्तर की डिलीवरी आश्वासन प्रदान करना है। ये लक्ष्य MQTT को machine-to-machine (M2M) communication और Internet of Things (IoT) के उभरते क्षेत्र के लिए विशेष रूप से उपयुक्त बनाते हैं, जहां कई उपकरणों को कुशलता से जोड़ना आवश्यक है। इसके अलावा, MQTT मोबाइल अनुप्रयोगों के लिए अत्यधिक लाभकारी है, जहां बैंडविड्थ और बैटरी जीवन को बचाना महत्वपूर्ण है।

Default port: 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"
}

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 #Subscribe to 'test/topic'
mosquitto_sub -h <host-ip> -t "#" -v #Subscribe to ALL topics.

या आप यह कोड चला सकते हैं ताकि बिना प्रमाणीकरण के 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: निश्चित हेडर

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

पैकेट प्रकार

  • 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, आरक्षित के रूप में चिह्नित हैं और उनका उपयोग निषिद्ध है।

शोडन

  • port:1883 MQTT

HackTricks का समर्थन करें

Last updated