पोस्ट पर वापस
शोध संग्रह

mDNS के माध्यम से OpenClaw गेटवे का पता लगाना

JavaScript-प्रोटोकॉल Nuclei टेम्पलेट के साथ mDNS सेवा विज्ञापनों को सुनकर OpenClaw, Clawdbot और Moltbot गेटवे एक्सपोज़र का पता लगाना।

openclawnucleiexposuremdnsudpdetectionai-security

OpenClaw का समय आ गया है। यह स्वायत्त AI एजेंट — जिसे आप Clawdbot या Moltbot के नाम से भी जानते होंगे, यह इस बात पर निर्भर करता है कि आप इससे पहली बार कब मिले — पिछले कुछ हफ्तों में GitHub चार्ट में तेजी से ऊपर चढ़ा है, और लोग हर जगह इसके इंस्टेंस तैनात कर रहे हैं। पिछले हफ्ते से यह अपने पहले वास्तविक सुरक्षा संकट से भी गुजर रहा है: CVE-2026-25253 सामने आया — एक 1-क्लिक RCE — और पैच केवल कुछ दिन बाद आया। अगर आप इन्हें चलाते हैं, या किसी ऐसे नेटवर्क के लिए जिम्मेदार हैं जहाँ कोई ऐसा कर सकता है, तो अभी यह पता लगाने का समय है कि ये कहाँ हैं।

त्वरित पृष्ठभूमि

OpenClaw LLMs (Claude, GPT-4, Google के मॉडल) को आपकी मशीन और एक असली ब्राउज़र से जोड़ता है, और एक एजेंट को आपकी ओर से काम करने देता है — Telegram/Slack पर चैट करना, वेब कार्य करना, कमांड चलाना। इस टेम्पलेट जिस घटक की परवाह है वह है गेटवे सेवा, जो पोर्ट 5353/UDP पर मल्टीकास्ट DNS (mDNS) के जरिए स्थानीय खोज के लिए खुद को विज्ञापित करती है।

एक नामकरण नोट, क्योंकि मैचर्स इस पर निर्भर करते हैं: प्रोजेक्ट अब OpenClaw है, लेकिन यह Clawdbot के रूप में शिप हुआ था और इससे पहले Moltbot के रूप में — एक ही कोडबेस, और mDNS सर्विस नामों में अभी भी पुराना ब्रांडिंग है (_clawdbot-gw, _openclaw-gw)। टेम्पलेट दोनों पर मैच करता है ताकि नाम बदलने से यह अंधा न हो।

टेम्पलेट

id: openclaw-exposure
info:
  name: Openclaw (formerly Clawdbot / Moltbot) - Detect
  author: rxerium
  severity: info
  description: |
    Clawdbot Gateway service was detected exposing configuration information via mDNS including DNS settings, gateway details, and service configuration.
  classification:
    cwe-id: CWE-200
  metadata:
    verified: true
    max-request: 1
    shodan-query: product:openclaw
    fofa-query: body="ClawdBot"
  tags: network,openclaw,gateway,exposure,udp,mdns,js,discovery
javascript:
  - pre-condition: |
      isUDPPortOpen(Host,Port);
    code: |
      let c = require("nuclei/net");
      let conn = c.Open('udp', `${Host}:${Port}`);
      // mDNS query for _clawdbot-gw._tcp.local PTR record
      let packet = "000000000001000000000000095f7365727669636573075f646e732d7364045f756470056c6f63616c00000c0001"
      conn.SendHex(packet);
      let resp = conn.RecvString(2048);
      resp;
    args:
      Host: "{{Host}}"
      Port: 5353
    matchers:
      - type: dsl
        dsl:
          - "contains(response, '_openclaw-gw') && success == true"
          - "contains(response, 'clawdbot') && success == true"
        condition: or
    extractors:
      - type: regex
        part: response
        name: server
        group: 1
        regex:
          - 'displayName=([a-zA-Z0-9._-]+)'

यह कैसे काम करता है

यह HTTP नहीं, JavaScript-प्रोटोकॉल टेम्पलेट है। अधिकांश एक्सपोज़र टेम्पलेट GET भेजते हैं और रिस्पॉन्स बॉडी से मैच करते हैं। यह Nuclei की nuclei/net लाइब्रेरी का उपयोग करके एक रॉ सॉकेट खोलता है और सीधे बाइनरी प्रोटोकॉल में बात करता है — आवश्यक है, क्योंकि mDNS को HTTP मैचर्स से व्यक्त नहीं किया जा सकता।

प्री-कंडीशन पूरी प्रक्रिया को नियंत्रित करती है। isUDPPortOpen(Host, Port) यह जाँचता है कि कोई पैकेट जाने से पहले 5353/UDP वास्तव में सुन रहा है। अगर यह बंद है, तो टेम्पलेट शॉर्ट-सर्किट होता है और आप एक रिक्वेस्ट खर्च नहीं करते — जो स्कैन को सस्ता रखता है जब आप इसे एक बड़े रेंज की ओर इंगित करते हैं जहाँ अधिकांश होस्ट गेटवे नहीं चला रहे होंगे।

कोड एक रॉ mDNS क्वेरी भेजता है और रिप्लाई पढ़ता है। यह Host:5353 से UDP कनेक्शन खोलता है, SendHex के साथ hex-एन्कोडेड DNS पैकेट भेजता है, और 2048 बाइट तक वापस पढ़ता है। डीकोड किया गया पेलोड DNS-SD सर्विस-एन्युमेरेशन क्वेरी है — _services._dns-sd._udp.local के लिए PTR प्रश्न, मानक "आप जो भी विज्ञापित करते हैं उसे सूचीबद्ध करें" मेटा-क्वेरी। गेटवे चलाने वाला होस्ट अपनी विज्ञापित सेवाओं के साथ जवाब देता है, और OpenClaw/Clawdbot सेवा नाम उस रिस्पॉन्स में वापस आता है।

मैचर्स पुष्टि करते हैं कि यह एक गेटवे है। दो DSL चेक, or-संयुक्त: contains(response, '_openclaw-gw') या contains(response, 'clawdbot'), प्रत्येक success == true पर गेटेड है ताकि हाफ-ओपन सॉकेट या खाली रीड फॉल्स पॉज़िटिव न दे। mDNS रिप्लाई में किसी भी स्ट्रिंग की पुष्टि करती है कि आप एक OpenClaw गेटवे देख रहे हैं, चाहे वह किसी भी ब्रांडिंग को ले जाए।

एक्सट्रैक्टर डिवाइस का डिस्प्ले नाम निकालता है। एक रेगेक्स विज्ञापन से displayName=... पकड़ता है और इसे आपके आउटपुट में server के रूप में प्रस्तुत करता है। तो एक हिट केवल "एक गेटवे मौजूद है" नहीं है — आपको मानव-पठनीय नाम मिलता है जो ऑपरेटर ने इसे दिया था, जो इन्वेंटरी और ट्रायज के लिए सोना है।

सेवेरिटी info, CWE-200 है। यह ईमानदार वर्गीकरण है: टेम्पलेट एक जानकारी की एक्सपोज़र (CWE-200, Information Exposure) का पता लगाता है — एक गेटवे जो अपनी कॉन्फ़िगरेशन विज्ञापित कर रहा है जहाँ उसे नहीं करना चाहिए — सक्रिय शोषण नहीं। mDNS जो एक पहुँचने योग्य इंटरफ़ेस पर लीक होता है वह खोज है; एक हमलावर आगे क्या करता है वह एक अलग समस्या है।

verified: true का मतलब है कि टेम्पलेट को केवल स्पेक के अनुसार लिखा नहीं गया बल्कि एक वास्तविक इंस्टेंस के खिलाफ पुष्टि की गई है — इसलिए एक मैच भरोसेमंद है।

mDNS डिटेक्शन क्यों होना चाहिए

HTTP फिंगरप्रिंटिंग इन्हें खोजने का स्पष्ट तरीका है, और यह काम करता है। लेकिन mDNS एक अलग हिस्सा पकड़ता है। एक गेटवे सर्विस डिस्कवरी को एक नेटवर्क सेगमेंट पर लीक कर सकता है जिस तक एक हमलावर पहुँच सकता है, भले ही HTTP पक्ष फायरवॉल्ड हो, प्रॉक्सी के पीछे हो, या किसी गैर-मानक पोर्ट पर हो जिसे आपके HTTP स्कैन ने कवर नहीं किया। यह विशेष रूप से आंतरिक आकलन और फ्लैट नेटवर्क के लिए प्रासंगिक है, जहाँ मल्टीकास्ट सेगमेंट को खुशी से पार करता है जहाँ उसे नहीं करना चाहिए और गेटवे प्रभावी रूप से वायर पर सब कुछ को "मैं यहाँ हूँ, और यह मेरा नाम है" की घोषणा कर रहा है। इसे HTTP फिंगरप्रिंट के साथ चलाएँ और आपको वह कवरेज मिलती है जो दोनों में से किसी के पास अकेले नहीं है।

बड़े पैमाने पर चलाना

पहले अपने स्वयं के नेटवर्क और परिधि — सबसे साफ प्राधिकरण, और mDNS खोजें उन नेटवर्क के अंदर सबसे अधिक क्रियाशील हैं जिन्हें आप नियंत्रित करते हैं।

nuclei -t openclaw-exposure.yaml -l targets.txt -o openclaw-hits.txt

टेम्पलेट पहले से ही अपने args में पोर्ट 5353 को पिन करता है, और isUDPPortOpen प्री-कंडीशन का मतलब है कि आप इसे एक विस्तृत होस्ट सूची पर फेंक सकते हैं बिना कुछ हैमर किए — बंद पोर्ट एक पैकेट भेजने से पहले स्किप हो जाते हैं।

बड़े रेंज के लिए UDP स्कैन से पूर्व-फ़िल्टर करें। UDP स्कैनिंग TCP से धीमी है, इसलिए बड़े स्कोप पर पहले लाइव 5353 लिस्टनर्स को खोजना और केवल उन्हें Nuclei को पास करना उचित है:

# naabu doesn't do UDP; use nmap for the 5353/udp sweep
nmap -sU -p 5353 --open -iL ranges.txt -oG - | awk '/Up$/{print $2}' > mdns-hosts.txt
nuclei -t openclaw-exposure.yaml -l mdns-hosts.txt -o openclaw-hits.txt

इंटरनेट-व्यापी, स्कैन डेटा पर निर्भर करें। इंटरनेट पर सक्रिय रूप से UDP ब्लास्ट न करें — यह शोरगुल भरा, धीमा और कानूनी रूप से जटिल है। टेम्पलेट में बेक किए गए metadata क्वेरी का उपयोग करें (Shodan पर product:openclaw, FOFA पर body="ClawdBot") एक्सपोज़्ड इंस्टेंस को एन्युमेरेट करने के लिए, फिर केवल अपने अधिकृत स्कोप में उम्मीदवारों के खिलाफ टेम्पलेट चलाएँ।

इसे निरंतर चलाएँ, एक बार नहीं। OpenClaw का इंस्टॉल बेस अभी प्रतिदिन बढ़ रहा है, जिसका अर्थ है कि हर समय नए गेटवे दिखाई दे रहे हैं — एक बार का स्कैन जल्दी पुराना हो जाता है। और हर हिट के साथ दो कार्यों को जोड़ें: गेटवे को किसी भी पहुँचने योग्य इंटरफ़ेस से हटाएँ, और इसके द्वारा रखे गए क्रेडेंशियल्स को रोटेट करें।

यह क्यों महत्वपूर्ण है

mDNS लीकेज वह खोज है जो टेम्पलेट उत्पन्न करता है, लेकिन अभी परवाह करने का कारण वह है जो एक एक्सपोज़्ड गेटवे के पीछे बैठा है।

टाइमिंग ही कहानी है। CVE-2026-25253 26 जनवरी को प्रकाशित हुआ और OpenClaw 2026.1.29 में पैच हुआ, जो पिछले सप्ताह के अंत में रिलीज़ हुआ। यह एक 1-क्लिक रिमोट कोड एग्जीक्यूशन है: Control UI URL क्वेरी स्ट्रिंग से एक gatewayUrl स्वीकार करती है और बिना पुष्टि के स्वचालित रूप से उसे WebSocket खोलती है, जिससे उस URL को नियंत्रित करने वाले को इंस्टेंस का ऑथ टोकन लीक हो जाता है। टोकन चुराओ, WebSocket हाईजैक करो, कमांड चलाओ। इसे किसी पूर्व प्रमाणीकरण की आवश्यकता नहीं, इसे CVSS 8.8 रेट किया गया है (CWE-669, Incorrect Resource Transfer Between Spheres), और — बुरा हिस्सा — यह केवल localhost पर चलने वाले इंस्टेंस के खिलाफ भी काम करता है, क्योंकि हमला पीड़ित के अपने ब्राउज़र के माध्यम से पिवोट करता है। शोधकर्ता इसे "1-क्लिक RCE किल चेन" कह रहे हैं। प्रूफ-ऑफ-कॉन्सेप्ट कोड पहले से ही सार्वजनिक है, और व्यापक प्रेस कवरेज अभी-अभी आना शुरू हो रही है जैसा कि मैं यह लिख रहा हूँ।

यह तात्कालिक मुद्दा है, लेकिन स्थायी मुद्दा सामान्य रूप से एक्सपोज़र है। OpenClaw उन क्लाउड मॉडलों के लिए क्रेडेंशियल्स संग्रहीत करता है जिन्हें वह चलाता है — Claude, OpenAI, Google AI — साथ ही आपके द्वारा जोड़े गए किसी भी मैसेजिंग और टूलिंग इंटीग्रेशन के लिए टोकन। एक एक्सपोज़्ड गेटवे बिना पासवर्ड के खुला SSH है, सिवाय इसके कि पासवर्ड भुगतान किए गए AI क्रेडेंशियल्स का ढेर और होस्ट पर एक फुटहोल्ड है। और क्योंकि एक एजेंट एक्सेस के साथ एक पहचान है, जो इसे संभालता है वह इसके टोकन और OAuth ग्रांट्स विरासत में लेता है, और इसे वे निर्देश दे सकता है जिन्हें वह बिना सवाल किए करेगा। क्रेडेंशियल्स तात्कालिक पुरस्कार हैं; एक विशेषाधिकार प्राप्त एजेंट के अंदर स्थायी फुटहोल्ड स्थायी है। एक गेटवे जो mDNS पर अपना displayName प्रसारित कर रहा है वह केवल खुद को खोजने में आसान बना रहा है। यही वह अंतर है जिसके लिए यह टेम्पलेट है।

शमन

यदि आप OpenClaw चलाते हैं, इस सप्ताह की करने-योग्य सूची:

  1. अभी पैच करें। 2026.1.29 या बाद के संस्करण में अपडेट करें — यह CVE-2026-25253 को ठीक करता है। पैचिंग पिछले एक्सपोज़र को पूर्ववत नहीं करती, इसलिए इसे पहले चरण के रूप में मानें, पूरे काम के रूप में नहीं।
  2. गेटवे टोकन और हर संग्रहीत क्रेडेंशियल को रोटेट करें। नया authToken, Claude/OpenAI/Google AI के लिए नई API कुंजियाँ, और उपयोग लॉग की जाँच करें। यदि यह पहुँचने योग्य था, मान लें कि यह समझौता किया गया है।
  3. इसे किसी भी पहुँचने योग्य इंटरफ़ेस से हटाएँ। लूपबैक से बाइंड करें, या VPN, बैस्टियन, या ZTNA के पीछे रखें, और सेगमेंट सीमाओं पर 5353/UDP ब्लॉक करें ताकि mDNS उन नेटवर्क को पार करना बंद कर दे जिन पर इसका कोई काम नहीं है। लूपबैक फर्श है, छत नहीं — RCE ब्राउज़र के माध्यम से पिवोट करता है, इसलिए केवल-localhost एक मुफ़्त पास नहीं है।
  4. एजेंट को न्यूनतम विशेषाधिकार के साथ चलाएँ। कोई "गॉड मोड" नहीं। इसके सिस्टम, फ़ाइल और कुंजी एक्सेस को सीमित करें, और इसे किसी भी खाते की तरह मॉनिटर करें जिसमें स्थायी API और OAuth ग्रांट हैं।
  5. एक्सप्लॉइट पैटर्न देखें। ब्राउज़र से बाहरी डोमेन तक अप्रत्याशित WebSocket कनेक्शन को फ़्लैग करें, और गेटवे कॉन्फ़िग परिवर्तनों पर अलर्ट करें।

डिटेक्शन खुद विदेशी नहीं है — एक प्री-कंडीशन, एक रॉ mDNS क्वेरी, दो स्ट्रिंग मैचर्स। मूल्य टाइमिंग है: यह उन गेटवे को पकड़ता है जो नेटवर्क पर खुद को विज्ञापित कर रहे हैं, भले ही HTTP पक्ष लॉक डाउन हो, ठीक उसी समय जब एक सार्वजनिक 1-क्लिक RCE उन्हें ढूँढना जरूरी बनाता है। इसे जल्दी चलाएँ, इसे अक्सर चलाएँ, हर हिट पर कुंजियाँ रोटेट करें। एजेंट रनटाइम कुंजियों के साथ पहचान हैं; उजागर लोगों को जल्दी खोजना ही पूरा खेल है।