1883 - Pentesting MQTT (Mosquitto)
Reading time: 5 minutes
tip
AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE)
HackTricks का समर्थन करें
- सदस्यता योजनाएँ देखें!
- हमारे 💬 Discord समूह या टेलीग्राम समूह में शामिल हों या हमारे Twitter 🐦 @hacktricks_live** का पालन करें।**
- हैकिंग ट्रिक्स साझा करें और HackTricks और HackTricks Cloud गिटहब रिपोजिटरी में PRs सबमिट करें।
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
Inspecting the traffic
जब एक CONNECT पैकेट MQTT ब्रोकर द्वारा प्राप्त होता है, तो एक CONNACK पैकेट वापस भेजा जाता है। इस पैकेट में एक रिटर्न कोड होता है जो कनेक्शन स्थिति को समझने के लिए महत्वपूर्ण है। 0x00 का रिटर्न कोड यह दर्शाता है कि क्रेडेंशियल्स को स्वीकार कर लिया गया है, जो सफल कनेक्शन का संकेत है। दूसरी ओर, 0x05 का रिटर्न कोड यह संकेत करता है कि क्रेडेंशियल्स अमान्य हैं, जिससे कनेक्शन को रोक दिया जाता है।
उदाहरण के लिए, यदि ब्रोकर अमान्य क्रेडेंशियल्स के कारण कनेक्शन को अस्वीकार करता है, तो स्थिति कुछ इस तरह दिखेगी:
{
"returnCode": "0x05",
"description": "Connection Refused, not authorized"
}
ब्रूट-फोर्स MQTT
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/#"
आप निम्नलिखित का भी उपयोग कर सकते हैं:
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/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()
अधिक जानकारी
यहां से: 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, आरक्षित के रूप में चिह्नित हैं और उनका उपयोग निषिद्ध है।
शोडन
port:1883 MQTT
tip
AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE)
HackTricks का समर्थन करें
- सदस्यता योजनाएँ देखें!
- हमारे 💬 Discord समूह या टेलीग्राम समूह में शामिल हों या हमारे Twitter 🐦 @hacktricks_live** का पालन करें।**
- हैकिंग ट्रिक्स साझा करें और HackTricks और HackTricks Cloud गिटहब रिपोजिटरी में PRs सबमिट करें।