
वायरलेस प्रेजेंटेशन क्लिकर में कीस्ट्रोक इंजेक्शन भेद्यताएं
मुझे कुछ RF रिवर्स-इंजीनियरिंग करने का मन था, इसलिए मैंने कुछ प्रेजेंटेशन क्लिकर मंगवाए और थोड़ा मज़ा किया।
यह nrf-research-firmware का एक फोर्क है (जिसे मैंने कुछ साल पहले Bastille में लिखा था)। मैंने कुछ नए ट्रांसीवर/प्रोटोकॉल के लिए समर्थन जोड़ा है, और 13 सामान्य प्रेजेंटेशन क्लिकर के लिए कीस्ट्रोक इंजेक्शन POC शामिल किए हैं।
| विक्रेता | मॉडल | प्रोटोकॉल | RFIC | जोड़ा गया |
|---|---|---|---|---|
| AmazonBasics | P-001 | AmazonBasics P-001 | nRF24 | 2019-04-20 |
| Canon | PR100-R | Canon PR100-R | PL1167 | 2019-04-20 |
| Funpick | Wireless Presenter | HS304 | HS304 | 2019-04-20 |
| AMERTEER | Wireless Presenter | HS304 | HS304 | 2019-04-20 |
| BEBONCOOL | D100 | HS304 | HS304 | 2019-04-20 |
| ESYWEN | Wireless Presenter | HS304 | HS304 | 2019-04-20 |
| Red Star Tech | PR-819 | HS304 | HS304 | 2019-04-20 |
| DinoFire | D06-DF-US | HS304 | HS304 | 2019-04-20 |
| TBBSC | DSIT-60 | TBBSC DSIT-60 | BK2451 | 2019-04-21 |
| Rii | Wireless Presenter | Rii Wireless Presenter | BK2451 | 2019-04-21 |
| Logitech | R400 | Logitech Unencrypted | nRF24 | 2019-04-21 |
| Logitech | R800 | Logitech Unencrypted | nRF24 | 2019-04-21 |
| Logitech | R500 | Logitech Encrypted | nRF24 | 2019-04-21 |
यह मानक एन्क्रिप्टेड Logitech कीबोर्ड प्रोटोकॉल है, जैसा कि R500 में उपयोग होता है। यह "एन्क्रिप्टेड कीस्ट्रोक इंजेक्शन" हमले के प्रति कुछ-हद तक संवेदनशील है, जिसे मैंने MouseJack प्रोजेक्ट के हिस्से के रूप में Logitech Unifying कीबोर्ड के साथ प्रलेखित किया था।
मैं कुछ-हद तक इसलिए कह रहा हूँ, क्योंकि सभी HID स्कैन कोड स्वीकार नहीं किए जाते। विशेष रूप से, 0x04-0x1D (A-Z) को 0x00 से बदल दिया जाता है जब डोंगल पैकेट को होस्ट कंप्यूटर को भेजता है, जिसका अर्थ है कि हम जो चाहें इंजेक्ट कर सकते हैं, जब तक वह अक्षर न हो। दूसरा अपवाद यह है कि ctrl की-कॉर्ड अनुमत हैं, भले ही उनमें अक्षर शामिल हों।
R500 के माध्यम से प्रभावी कीस्ट्रोक इंजेक्शन के लिए थोड़ी रचनात्मकता चाहिए।
मान लीजिए कि लक्ष्य bash सत्र में है। bash में, हम अपने वर्णों को base-8 में एन्कोड कर सकते हैं, उन अक्षरों वाले कमांड्स को एन्कोड कर सकते हैं जिन्हें हम अपने लक्ष्य पर निष्पादित कराना चाहते हैं।
उदाहरण के लिए, ping google.com को $'\160\151\156\147' $'\147\157\157\147\154\145\056\143\157\155' के रूप में एन्कोड किया जाता है। यदि हम इस स्ट्रिंग को bash सत्र में भेजते हैं और फिर enter भेजते हैं, तो ping google.com कमांड लक्ष्य मशीन पर निष्पादित हो जाएगी।
आप अपने Logitech R500 का पता निम्नानुसार nrf24-scanner का उपयोग करके पा सकते हैं:
sudo ./tools/nrf24-scanner.py -c {2..74..3} -l
पैकेट कुछ इस तरह दिखने चाहिए:
[2019-04-21 13:11:52.507] 62 5 85:D1:9D:FE:07 00:40:00:08:B8
[2019-04-21 13:11:52.515] 62 5 85:D1:9D:FE:07 00:40:00:08:B8
[2019-04-21 13:11:52.523] 62 22 85:D1:9D:FE:07 00:D3:4D:6F:B6:1B:E6:05:A2:B4:8B:98:F9:C2:00:00:00:00:00:00:00:81
इंजेक्शन संभव है क्योंकि डोंगल बढ़ते हुए AES काउंटरों को लागू नहीं करता, इसलिए आप पैकेट को रीप्ले कर सकते हैं। OTA भेजा गया पैकेट एक USB HID पेलोड से बना होता है जिसे AES काउंटर मोड में एन्क्रिप्ट किया गया होता है, और फिर काउंटर होता है। जब आप प्रेजेंटेशन क्लिकर पर एक बटन दबाते हैं, तो यह एक key down पैकेट और एक key up पैकेट उत्पन्न करता है। key up पैकेट पूरी तरह 0s होता है, जो हमें साफ और सुव्यवस्थित key material देता है जिसे हम पुनः उपयोग कर सकते हैं, अपने पेलोड के साथ XOR कर सकते हैं, और OTA भेज सकते हैं।
बटन दबाव सुनने, दूसरे (key up) पैकेट को निकालने, और उसे स्वचालित रूप से key-material संदर्भ के रूप में उपयोग करने की प्रक्रिया को स्वचालित करना कठिन नहीं होना चाहिए। लेकिन मैं आलसी हूँ, इसलिए आपको पहले स्वयं एक बटन दबाव देखना होगा, जो इस तरह दिखता है:
[2019-04-21 16:02:56.451] 65 5 85:D1:9D:FE:07 00:40:00:08:B8
[2019-04-21 16:02:56.459] 65 5 85:D1:9D:FE:07 00:40:00:08:B8
[2019-04-21 16:02:56.468] 65 22 85:D1:9D:FE:07 00:D3:E6:7B:35:8C:BB:2C:7D:5B:8B:98:FA:76:00:00:00:00:00:00:00:B9
[2019-04-21 16:02:56.475] 65 5 85:D1:9D:FE:07 00:40:00:08:B8
[2019-04-21 16:02:56.507] 65 5 85:D1:9D:FE:07 00:40:00:08:B8
[2019-04-21 16:02:56.516] 65 22 85:D1:9D:FE:07 00:D3:99:D6:D3:8D:49:25:F5:4D:8B:98:FA:77:00:00:00:00:00:00:00:1A
[2019-04-21 16:02:56.524] 65 5 85:D1:9D:FE:07 00:40:00:08:B8
[2019-04-21 16:02:56.532] 65 5 85:D1:9D:FE:07 00:40:00:08:B8
दूसरा 22-बाइट पैकेट key-up पैकेट है।
पेलोड का अंतिम बाइट हटाएँ, और स्ट्रिंग को logitech.py में कॉपी-पेस्ट करें, KEYUP_REF को बदलते हुए।
(KEYUP_REF को अपडेट किए बिना इसे काम नहीं करना चाहिए, लेकिन यदि यह काम करता है, तो कृपया मुझे बताएं!)
bash ping google.com base-8-एन्कोडेड कीस्ट्रोक अनुक्रम को एक विशिष्ट Logitech R500 डोंगल (पता 85:D1:9D:FE:07) में इंजेक्ट करें:
sudo ./tools/r500-injector.py -l -a 85:D1:9D:FE:07
यह मानक अनएन्क्रिप्टेड Logitech प्रोटोकॉल है, जो R400/R800 द्वारा उपयोग किया जाता है।
आप अपने Logitech R400/R800 का पता निम्नानुसार nrf24-scanner का उपयोग करके पा सकते हैं:
sudo ./tools/nrf24-scanner.py -c {2..74..3} -l
पैकेट कुछ इस तरह दिखने चाहिए:
[2019-04-21 12:58:43.466] 32 0 9D:9E:95:52:07
[2019-04-21 12:58:43.620] 32 10 9D:9E:95:52:07 00:C1:00:00:00:00:00:00:00:3F
परीक्षण कीस्ट्रोक अनुक्रम को एक विशिष्ट Logitech R400/R800 डोंगल (पता 9D:9E:95:52:07) में इंजेक्ट करें:
sudo ./tools/preso-injector.py -l -f logitech -a 9D:9E:95:52:07
Rii Wireless Presenter (गोल-पेन) BK2451 पर आधारित है (जो nRF24 का क्लोन प्रतीत होता है)। यह एक सामान्य प्रोटोकॉल जैसा दिखता है, सहयोगी (sister) डिवाइसों की व्यापकता के आधार पर, इसलिए मैं शायद कुछ और डेटा मिलने के बाद इसे पुनर्वर्गीकृत करूँगा।
यह कार्यात्मक रूप से एक अनएन्क्रिप्टेड वायरलेस कीबोर्ड है, जो कीस्ट्रोक इंजेक्शन के प्रति संवेदनशील है।
Wireless Presenter (गोल-पेन) 250Kb/s nRF24 Enhanced Shockburst (बिना ACK के, ऐसा प्रतीत होता है) और 5-बाइट पता उपयोग करता है। मेरे द्वारा परीक्षण किया गया डिवाइस 2425 MHz पर रुका हुआ देखा गया, लेकिन ऐसा लगता है कि यह किसी प्रकार की आवृत्ति-चंचलता (frequency-agility) योजना का उपयोग करता है। व्यवहार में, कीस्ट्रोक पैकेट भेजने से पहले लक्ष्य चैनल पर कुछ डमी पैकेट भेजना आवश्यक है।
मुझे संदेह है कि कुछ चैनल होपिंग हो रही है, जिसे मैंने चिह्नित नहीं किया है, लेकिन एकल चैनल को लक्षित करना कीस्ट्रोक इंजेक्शन प्रदर्शित करने के लिए पर्याप्त है।