1883 - Pentesting MQTT (Mosquitto)

जानें AWS हैकिंग को शून्य से हीरो तक htARTE (HackTricks AWS Red Team Expert) के साथ!

HackTricks का समर्थन करने के अन्य तरीके:

मूल जानकारी

MQ Telemetry Transport (MQTT) को एक प्रकाशित/सब्सक्राइब संदेशन प्रोटोकॉल के रूप में जाना जाता है जो अपनी अत्यधिक सरलता और हल्कापन के लिए प्रसिद्ध है। यह प्रोटोकॉल विशेष रूप से उन वातावरणों के लिए तैयार किया गया है जहां उपकरणों की सीमित क्षमata होती है और जो नेटवर्क द्वारा विशेषित किया गया है जिसमें नेटवर्क बैंडविड्थ का उपयोग कम किया जाता है और उपकरण संसाधनों पर मांग कम होती है। 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"
}

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: स्थिर हेडर

पैकेट प्रकार

  • 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