
Keystroke injection vulnerabilities in wireless presentation clickers
मुझे कुछ 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 |
यह मानक एन्क्रिप्टेड 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) योजना का उपयोग करता है। व्यवहार में, कीस्ट्रोक पैकेट भेजने से पहले लक्ष्य चैनल पर कुछ डमी पैकेट भेजना आवश्यक है।
मुझे संदेह है कि कुछ चैनल होपिंग हो रही है, जिसे मैंने चिह्नित नहीं किया है, लेकिन एकल चैनल को लक्षित करना कीस्ट्रोक इंजेक्शन प्रदर्शित करने के लिए पर्याप्त है।
आप अपने Wireless Presenter (गोल-पेन) का पता निम्नानुसार nrf24-scanner का उपयोग करके पा सकते हैं:
sudo ./tools/nrf24-scanner.py -c 25 -l -R 250K -A 5
ध्यान दें कि आपका डिवाइस किसी अन्य चैनल पर हो सकता है।
पैकेट कुछ इस तरह दिखने चाहिए:
[2019-04-21 11:50:33.116] 25 3 6D:8C:01:14:25 4B:51:00
[2019-04-21 11:50:33.212] 25 3 6D:8C:01:14:25 4C:00:00
[2019-04-21 11:50:33.522] 25 3 6D:8C:01:14:25 4D:51:00
[2019-04-21 11:50:33.565] 25 3 6D:8C:01:14:25 4E:00:00
परीक्षण कीस्ट्रोक अनुक्रम को एक विशिष्ट Rii डोंगल (पता 6D:8C:01:14:25) में इंजेक्ट करें:
sudo ./tools/preso-injector.py -l -f rii -a 6D:8C:01:14:25
TBBSC DSIT-60 BK2451 पर आधारित है (जो nRF24 का क्लोन प्रतीत होता है)। कुछ स्पष्ट सहयोगी डिवाइस हैं (जैसे यह) जिनका मैंने परीक्षण नहीं किया है। फिलहाल मैं इसे एक अलग प्रोटोकॉल के रूप में वर्गीकृत कर रहा हूँ, लेकिन सहयोगी डिवाइस(ों) का परीक्षण करने के बाद यह संभवतः बदल जाएगा।
यह कार्यात्मक रूप से एक अनएन्क्रिप्टेड वायरलेस कीबोर्ड है, जो कीस्ट्रोक इंजेक्शन के प्रति संवेदनशील है।
DSIT-60 250Kb/s nRF24 Enhanced Shockburst (या कम से कम एक OTA समकक्ष) 3-बाइट पते के साथ उपयोग करता है। मेरे द्वारा परीक्षण किया गया डिवाइस 2406 MHz पर रुका हुआ देखा गया, लेकिन मुझे यकीन नहीं है कि यह किन अन्य चैनलों का उपयोग कर सकता है।
आप अपने DSIT-60 का पता निम्नानुसार nrf24-scanner का उपयोग करके पा सकते हैं:
sudo ./tools/nrf24-scanner.py -c 6 -l -R 250K -A 3
ध्यान दें कि आपका डिवाइस किसी अन्य चैनल पर हो सकता है, या कुछ आवृत्ति-चंचलता पुनःट्यूनिंग हो सकती है जिसे मैंने नहीं देखा है।
पैकेट कुछ इस तरह दिखने चाहिए:
[2019-04-21 10:33:44.264] 6 4 87:02:09 0B:42:00:2B
[2019-04-21 10:33:44.269] 6 4 87:02:09 0B:42:00:2B
[2019-04-21 10:33:52.477] 6 4 87:02:09 01:42:00:28
परीक्षण कीस्ट्रोक अनुक्रम को एक विशिष्ट TBBSC DSIT-60 डोंगल (पता 87:02:09) में इंजेक्ट करें:
sudo ./tools/preso-injector.py -l -f tbbsc -a 87:02:09
यह लगभग निश्चित रूप से एक सामान्य प्रोटोकॉल है, लेकिन मैंने अभी तक किसी भी सहयोगी डिवाइस को नहीं देखा है (जैसे यह)। फिलहाल मैं इसे एक अलग प्रोटोकॉल के रूप में वर्गीकृत कर रहा हूँ, लेकिन सहयोगी डिवाइस(ों) का परीक्षण करने के बाद यह संभवतः बदल जाएगा।
P-001 nRF24 RFIC परिवार पर आधारित है, और कार्यात्मक रूप से एक अनएन्क्रिप्टेड वायरलेस कीबोर्ड है, जो कीस्ट्रोक इंजेक्शन के प्रति संवेदनशील है।
P-001 2Mb/s nRF24 Enhanced Shockburst का उपयोग 5-बाइट पतों के साथ करता है, और चैनल 2402-2476।
आप nrf24-scanner.py का उपयोग करके अपने P-001 का पता पा सकते हैं।
दायाँ तीर दबाने से कुछ इस तरह के पैकेट उत्पन्न होने चाहिए:
[2019-04-20 12:59:13.908] 27 9 44:CB:66:A3:BE 00:00:00:00:00:00:00:00:01
[2019-04-20 12:59:13.909] 27 9 44:CB:66:A3:BE 00:00:00:00:00:00:00:00:01
[2019-04-20 12:59:13.999] 27 9 44:CB:66:A3:BE 00:00:4E:00:00:00:00:00:01
[2019-04-20 12:59:14.120] 27 9 44:CB:66:A3:BE 00:00:00:00:00:00:00:00:01
[2019-04-20 12:59:14.121] 27 9 44:CB:66:A3:BE 00:00:00:00:00:00:00:00:01
[2019-04-20 12:59:14.211] 27 9 44:CB:66:A3:BE 00:00:4E:00:00:00:00:00:01
परीक्षण कीस्ट्रोक अनुक्रम को एक विशिष्ट AmazonBasics P-001 डोंगल (पता 44:CB:66:A3:BE) में इंजेक्ट करें:
sudo ./tools/preso-injector.py -l -f amazon -a 44:CB:66:A3:BE
मुझे यकीन नहीं है कि यह प्रोटोकॉल केवल Canon PR100-R के लिए अद्वितीय है, लेकिन चूंकि यह एकमात्र डिवाइस है जिसे मैंने इस प्रोटोकॉल का उपयोग करते देखा है, इसलिए मैं इसे तब तक अपनी अलग श्रेणी में रख रहा हूँ जब तक डेटा इसके विपरीत सुझाव न दे।
PR100-R PL1167 RFIC और एक अज्ञात MCU पर आधारित है।
PR100-R कार्यात्मक रूप से एक अनएन्क्रिप्टेड वायरलेस कीबोर्ड है, जो कीस्ट्रोक इंजेक्शन के प्रति संवेदनशील है।
PR100-R 1Mb/s FSK प्रोटोकॉल का उपयोग करता है जो 2406 MHz और 2481 MHz के बीच 5MHz अंतराल वाले चैनलों पर कार्य करता है।
पैकेट व्हाइटन किए जाते हैं, और 16-बिट CRC द्वारा सुरक्षित होते हैं।
डोंगल से वापस भेजे गए ACK प्रतीत नहीं होते हैं, इस चेतावनी के साथ कि मैंने केवल इस प्रोटोकॉल को कीस्ट्रोक इंजेक्शन प्रदर्शित करने के लिए पर्याप्त रूप से रिवर्स किया है।
प्रोटोकॉल चैनल चयन के लिए आवृत्ति-चंचलता दृष्टिकोण अपनाता है, और रिमोट द्वारा कुछ पैकेट संचारित करने के बाद डोंगल एक चैनल पर स्थिर हो जाता है। व्यवहार में, कीस्ट्रोक पैकेट संचारित करने से पहले कुछ सेकंड के डमी पैकेट संचारित करना पर्याप्त है।
पैकेट प्रारूप के आधार पर, यह स्पष्ट नहीं है कि यह प्रोटोकॉल एक निश्चित sync word या प्रति-डिवाइस पता उपयोग करता है। मैंने केवल एक इकाई को देखा (उच्च मूल्य-बिंदु के कारण), इसलिए मैं पैकेट प्रारूप को पूरी तरह से सत्यापित नहीं कर सका।
इंजेक्शन स्क्रिप्ट मेरे PR100-R के विरुद्ध काम करती है, लेकिन सामान्य उपयोग के लिए इसे संशोधित करने की आवश्यकता हो सकती है। यदि आपके पास एक और PR100-R है और आप इसे सत्यापित कर सकते हैं, तो कृपया मुझे बताएं!
परीक्षण कीस्ट्रोक अनुक्रम को पास के Canon PR100-R डोंगल में इंजेक्ट करें:
sudo ./tools/preso-injector.py -l -f canon
HS304 प्रेजेंटेशन क्लिकर (या शायद वायरलेस कीबोर्ड/माउस) के लिए एक एप्लिकेशन-विशिष्ट RFIC प्रतीत होता है। यह नाम USB डिवाइस स्ट्रिंग HAS HS304 से आया है, और इस सेट के सभी डिवाइसों के लिए समान था।
RFIC एक बिना चिह्नित SOP-16 पैकेज देखा गया, जिसमें विक्रेताओं के बीच कोई स्पष्ट अंतर नहीं था।
HS304-आधारित डिवाइस कार्यात्मक रूप से अनएन्क्रिप्टेड वायरलेस कीबोर्ड हैं, जो कीस्ट्रोक इंजेक्शन के प्रति संवेदनशील हैं।
HS304 एक 1Mb/s FSK प्रोटोकॉल है जो 2.4GHz ISM बैंड के तीन चैनलों (2407, 2433, 2463) पर कार्य करता है। डोंगल से वापस प्रेजेंटेशन क्लिकर तक भेजे गए ACK प्रतीत नहीं होते हैं, और प्रत्येक पैकेट को तीनों चैनलों में से प्रत्येक पर संचारित करके पैकेट वितरण सुनिश्चित किया जाता है।
व्यवहार में, प्रत्येक पैकेट को एक ही चैनल पर कई बार संचारित करके भी विश्वसनीय पैकेट वितरण प्राप्त किया जा सकता है।
पैकेट व्हाइटन किए जाते हैं, और 16-बिट CRC द्वारा सुरक्षित होते हैं।
कोई एड्रेसिंग या पेयरिंग योजना नहीं है, इसलिए कीस्ट्रोक इंजेक्शन के लिए डिवाइस-खोज की आवश्यकता नहीं होती, हालांकि ACK की कमी डोंगलों की सक्रिय खोज को रोकती है।
परीक्षण कीस्ट्रोक अनुक्रम को पास के HS304 डोंगलों में इंजेक्ट करें:
sudo ./tools/preso-injector.py -l -f hs304
पास के NS304 प्रेजेंटेशन क्लिकर से भेजे गए पैकेट प्राप्त करें और डिकोड करें:
sudo ./tools/preso-scanner.py -l -f hs304
| 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 |