
إثبات مفهوم وتقرير يوضح كيفية استرجاع اسم شبكة Wi-Fi وكلمة المرور من مفتاح D-Link Komfy الذكي عبر BLE عن طريق الهندسة العكسية لترميز base64 المخصص في تطبيق iOS.
مقدمة
ستفصّل هذه المقالة اكتشافي على مفتاح Komfy مع الكاميرا من D-Link لاسترجاع اسم شبكة الواي فاي وكلمة المرور المرتبطين بالجهاز عبر بلوتوث 4.0 (BLE). مفتاح Komfy هو منتج أمني وأتمتة منزلية يمكنه أن يحل محل مفتاح حائط في منزلك لتوفير مراقبة بالفيديو، ومراقبة درجة الحرارة، ومستويات الرطوبة، وجودة الهواء، والتحكم عن بُعد في مفاتيح الإضاءة.
توصيف Bluetooth BLE
تم إجراء بعض التوصيف السريع لجهاز BLE باستخدام تطبيق LightBlue لنظام iOS قبل اتخاذ قرار بالتعمق أكثر. في هذه المرحلة، كان جهاز Komfy متصلاً بالإنترنت ومهيأً بإعدادات حالات الاستخدام النموذجية. عند الاتصال بـ Komfy عبر LightBlue، لاحظت خدمة GATT غير قياسية تكشف عن ثماني خصائص مخصصة (أو وظائف). كانت بعض هذه الخصائص تستقبل كمية غير معتادة من البيانات بالنظر إلى أن 20 بايت هو الحد الأقصى وفقًا لمواصفات BLE. إذا كان كلا الجهازين الطرفي والرئيسي يدعمان ذلك، فيمكن التفاوض على MTU أعلى لدعم ما يُشار إليه عادةً بالقراءات أو الكتابات "الطويلة". تُظهر لقطات الشاشة الأولى أدناه خدمات وخصائص GATT (بدءًا من 0xB002 إلى 0xB00A). أما لقطتا الشاشة التاليتان فتعرضان الخاصيتين اللتين ستركز عليهما هذه المقالة (0xB006 و0xB007). عرضت الخاصيتان 0xB006 و0xB007 اسم شبكة الواي فاي وما بدا أنه سلسلة بترميز base64 بعد فك ترميزها إلى ascii. ومع ذلك، فإن فك ترميز السلسلة بـ base64 لم يكشف عن أي بيانات قابلة للقراءة كما هو موضح في لقطة الشاشة الأخيرة.
تطبيق Komfy: تتبع استدعاءات الدوال
لفهم خصائص GATT التي ينفذها جهاز Komfy بشكل أفضل، قمت بتفريغ دوال تطبيق Komfy لنظام iOS باستخدام class-dump-z وإعداد تتبع الدوال للطرق ذات الاهتمام. يمكن الاطلاع على التفريغ الكامل للفئات هنا. كنت مهتمًا بشكل خاص بفئة BLEDevice إلى جانب أي دوال أخرى تشير إلى البلوتوث. يمكن إعداد تتبع الدوال باستخدام سكربت Perl الخاص بـ Logify.pl كما هو موضح بواسطة Prateek هنا.
تُظهر لقطة الشاشة أعلاه مخرجات تتبع الدوال أثناء تثبيت وتهيئة جديدة لـ Komfy. لاحظ كلمة مرور الواي فاي "chipotlemakesmehappy" كنص واضح، ثم تلك السلسلة التي تشبه base64 التي استرجعها تطبيق LightBlue من خاصية GATT 0xB007 التي شوهدت سابقًا. يُظهر التتبع في الواقع استدعاءً للطريقة +[Base64 encode:] مما تسبب في ارتباك في البداية نظرًا لتعذر فك ترميزها باستخدام مكتبة قياسية. تقريبًا تم الحكم بأن القيمة المفكوكة بـ base64 كانت مشفرة أو مُرمزة بشكل إضافي حتى أدركت أن +[Base64 encode:] هي طريقة مطبقة بشكل خاص (وليست من فئة NSData). كان لا بد من التعامل مع هذا الترميز الغريب.
التفكيك باستخدام Hopper
الآن إلى الهندسة العكسية لنظام الترميز "base64" الذي نفذته D-Link (إن "الهندسة العكسية" تجعل الأمر يبدو أصعب بكثير مما كان عليه بالنظر إلى النتيجة النهائية). كان تحميل تطبيق Komfy في Hopper وتحليل الطريقتين -[BLEDevice getWifiPassword:] و+[Base64 decode:] نقطة البداية الواضحة. أكد تحليل -[BLEDevice getWifiPassword:] أن خاصية GATT 0xB007 كانت بالفعل تسترجع كلمة مرور الواي فاي.
عند مراجعة تجميع ARM للطريقة +[Base64 decode:]، بدا مشابهًا جدًا لتنفيذ فئة NSData القياسية، لذا انتقلت لفحص +[Base64 encode:]. سرعان ما أشار Hopper إلى الإجابة. طُبعت سلسلة ثابتة بالقرب من إحدى تعليمات التجميع تضمنت جميع أحرف الأبجدية القياسية لـ base64، ولكن خارج الترتيب تمامًا. ولأنني شعرت ببعض الإحراج لعدم تفكيري في استبدال بسيط لا يزيد صعوبة عن شيفرة قيصر الأصلية، كتبت سكربتًا لفك تشويش أحرف base64، وفويلا! طُبعت "chipotlemakesmehappy" على الشاشة.
إذن، إليك كيفية فك التشويش وفك ترميز base64 للسلسلة:

السكربت الكامل للاستغلال هنا.
ونعم، تشيبوتل تجعلني سعيدًا حقًا.
يمكن تنزيل التقاط Ubertooth لـ BLE هنا.